【列表生成式】
例:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
L = ['Hello', 'World', 'IBM', 'Apple']
[s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
例:还可以在循环里使用函数
L1 = ['Hello', 'World', 18, 'Apple', None]
L2=[s.lower() for s in L1 if isinstance(s,str)]
print(L2)
['hello', 'world', 'apple']
1. 列表生成式可以通过将列表生成式的 “ [ ” 、“] ” 改成“()” ,以此来形成一个生成器(generator)。
例:
g = (x * x for x in range(10))
此时的 g 就是一个生成器(generator),生成器保存的是算法,所以可以使用 next(g) 来逐个显示这个生成器的序列,但是更常使用的是 for 循环:“ for n in g:”
2. 生成器也可以有自己的算法。
2.1. 用普通函数构造一个生成器
例:写一个斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
n 负责计数,max 负责输出个数。
将它改造成一个生成器,只需要将 “ print(b) ” 改成 “ yield b ”。如果一个函数里包含 yield ,那这个函数就是一个 generator。我们需要用调用 generator 的方式调用它。
2.2. 另外的例子
generator 和函数的执行流程不一样,函数遇到 return 返回,generator 遇到 yield 返回,再次执行 next() 时,从上次 yield 的部分继续。
例:
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
这个 generator 在执行时:
o = odd()
next(o)
step 1
1
next(o)
step 2
3
next(o)
step 3
5
next(o)
Traceback (most recent call last):
File "", line 1, in
StopIteration
在执行了三次之后,这个generator已经没有继续执行的算法了,所以报错。
2.3. generator 的调用
使用 for 循环迭代 generator 时会报错。
【这部分先搁置,等学到了再补充。】