0.0>:需求:列表中每位数加一: a = list(range(10)) print(a) # for i in a: # i = i+1 # print(i) # a = [i+1 for i in a] # print(a) a = [i if i < 5 else i+1 for i in a] print(a)
>:特性:1、想要啥它就会立即产生,取一次,创建一次 2、它只能往前走不能往后退 3、走到最后,没有了,就会报错 它的作用:可以从python2中的rang()和python3中的range()中看出。就像一个公式 ,节省了时间。 python 2 ->range = list xrange = 生成器 python 3 ->range = 生成器 xrange 没有
函数也可以编写生成器: 先加个小插曲:赋值方法:然后写一个斐波那契数列:$$>:在Python中,一边循环一边计算的机制,称为生成器:generator。
让这个数列变成生成器:
上图中。加了yield,函数名加括号,内部代码不执行,只是生成一个生成器对象。
生成器的创建方式:
1、列表 生成 式()#ta最复杂也就是三元式
第一种方法很简单,只要把一个列表生成式的[]
改成(),
就创建了一个generator:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
创建L
和g
的区别仅在于最外层的[]
和()
,L
是一个list,而g
是一个generator。
2、函数yield
>:yeild作用:就是生成器生成一部分,然后暂停去做别的事,最后在继续
>>:next执行出来用next(i)还可以用 i.--next--()来表示
函数有了yield之后:
1.函数名加()就变成了一个生成器
2.return 在生成器里,代表 生成器的终止,直接报错
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
还可通过yield实现在单线程的情况下实现并发运算的效果
#_*_coding:utf-8_*_
__author__ = 'Alex Li'
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer("alex")
通过生成器实现协程并行运算