生成器yield关键字

 

一、生成器说明

 

二、创建生成器的方法:

 

  1、将之前所学的列表推导式的中括号改为小括号

    a、列表推导式(占用空间)

 

  示例1:

    

nums = [x*2 for x in range(5)]
print(nums)

for num in nums:
    print(num)
View Code

 

运行结果:

 

 

 

 b、生成器

 

  生成器代码示例:

    

nums = (x*2 for x in range(5))
print(nums)

for num in nums:
    print(num)
View Code

 

运行结果:

 

  

 

  2、自定义一个函数,在函数中使用【yield】关键字该函数变为生成器。

 

  斐波那契数列:

 

  a、普通函数(占用空间)

  

def create_num(all_nums):
    a, b = 0, 1
    current_num = 0
    while current_num < all_nums:
        print(a)
        a, b = b, a+b
        current_num += 1


create_num(10)
View Code

 

运行结果:

0

1

1

2

3

5

8

13

21

34

  

 

 b、使用生成器

  

  

3、生成器执行流程:

  a、调用函数后,并且使用for循环对创建的生成器对象进行遍历。

  b、第一次开始执行时,程序走到【yield】关键字处,此时程序会暂停执行

    并把【yield】关键字后面的值返回给for循环的变量num中。

  

  c除了第一次执行时程序是按从头到尾的顺序执行,

    其它次数的执行都是从【yield】关键字处开始执行的。

 

  d、直到生成器中的while循环条件为假时,则取值结束。

   

  示例代码:

 

def create_num(all_nums):
    a, b = 0, 1
    current_num = 0
    while current_num < all_nums:
        yield a
        a, b = b, a+b
        current_num += 1


obj = create_num(10)  # 无结果,创建了一个生成器对象

for num in obj:
    print(num)
View Code

 

运行结果:

 

 

 

三、生成器可以使用【next】方法取出值

  即:yield后面的返回值是什么,则通过【next】函数取出来。

 

  1、示例

    要求:在斐波那契数列中加入打印功能,查看程序的执行流程。

  

def create_num(all_nums):
    print("-----1-----")
    a, b = 0, 1
    current_num = 0
    while current_num < all_nums:
        print("-----2-----")
        yield a
        print("-----3-----")
        a, b = b, a+b
        current_num += 1
        print("-----4-----")


obj = create_num(10)  # 无结果,创建了一个生成器对象

print(next(obj))  # 取第一个值
print(next(obj))  # 取第二个值
View Code

 

运行结果:

 

 

 

 

posted @ 2021-01-21 18:14  御姐玫瑰  阅读(92)  评论(0编辑  收藏  举报
levels of contents