zoukankan      html  css  js  c++  java
  • Python中生成器和迭代器的功能介绍

                                          生成器和迭代器的功能介绍

    1. 生成器(generator)

    1. 赋值生成器

    1. 创建

    方法:x = (variable for variable in iterable)
    例如:x = (i for i in range(10))
         print(x)
     >>> <generator object <genexpr> at 0x00000000006B85C8>
    返回值:generator
    #使用元祖推导式的时候回变成一个生成器。
    

    2. 调用

    方法:x.__next__()
    返回值:object
    #对应生成器一般使用该种方法调用,当然也可以通过for循环进行遍历。
    

    2. 函数生成器

    函数生成器也是常用的或者常说的生成器,顾名思义就是通过函数来创建的,不过在函数中一定需要使用yield关键字声明。

    1. yield作为返回值

    斐波那契数列:

    1. 常规函数实现

      例如:def fei(max_n):
               n,a,b = 0,0,1
               while n < max_n:
                   print(b)
                   a,b = b,a+b
                   n += 1
               return 'game over'
      #通过一个函数实现斐波那契数列。直接通过fei(num)调用即可打印出结果。                        
      
    2. 生成器实现

      例如:def fei(max_n):
               n,a,b = 0,0,1
               while n < max_n:
                   yield b
                   a,b = b,a+b
                   n += 1
               return 'game over'
      #通过一个生成器斐波那契数列。次数函数执行的结果则为一个生成器,因此调用时需要对函数的执行结果赋值给变量,然后通过__next__()方法进行调用。
      

    2. yield作为接收值

    单线程异步并行

    例如:import time
         def consumer(name):
             print('%s来吃包子了!'%name)
             while True:
                 bao = yield
                 print('包子%s被%s吃了!'%(bao,name))
         def producer():
             zhang = consumer('zhangsan')
             li = consumer('lisi')
             zhang.__next__()
             li.__next__()
             print('包子已经在锅里了!')
             for i in range(1,6,2):
                 j = i+1
                 time.sleep(1)
                 print('包子%s好了!'%i)
                 print('包子%s好了!'%j)
                 zhang.send(i)
                 li.send(j)
         producer()
    #把yield作为接收值,使用send方法把数据传递给yield来执行生成器。     
    

    2. 迭代器(iterator)

    可以通过for循环的对象为可迭代对象,对于数据类型str、list、tuple、dict、set、generator都是可迭代对象,即iterable,其中generator可以使用next()方法进行调用的可迭代对象。对应迭代器的定义为:可以使用next()方法进行调用的可迭代对象即为迭代器。所以生成器就是迭代器的一种。对应上述其他数据类型则只是一个可迭代对象,而不是迭代器,但可以通过iter()方法可以将上述其他数据类型转换为一个迭代器。

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/single-boy/p/7554724.html
Copyright © 2011-2022 走看看