Python中的生成器

一、Ppython中的生成器

1.生成器的介绍

根据程序员制定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生成出来,而是使用一个,再生成一个,可以节约大量的内存。

2.创建生成器的方式

(1)推导式列表

(2)yield关键字

3.生成器推导式

# 创建生成器

my_generator = (i * 2 for i in range(5))

print(my_generator)


# next 可以获取生成器的下一个值

# value = next(my_generator)
# print(value)


# 遍历生成器
for value in my_generator:
    print(value)


运行结果
 at 0x101367048>
0
2
4
6
8

 

说明:

  • next函数可以获取生成器中下一个值
  • for循环遍历生成器对象,可以取出生成器的每一个值

 

4.yield关键字

只要在函数中看到了yield这个关键字那就是生成器

 

def my_generator(n):
    for i in range(n):
        print("开始生成...")
        yield i 
        print("完成一次...")



if __name__ == '__main__':

    g = my_generator(2)


    for i in g :
        print(i)

运行结果:

开始生成...
0
完成一次...
开始生成...
1
完成一次...

说明:

  • 代码执行到yield会暂停,把值返回出去,然后下次启动生成器会在暂停的位置继续往下执行
  • 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出Stoplteration异常,表示停止迭代异常
  • while 循环内部没有处理异常的操作,需要手动添加处理异常操作
  • for循环内部自动处理了停止迭代异常,使用起来更方便,推荐使用

 

3.生成器的使用场景

数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

现在我们使用生成器来实现这个斐波那契数列,每次取值都通过算法来生成下一个数据, 生成器每次调用只生成一个数据,可以节省大量的内存。

def fibo(n):
    a = 0
    b = 1

    # 记录生成fibo数字的下标
    index = 0
    
    while index < n :
        s = a
        a, b = b , a + b

        index += 1
        #代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
        yield s

fibo = fibo(5)

# 遍历生成的数据

for i in fibo:
    print(i)

说明:

  • 生成器是根据算法生成数据的一种机制,每次调用生成器只会生成一个值,可以节省大量内存
  • 生成器的创建有两种方式:(1)生成器推导式(2)yield关键字

你可能感兴趣的:(Python,生成器)