生成器
所谓协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方·继续或者重新开始。
def myGen():
print('生成器被执行')
yield 1 #有yield语句就说明是生成器,yield本身相当于return
yield 2
my = myGen()
next(my)
生成器被执行
1
next(my)
2
next(my)
StopIteration
for i in muGen():
print(i)
生成器被执行
1
2
从上面的代码就可以看出生成器的最大作用就是使函数可以保留现场,当下一次执行该函数是从上一次结束的地方开始,而不是重新开始。
def fibs():
a = 0
b = 1
while True:
a,b =b,a+b
yield a
for each in fibs():
if each > 100:
break
print(each,end= ' ')
1 1 2 3 5 8 13 21 34 55 89
python很多容器都有它的推导式,例如:
. 列表推导式
a = [i for i in range(10) if not (i % 2) and i % 3]
print(a)
print(type(a))
[2, 4, 8]
<class 'list'>
. 字典推导式
b = {i : i % 2 == 0 for i in range(10)}
print(b)
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
. 集合推导式
c = {i for i in [1,1,2,3,4,5,5,6,7]}
print(c)
print(type(c))
{1, 2, 3, 4, 5, 6, 7}
<class 'set'>
. 元组推导式
e = (i for i in range(10))
print(e)
print(next(e))
print(next(e))
print(next(e))
<generator object <genexpr> at 0x0000029A64A62048>
0
1
2
问题来啦 generator就是生成器 那元组的推导式就系一个生成器,是不是好神奇!再上一道菜
a = sum((i for i in range(10) if i % 2 ))
print(a)
25
number = [1,5,2]
a = reversed(number)
print(a)
<list_reverseiterator object at 0x0000020DD73CB048>
可以看出reverse(seq)返回的是个逆向的生成器
我们可以写一个跟reversed功能相同的生成器
def new_Reverse(string):
for index in range(len(string)-1,-1,-1):
yield string[index]
a = new_Reverse('fishc')
for i in a:
print(i,end = ' ')
所以生成器就是一个特殊的迭代器,生成后器只需要一个yield语句就行,但它内部会自动创建iter()和next()方法。
网友评论