• Python迭代器和生成器


    迭代器和生成器都是访问集合元素的一种方式。

    一、迭代器

    迭代器是一个可以记住遍历的位置的对象。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    字符串,列表或元组对象都可用于创建迭代器。

    1、迭代器有两个基本的方法:
    iter() 创建迭代器对象
    next() 输出迭代器的下一个元素

    from collections.abc import Iterator
    
    s = '123'
    it1 = iter(s)
    print(isinstance(it1, Iterator)) #判断一个对象是否迭代器对象,输出:True
    print(next(it1)) #输出:1
    print(next(it1)) #输出:2
    print(next(it1)) #输出:3
    #print(next(it1)) #超出范围会运行报错StopIteration
    
    li = [1,2,3]
    it2 = iter(li)
    print(next(it2)) #输出:1
    print(next(it2)) #输出:2
    print(next(it2)) #输出:3
    
    it3 = iter(li)
    #用list可将迭代器转换为列表
    print(list(it3))

    2、迭代器遍历的两种方式:for、while

    import sys
    
    s = '123'
    it1 = iter(s)
    for i in it1:
        print(i)
    
    
    li = [1,2,3]
    it2 = iter(li)
    while True:
        try:
            print(next(it2))
        except StopIteration:
            sys.exit()

    3、把一个类作为迭代器使用:在类中实现__iter__()与 __next__() 方法

    # 斐波那契数列
    class Fibs:
        def __init__(self):
            self.a = 0
            self.b = 1
        def __next__(self):
            self.a,self.b = self.b, self.a+self.b
            return self.a
        def __iter__(self):
            return self
    
    fibs = Fibs()
    for f in fibs:
        if f > 1000:
            print(f)
            break

    二、生成器

    生成器是一种特殊的迭代器,使用了 yield 的函数被称为生成器,即生成器是一个返回迭代器的函数,只能用于迭代操作。

    1、创建生成器

    # 生成器函数
    def Fibs(n):
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n):
                return
            yield a
            a, b = b, a + b
            counter += 1
    
    
    f = Fibs(6) # f是一个迭代器
    print(next(f))
    print(next(f))
    print(next(f))     #可以用next
    print(f.__next__()) #也可以用__next__
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    '''输出:
    0
    1
    1
    2
    3
    5
    8
    '''
    for f in Fibs(6):
        print(f)
    '''输出:
    0
    1
    1
    2
    3
    5
    8
    '''

    2、生成器表达式

    生成器表达式与列表推导式类似,不同之处是最外层的[]换成(),不立即执行循环,而是返回一个生成器。

    r = (i*2 for i in range(5))
    print(next(r))
    print(next(r))
    print(next(r))
    print(next(r))
    print(next(r))
    '''输出:
    0
    2
    4
    6
    8
    '''
    
    ''' 也可以遍历
    for i in r:
        print(i)
    '''
    
    
    r2 = sum(i*2 for i in range(5))
    print(r2)
    '''输出:
    20
    '''
  • 相关阅读:
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Makefile 自动生成依赖
    比较详细的利用虚拟机对SD卡FAT32+EXT4+Ext4分区图解教程
    STM32F0308开发环境的选择--CooCox CoIDE篇
    linux下包管理命令yum与apt-get以及开发环境配置
    裸机编程与OS环境编程的有关思考
    Eclipse C/C++环境配置
    Linux Eclipse代码提示功能设置(Java & C/C++)
    Linux下高效编写Shell——shell特殊字符汇总
  • 原文地址:https://www.cnblogs.com/gdjlc/p/11457179.html
Copyright © 2020-2023  润新知