码迷,mamicode.com
首页 > 编程语言 > 详细

python生成器

时间:2021-01-11 10:47:14      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:code   while   代码执行   while语句   函数   暂停   数列   col   current   

1.生成器

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

两种方式创建生成器

  1. 生成器推导式
  2. yield 关键字

2.生成器推导式方式创建生成器:

  • 与列表推导式类似,只不过生成器推导式使用小括号
# 创建生成器
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)

执行结果:

<generator object <genexpr> at 0x000001AF8E9C9510>
0
2
4
6
8

说明:

  • 获取生成器下一个值得方法是调用next()
  • 实际上是一个迭代器,因此可用for循环获取生成器值

3. yield 关键字创建生成器:

  • 只要在def函数里面看到有 yield 关键字那么就是生成器
def my_g():
    for i in range(3):
        yield i


for i in my_g():
    print(i)

执行结果:

0
1
2

Process finished with exit code 0

说明:

  • 获取下一个值时,会执行for循环到yield这一行,返回yield后面得值,并阻塞在这一行,获取下一个值时继续往下执行
  • 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个StopIteration 异常,表示停止迭代异常
  • for 循环内部自动处理了停止迭代异常,相对于while语句,使用起来更加方便

4.斐波拉契数列(Fibonacci),使用生成器生成

def fibonacci(num):
    a = 0
    b = 1
    # 记录生成fibonacci数字的下标
    current_index = 0
    while current_index < num:
        result = a
        a, b = b, a + b
        current_index += 1
        # 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
        yield result


fib = fibonacci(5)
# 遍历生成的数据
for value in fib:
    print(value)

执行结果:

0
1
1
2
3

Process finished with exit code 0

 

python生成器

标签:code   while   代码执行   while语句   函数   暂停   数列   col   current   

原文地址:https://www.cnblogs.com/liuxuelin/p/14249019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!