python/generator

列表生成

L=[]
for x in range(1,11):
    L.append(x*x)
print(L)
#for循环


print([x*x for x in range(1,11)])#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


print([x*x for x in range(1,11) if x%2==0])#[4, 16, 36, 64, 100]

d={'x':'A','y':'B','z':'C'} # 字典
for key,val in d.items():
    print(key,"=",val)
#等价于
print([key+"="+val for key,val in d.items()])

#转小写,检查是否是str
L1 = ['Hello', 'World', 18, 'Apple', None]

print([s.lower() for s in L1 if isinstance(s, str)])

生成器generator

g=(x * x for x in range(10))# g是一个generator()
#gengerator保存的算法,每次调用next(g),计算出g的下一个元素的值,知道没有更多的元素时,抛出StopIteration错误

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

'''
最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
'''

def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
        n =n+1
    return 'done'

for n in fib(6):
        print(n)
'''
1
1
2
3
5
8
'''
#对比
g=fib(6)
while True:
    try:
        x=next(g)
        print('g:',x)
    except StopIteration as e:
        print('generator return value:',e.value)
        break
'''
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8


用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
'''

小结

generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束

感谢廖雪峰老师学习网址

猜你喜欢

转载自blog.csdn.net/awiner/article/details/80560544
今日推荐