zoukankan      html  css  js  c++  java
  • 生成器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

    运行结果:

     

  • 相关阅读:
    restful接口设计规范总结
    SSM框架中,配置数据库连接的问题
    Java通过mysql-connector-java-8.0.11连接MySQL Server 8.0遇到的几个问题
    浅谈Spring的PropertyPlaceholderConfigurer
    过滤器与拦截器的区别
    SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
    SpringMVC中使用Interceptor拦截器
    mybatis中模糊查询的使用以及一些细节问题的注意事项
    mybatis generator(MyBatis的逆向工程)
    mybatis-generator生成逆向工程两种方式
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14309552.html
Copyright © 2011-2022 走看看