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()方法可以将上述其他数据类型转换为一个迭代器。

  • 相关阅读:
    [ZOJ 3622] Magic Number
    SGU 134.Centroid(图心)
    SGU 223.Little Kings
    C++ IO 详细用法
    POJ2632 Crashing Robots 解题报告
    POJ1068 Parencodings 解题报告
    POJ3295 Tautology 解题报告
    POJ2586 Y2K Accounting Bug 解题报告
    POJ1328 Radar Installation 解题报告
    POJ3728 The merchant解题报告
  • 原文地址:https://www.cnblogs.com/single-boy/p/7554724.html
Copyright © 2011-2022 走看看