• python之路_初始迭代器与生成器


    一、迭代器

    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 collection 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 "第%s件衣服" %i
    g=generator()
    for j in g:
        print(j)
        if j=='第50件衣服':
            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='')
    #ctr+s键查看在文件中输入的内容
  • 相关阅读:
    基础才是重中之重~stream和byte[]的概念与转化
    微信扫码i支付~官方DEMO的坑
    知方可补不足~SqlServer自动备份数据库及清理备份文件
    11g r2 模拟OCR和voting disk不可用,完整恢复过程,以及一些注意事项
    自定义navigationBar的高度
    Python 中的用户自定义类型
    hdu1370-Biorhythms
    Ruby on Rails 實戰聖經阅读(三)
    重新配置与卸载 11gR2 Grid Infrastructure
    非确定有限状态自动机的构建(一)——NFA的定义和实现
  • 原文地址:https://www.cnblogs.com/seven-007/p/7474622.html
Copyright © 2020-2023  润新知