Python学习(一)

学习网址:廖雪峰的Python教程

list:

Pytho内置的数据类型列表,list是一种可变有序集合,可以随时添加和删除其中的元素.可添加元素到末尾.

1
2
3
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']

也可以指定索引号,添加到指定位置,

1
2
3
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

删除元素: pop()方法 删除末尾元素,也可指定索引删除指定位置pop(i)

tuple

另外一种有序列表,元组,和list非常相似,但tuple一旦初始化,就不能更改,

代码更安全,能用tuple替代list,就替换掉,

定义一个元素时,例子:

1
2
>>> t = (1,)
>>> t(1,)
条件判断
1
2
3
4
5
6
7
>>>age = 20
>>>if age >= 6:
... print('teenager')
...elif age >= 18:
... print('adult')
...else:
... print('kid')
循环
1
2
3
>>>sum = 0for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
... sum = sum + x
... print(sum)

range()函数:整数序列,包前不包后,range(5) 表示(0,1,2,3,4)

要特别注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。

有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。

dict

Python 内置的词典,极快的查找速度,原因 dict通过索引查找

一个Key对应一个value,如果有多个,后面的话替换掉前面的

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

需要牢记的第一条就是dict的key必须是不可变对象。

set

一组key的集合,不存储value,在set中没有重复的key,无序的无重复的集合

重复元素自动过滤,

add(key)添加元素,remove(key)删除元素

函数

定义函数时,需要确定函数名和参数个数;

如果有必要,可以先对参数的数据类型做检查;

函数体内部可以用return随时返回函数结果;

函数执行完毕也没有return语句时,自动return None。

函数可以同时返回多个值,但其实就是一个tuple。

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

要注意定义可变参数和关键字参数的语法:

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict。

以及调用函数时如何传入可变参数和关键字参数的语法:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过args传入:func((1, 2, 3));

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’: 2})。

使用args和*kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

切片:
1
>>> L = list(range(100))>>> L[0, 1, 2, 3, ..., 99]

前十个数,取法

1
>>> L:10

L[开始位置:结束位置:间隔数],包含开始,不包含结束,每隔 间隔数 取数值

从10开始,每隔5取一个数,到90(不包含90)结束.

1
>>> L[10:90:5]
1
[10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85]
1
2
3
4
5
6
>>> tiangan = '甲乙丙丁戊己庚辛壬癸'
>>> dizhi = '子丑寅卯辰巳午未申酉戌亥'
>>>
>>> jiazi = [tiangan[x % len(tiangan)] + dizhi[x % len(dizhi)] for x in range(60)]
>>>
>>> print(jiazi)
1
['甲子', '乙丑', '丙寅', '丁卯', '戊辰', '己巳', '庚午', '辛未', '壬申', '癸酉', '甲戌', '乙亥', '丙子', '丁丑', '戊寅', '己卯', '庚辰', '辛巳', '壬午', '癸未', '甲申', '乙酉', '丙戌','丁亥', '戊子', '己丑', '庚寅', '辛卯', '壬辰', '癸巳', '甲午', '乙未', '丙申', '丁酉', '戊戌', '己亥', '庚子', '辛丑', '壬寅', '癸卯', '甲辰', '乙巳', '丙午', '丁未', '戊申', '己酉','庚戌', '辛亥', '壬子', '癸丑', '甲寅', '乙卯', '丙辰', '丁巳', '戊午', '己未', '庚申', '辛酉', '壬戌', '癸亥']
map()和reduce().重点

map()函数接收两个参数,一个函数,一个Iterable, map()把函数作用在序列的每个元素上

例如:

代码如下:

1
2
3
4
5
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce的用法:

reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:

1
2
3
4
5
6
>>> from functools import reduce
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
filter()

过滤函数,和map()类似,接收两个函数,一个函数,一个序列,把传入的函数作用于每个元素,返回的是True 或 False,根据返回值判断是否保留元素.

例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

1
2
3
4
>>>def is_odd(n):
... return n % 2 == 1list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果:
[1, 5, 9, 15]

把一个序列中的空字符串删掉,可以这么写:

1
2
3
4
5
>>>def not_empty(s):
... return s and s.strip()
>>>list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果:
['A', 'B', 'C']
装饰器

详细解释:网址

偏函数

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

1
2
3
4
5
6
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

真诚地希望能帮到你!