Python 推导式、迭代器、生成器浅析
Admin
2019-10-25 15:09:45
Python
推导式是一个或多个迭代器快速简洁创建数据结构的一种方法。
列表推导式
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方法的对象则是迭代器。