推导式是一个或多个迭代器快速简洁创建数据结构的一种方法。
列表推导式
number = [i for i in range(1, 10)] # 简单形式
number = [i for i in range(1, 10) if i %2 == 1] # 加上条件判断
number = [(k, v) for k in range(1, 10) for v in range(2, 20)] # 多for嵌套
字典推导式
str = "12345612"
number = { i:str.count(i) for i in str}
集合推导式
number = { i for i in range(1, 10) }
生成器推导式(元组没有推导式,圆括号是用来生成器推导式的)
number = ( i for i in range(1, 10) )
# 生成器转list list(number)
# 生成器只能运行一次, 仅在运行中产生值,不会存储。
生成器
生成器是来创建一个序列对象,可以迭代庞大的序列,且不需要在内存创建和存储。它会记录上次调用的位置,并且返回下一个值。
创建一个比较大的序列,使用生成器推导式代码略长,可以写成生成器函数。
def func(a=0, b=10, s=1):
n = a
while n < b:
yield n
n += s
# func 返回一个生成器对象,可以使用这个生成器进行迭代
>>> func()
<generator object func at 0x10b3a9550>
>>> for i in func():
... i
...
0
1
2
3
4
5
6
7
8
9
使用zip并行迭代
zip()可以对多个序列进行并行迭代
>>> one = {"one", "two", "three"}
>>> two = {"a", "b", "c"}
>>> three = {"1", "2", "3"}
>>> for a,b,c in zip(one, two, three):
... print a,b,c
...
one a 1
three c 3
two b 2
# zip()函数再最短序列用完就会停止,最长的后面无法填充
# zip() 和 dict() 可以得到一个字典
>>> dict(zip(["1","2"], ["a","b"]))
{'1': 'a', '2': 'b'}
迭代器
__iter__的方法返回一个迭代器(iterator),具有next方法,在调用next会返回下一个值,当没有值可以返回时就会引发stopIteration异常。
一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。