列表生成
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循环随之结束