【Python 学习笔记】各种生成器

【列表生成式】

例:

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']


【生成器(generator)】

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 时会报错。

【这部分先搁置,等学到了再补充。】





你可能感兴趣的:(Python)