python高级特性
一、列表生成式
#过滤条件
[x*x for x in range(10) if x %2==0] [0, 4, 16, 36, 64] #两层循环 [m+n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] #if else 必须写在for之前 [x if x%2==0 else -x for x in range(10)] [0, -1, 2, -3, 4, -5, 6, -7, 8, -9]
二、生成器
如果需要一个超级大的列表,那么内存会不够用,此时要用可以利用某种规则推算元素的生成器。
创建生成器只需要将列表生成式的[]改成()即可,然后可以用next()或for循环迭代生成器对象。
另一种方法时在普通函数中使用yeild关键字,将普通函数变成generator函数,调用生成器函数会返回生成器对象。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
三、迭代器
用于for循环的数据类型有:
1.集合类型:list、tuple、dict、set、str等;
2.generator:生成器和带yield的generator function
这些直接用于for循环的对象统称为可迭代对象Iterable,可以用isinstance(*, Iterable)
生成器都是Iterator对象,但list、dict、str虽然是迭代器Iterable,但不是迭代器对象Iterator。
这是因为python的Interator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。