zoukankan      html  css  js  c++  java
  • Python中生成器generator和迭代器Iterator的使用方法

    一、生成器

    1. 生成器的定义

    • 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间

    2. 生成器的创建方式

    • 第一种只要把一个列表生成式的 [ ] 改成 ( )
    ret = (n + 1 for n in range(0,10))
    # 返回值是生成了一个生成器对象<genexpr>储存在16进制的地址中<generator object <genexpr> at 0x7f909f4be150>
    # 如果调用次数超过生成器内值的总数量,会报错
    
    • 第二种方法使用yield创建生成器
    • 只要在一个函数中存在至少一个yield关键字,该函数就不是普通函数,是一个生成器
    • 返回一个对象,需要使用变量接收
    • 生成器可以用for进行遍历得到所有的值
    # 定义一个斐波那契数列的生成器
    def creatnum():
        print('-----start------')
        a,b = 0,1
        for i in range(5):
            print('----1-----')
            # 每次执行函数都会停在此处,并将b值返回
            yield b
            print('----2-----')
            a,b = b,a+b
            print('----3-----')
        print('-----stop-----')
    
    f = creatnum()
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    
    • 打印结果
    -----start------
    ----1-----
    1
    ----2-----
    ----3-----
    ----1-----
    1
    ----2-----
    ----3-----
    ----1-----
    2
    ----2-----
    ----3-----
    ----1-----
    3
    ----2-----
    ----3-----
    ----1-----
    5
    
    

    3. 启动生成器的方法

    • 第一种:
    next(生成器的名称)
    
    • 第二种:
    # 生成器第一次调用时尽量不要使用send,非要使用必须用send(None)
    send()方法
    

    二、迭代器

    1. 可迭代数据类型(具有可迭代功能)

      • 把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)
        例如:列表,元组,字典,集合等数据类型,但他们不是可迭代对象
      • generator(生成器)
        • yield
        • 列表生成器
        • 生成器都是可迭代对象
    2. 如何判断一个对象是不是有可迭代功能

      from collections import Iterator
      # 列表是可迭代的
      result = isinstance([1,2], Iterable)
      print(result)
      # isinstance函数会返回一个bool值 True为可迭代,反之False
      
    3. 将具有迭代功能的数据类型转化为可迭代器

      • 可以被next()调用并不断返回下一个值的对象称之为迭代器Iterator
    4. 迭代器的判断方式

      from collections import Iterator 
      # 列表是可迭代对象
      # isinstance函数会返回一个bool值 True为迭代器,反之False
      result = isinstance([1,2], Iterator)
      print(result)
      
      
    5. 可迭代对象的本质

      • 我们分析对可迭代对象进行迭代使用的过程,发现每迭代一次(即在for...in...中每循环一次)都会返回对象中的下一条数据,一直向后读取数据直到迭代了所有数据后结束。那么,在这个过程中就应该有一个“人”去记录每次访问到了第几条数据,以便每次迭代都可以返回下一条数据。我们把这个能帮助我们进行数据迭代的“人”称为迭代器(Iterator)。

      • 可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

      • 可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.

      • 那么也就是说,一个具备了__iter__方法的对象,就是一个可迭代对象。

      from collections import Iterable
      # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象
      
      
      class MyClass(object):
          # 可迭代对象的本质是,类中是否定义了 __iter__() 方法
          def __iter__(self):
              return self
      
      
      c1 = MyClass()
      # 对象c1不是可迭代对象
      result = isinstance(c1, Iterable)
      print(result)
      
    • 举例说明迭代器本质原理

      比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
      现在我们想要通过for...in...循环来遍历迭代斐波那契数列中的前n个数。那么这个斐波那契数列我们就可以用迭代器来实现,每次迭代都通过数学计算来生成下一个数。

    class Fibonacci():
    
        def __init__(self, num):
            # 通过构造方法,保存num到类的成员属性中
            self.num = num
            # 定义变量保存斐波那契数列前两个值
            self.a = 0
            self.b = 1
    
            # 记录当前的变量值
            self.current_index = 0
    
        def __iter__(self):
            # 返回迭代器,因自身就是迭代器,故可以返回自己
            return self
    
        def __next__(self):
    
            # 判断是否生成完毕
            if self.current_index < self.num:
                # 返回
                result = self.a
    
                # 交换两个变量值
                self.a, self.b = self.b, self.a+self.b
    
                self.current_index += 1
    
                return result
    
            else:
                # 停止迭代
                raise StopIteration
    
    
    if __name__ == '__main__':
        # 创建迭代器
        fib_iterator = Fibonacci(5)
    
        # 使用迭代器,输出斐波那契数列值
        for value in fib_iterator:
            print(value, end=" ")

     

  • 相关阅读:
    位向量法、二进制法枚举子集
    jfinal 下载文件时重命名
    Java程序员开发参考资源
    (二)Hive1.2.2
    (一)Hive1.2.2
    YARN资源调度框架
    MapReduce并行编程模型
    HDFS 分布式文件系统
    Kafka
    观察者模式
  • 原文地址:https://www.cnblogs.com/yanguhung/p/10145767.html
Copyright © 2011-2022 走看看