zoukankan      html  css  js  c++  java
  • Python迭代器与生成器

    1. 迭代器

    迭代是访问集合元素的一种方式。
    迭代器是一个可以记住遍历的位置的对象。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    迭代器有两个基本的方法:iter()next()
    可迭代对象Iterable包括:

    • 列表、元组、字典、集合(set)、字符串
    • 生成器(generator)
    >>> from collections import Iterable
    >>> isinstance([], Iterable) # 判断一个对象是否可迭代
    True
    >>> isinstance({}, Iterable)
    True
    >>> isinstance('abc', Iterable)
    True
    >>> isinstance(100, Iterable)
    False
    
    >>>list=[1,2,3,4]
    >>> it = iter(list)    # 创建迭代器对象
    >>> print (next(it))   # 输出迭代器的下一个元素
    1
    >>> print (next(it))
    2
    

    迭代器对象可以使用常规for语句进行遍历。

    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    	
    # 1 2 3 4 
    

    把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()__next__()

    class MyNumbers:
        def __iter__(self):
            self.a = 1
            return self
     
        def __next__(self):
            if self.a <= 5:
                x = self.a
                self.a += 1
                return x
            else:
                raise StopIteration
     
    myclass = MyNumbers()
    myiter = iter(myclass)
     
    for x in myiter:
        print(x)
    
    # 1
    # 2
    # 3
    # 4
    # 5  
    

    StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。

    2. 生成器

    生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

    2.1 创建生成器的简单方法

    >>> L = [x * x for x in range(6)]
    >>> L
    [0, 1, 4, 9, 16, 25]
    >>> g = (x * x for x in range(6)) # 创建生成器
    >>> g
    <generator object <genexpr> at 0x00000231F9699308>
    
    >>> g = (x * x for x in range(6)) # 创建生成器
    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g)
    9
    >>> next(g)
    16
    >>> next(g)
    25
    >>> next(g)
    Traceback (most recent call last):
      File "<pyshell#7>", line 1, in <module>
        next(g)
    StopIteration
    

    因为生成器(generator)是一个可迭代对象,所以可以使用for循环。

    >>> g = (x * x for x in range(6)) # 创建生成器
    >>> for n in g:
            print(n)
    
    	
    0
    1
    4
    9
    16
    25
    

    2.2 使用函数来实现生成器

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b # 相当于依次执行 a = b 和 b = a + b
            n = n + 1
        return 'done'
    	
    for n in fib(6):
    	print(n)
    
    # 1
    # 1
    # 2
    # 3
    # 5
    # 8	
    

    通过捕获StopIteration错误,在StopIteration的value中拿到生成器的返回值。

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    	
    g = fib(6)
    while True:
    	try:
    		x = next(g)
    		print(x)
    	except StopIteration as e:
    		print('Generator return value:', e.value)
    		break
    
    # 1
    # 1
    # 2
    # 3
    # 5
    # 8
    # Generator return value: done
    

    参考资料:

  • 相关阅读:
    极具创意的专辑封面
    【Linux必知必会】五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
    【Ubuntu技巧】Ubuntu下gedit 打开txt文件乱码的处理方法
    【Linux原理】Linux中硬链接和软链接的区别和联系
    【短语学习】out of the box的含义和翻译
    【Ubuntu技巧】在全新安装的Ubuntu上快速重装软件包
    【论文阅读心得】图像识别中一个常用词的中英文释义——artifact
    【短语学习】狮子那一份the lions share
    【OpenCV学习】摄像头显示、录像、拍照程序
    【Perl学习】学习笔记(持续更新中)
  • 原文地址:https://www.cnblogs.com/gzhjj/p/10661090.html
Copyright © 2011-2022 走看看