迭代器生成器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器生成器相关的知识,希望对你有一定的参考价值。
列表生成式
在认识迭代器生成器之前,我们先来了解一下列表生成式
什么是列表生成式呢?顾名思义,列表生成式可以帮助我们生成一个列表对象
now,现在有一个需求:将斐波那契数列的前十个元素依次存放到一个列表当中
你可能首先会想到这个
def fib(n):# 递归函数,不懂的同学可以访问我的另一篇博客http://www.cnblogs.com/Nathaniel-J/p/7753976.html if n<=1:return n else:return fib(n-1) + fib(n-2) l = [] for i in range(1,11): l.append(fib(i)) print(l)
但有没有想过这个呢?
def fib(n): if n<=1:return n else:return fib(n-1) + fib(n-2) # 装逼青年版--列表生成式 l2 = [fib(x) for x in range(11)] print(l)
这就是列表生成式
1 # 简单一点的版本 2 l3 = [x for x in range(10)] 3 print(l3) 4 5 l3 = [x*x+2 for x in range(10)] 6 print(l3) 7 8 def add(x): 9 return x + x 10 l3 = [add(x) for x in range(10)] 11 print(l3) 12 13 print() 14 print() 15 # 稍微复杂一点的 16 l4 = [x for x in range(10) if x % 2 == 0]# 将10以内能被2整除的返回 17 print(l4) 18 19 l4 = [x for x in range(10) for x in ‘qwertyuiop‘] 20 print(l4) 21 22 l4 = [x + n for x in ‘qwe‘ for n in ‘ab‘] 23 print(l4)
生成器
什么是生成器呢?
我们知道了什么是列表生成式
x = [x for x in range(10)]
现在只需要做一点小小的改动
x1 = (x for x in range(10))
没错,区别就是将外围的【】改成()
不信?打印一下type
print(type(x)) # <class ‘list‘> print(type(x1)) # <class ‘generator‘>
print(x) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 是一个列表
print(x1) # <generator object <genexpr> at 0x1020dbf68> 生成器对象
我们知道,受内存限制,列表之中不可能无限放数据,而且,有时候我们创建了一个包含数万甚至更多元素的列表,可能需要的就只有那么几个而已,这个时候,内存就被极大的浪费了,而生成器就是专为解决此问题的
生成器在内部封装了一个算法,不断循环,每次循环将结果返回(毫无疑问,CPU 的速度是远远高于内存的),而不必将完整的列表创建出来,这样一来,就极大的节省了内存(相对于内存的速度,显然我们更接受 CPU 的速度)
OK, now,生成器对象有了,那么问题来了我需要的那些值呢?
什么?在生成器里?
错了,大错特错,这些值----压根就不存在!
打个比方,生成器就是一个伟大的手工艺人,你需要什么他就能给你做出来什么.怎么做呢?有个函数可以帮你
l3 = (x for x in range(5)) print(l3) print(next(l3),end=‘ ‘) # 通过 next() 函数让生成器把值一个个的生产出来 print(next(l3),end=‘ ‘) print(next(l3),end=‘ ‘) print(next(l3),end=‘ ‘) print(next(l3)) l30 = [x for x in range(5)] for i in l30: print(i,end=‘ ‘)
不过这种方法太过变态,不如换用这种
l3 = (x for x in range(5)) for i in l3: # for 循环后边可以跟任何一个可迭代对象,显然 generator 也是一个可迭代对象 print(i,end=‘ ‘)
而且有一个好处,不同担心StopIteration这个错误
# 斐波那契数列生成器版本 def fib(m): x,y,z = 0,0,1 while x < m: x += 1 y,z = z,y+z yield y for i in fib(9): print(i)
# 通过生成器实现协程并行运算 import time def func1(): print(‘开始运动双手啦‘) time.sleep(0.5) while True: action = yield print(‘现在开始% s手画% s‘ % (action[0],action[1])) def func2(): g = func1() next(g) for i in range(10): print(‘第% s 次运动:两只手都已经准备好啦!‘% ) time.sleep(0.5) g.send([‘左‘,‘圆‘]) g.send([‘右‘,‘方‘]) func2()
迭代器
什么是迭代器?很简单
满足两个条件就是迭代器 1.有iter()方法 2.有next()方法
注意生成器是迭代器,迭代器未必是生成器
以上是关于迭代器生成器的主要内容,如果未能解决你的问题,请参考以下文章
python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明