• 迭代器和生成器


    一、迭代器

    1、可迭代对象——iterable

    (1)判断是否可迭代的方法:

    from collections import Iterable
    print(isinstance('aaa',Iterable)                       #输出结果:True
    print(isinstance(123,Iterable)                         #输出结果:False
    print(isinstance([1,2,3],Iterable)                    #输出结果:True

      常见的可迭代对象有:字符串、列表、元组、字典、集合、文件句柄、range()

    (2)可迭代协议

      包含‘__iter__'方法的数据类型就是可迭代的。输出数据类型所有方法的方式如下:

    #实例:求出两个不同数据类型的方法的不同
    difference=set(dir([1,2,3]))-set(dir(123))          #dir()方法以列表形式列出数据的所有的方法
    print(diffenrence)

    2、迭代器——iterator

    (1)判断迭代器的方法

    from collections import Iterator
    iterator_lst=[1,2,3].__iter__()
    print(isinstance(itertor_lst,Iterator)               #输出结果为:True
    print(isinstance([1,2,3],Iterator)                   #输出结果为:False

    (2)迭代器协议

      迭代器中有'__next__'和'__iter__'方法

    (3)常见迭代器

      a.先天的:文件句柄;b后天的:从可迭代对象转变,格式为:“可迭代对象.__iter__()”

    (4)迭代器取值

    lst_iterator=[1,2,3].__iter__()
    print(lst_iterator.__next__())                        #输出结果为:1
    print(lst_iterator.__next__())                        #输出结果为:2
    print(lst_iterator.__next__())                        #输出结果为:3
    #超过迭代器中的内容就会报错:stopIterator

    (5)优点

      a.能对python数据类型进行遍历,不关心每一个值;b.可以节省空间:惰性计算

    3、二者的区别

    (1)可迭代对象包含迭代器;(2)迭代器=可迭代对象.__iter__();(3)可以对可迭代对象和迭代器进行循环

    二、生成器

    1、定义:生成器就是迭代器,生成器是我们自己写出来的

    2、生成器函数:带有关键字yield/yield from的函数就称为生成器函数

    (1)生成器函数在执行时候只返回一个生成器,不执行生成器函数中的内容

    def generator():
        print(123)
        yield ’aaa‘
    g=generator()
    print(g)   #返回结果:生成器地址<generator object generator at 0x0000023F014D3BA0>

    (2)从生成器中取值

      a.生成器.__next__():生成器函数中有几个yield,就可以取几次

    复制代码
    def generator():
        print(123)
        yield 'aaa'
        print(456)
        yield 'bbb'
    g=generator()
    print(g.__next__())                                   #输出结果:123 aaa
    print(g.__next__())                                   #输出结果:456 bbb
    
    
    
    def generator():
        print(123)
        yield 'aaa'
        print(456)
        yield 'bbb'
    print(generator().__next__())                        #输出结果:123 aaa
    print(generator().__next__())                        #输出结果:123 aaa
    
    注意:前者为创建一个生成器,后者为每次重新创建一个生成器
    复制代码

      b.for循环取值

    复制代码
    #实例1:
    def generator():
        print(123)
        yield 'aaa'
        print(456)
        yield 'bbb'
    g=generator()
    for i in g:
        print(i)
    复制代码
    复制代码
    #实例2:
    def generator():
        for i in range(1,50000):
            yield i
    g=generator()
    for j in g:
        print(j)
        if j==555:
            break
    复制代码

      c. list(生成器函数) 返回一个列表,里面装着生成器中的所有内容

    def generator():
        yield 'aaa'
        yield 'bbb'
    g=generator()
    print(list(g))                                         #输出结果为:[aaa,bbb]

    三、生成器实例

    1、yield from实例

    复制代码
    def generator():
        yield from [1,2,3]
        yield from 'abc'
    g=generator()
    for i in g:
        print(i)
    ****************************************等价于*****************************************
    def generator(): for i in [1, 2, 3]: yield i for j in 'abc': yield j g = generator() for i in g: print(i)
    复制代码

    2、监控文件中写入的内容

    复制代码
    import time
    def generator(filename):
        f=open(filename,encoding='utf-8')
        f.seek(0,2)
        while True:
            line=f.readline()
            if not line:
                time.sleep(0.1)
                continue
            yield line
    g=generator('demo')
    for line in g:
        print(line,end='')
  • 相关阅读:
    51 Nod 1035 最长的循环节 (此题还不是很懂,日后再看)
    51 Nod 1101 换零钱(动态规划好题)
    51 Nod 1101 换零钱(动态规划好题)
    51 Nod 1163 最高的奖励
    51 Nod1042 数字0到9的数量
    51 Nod 1629 B君的圆锥
    iterrows(), iteritems(), itertuples()对dataframe进行遍历
    pandas计数 value_counts()
    scikit_learn逻辑回归类库
    Python中的深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/Ebola-/p/8179628.html
Copyright © 2020-2023  润新知