• python基础 迭代器


    迭代器和生成器

    迭代器协议和可迭代协议

    可迭代协议:只要含有__iter__方法的都是可迭代的。

    可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

    from collections import Iterable     #Iterable  可迭代的
    print(isinstance[],Iterator)             # isintance   判读是什么类型

    可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

    print(dir([1,2]))
    print(dir((2,3)))
    print(dir({1:2}))
    print(dir({1,2}))
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
     '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
    '__gt__', '__hash__','__iadd__', '__imul__', '__init__', '__iter__', '__le__', 
    '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
     '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__',
     '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
     'insert', 'pop', 'remove', 'reverse', 'sort']
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
    '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', 
    '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', 
    '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
     '__str__', '__subclasshook__', 'count', 'index']
    ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', 
    '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',
     '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
     '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 
    'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
    ['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
     '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', 
    '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', 
    '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', 
    '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 
    'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint',
    'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference',
    'symmetric_difference_update', 'union', 'update']

    可迭代的概念:

    1.可以被for循环的都是可迭代的

    2.只要是迭代器一定 可迭代

    3.可迭代的.__iter__()方法就可以得到一个迭代器

    迭代器协议:内部含有__next__和__iter__方法的就是迭代器。

    判断是否是迭代器

    1.iterator

    2.可迭代对象

    3.直接给你内存地址

    4.for

      只有是可迭代对象的时候,才能用for

      当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代。

    迭代器的好处:

    1.从容器类型中一个一个的取值,会把所有的值都取到。

    2.可以节省内存空间。

    3.迭代器并不会在内存中再占用一大块内存,而是随着循环每次生成,每次next每次给我一个。

    from collections import Iterator   #iterator 迭代器。 
    print(isinstance[],Iterator)     #isinstance 判断是什么类型

     for循环内置了一个迭代器。

    生成器

    生成器函数:执行之后会得到一个生成器作为返回值

    生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

    生成器Generator:

      本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)。

      特点:惰性运算,开发者自定义。

    def generator
        print(1)
        yield 'a'
    
    ret = generator()
    print(ret)
    print(ret.__next__())
    
    
    def generator():
        print(1)
        yield 'a'
        print(2)
        yield'b'
    g = generator()
    ret = g.__next__()     #  这个是读取文件1,'a'
    print(ret)
    ret = g.__next__()    #在写一个就是读取文件2,'a'
    print(ret)     
    
    for i in g:     #这个是直接打印出两个结果
        print(i)

    生成器的优点:

    1.不会一下子在内存中生成太多数据。

    2.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

    3.提高代码可读性

    def wahaha():
        for i in range(2000000):     #不会在内存中生成太多数据
            yield 'wahaha%s' % i
    
    g = wahaha()
    count = 0
    for i in g:
        count += 1
        print(i)
        if count > 50:  # 提取到50
            break
    for i in g:
        count += 1
        print(i)
        if count > 100:  # 提取到100
            break
    print(g.__next__())  # 这个就是从101提取

    生成器例子(监听文件例子)

    def tail(filename):
        f = open(filename,encoding='utf-8')
        while True:
            line = f.readline()
            if line.strip():
                yield line.strip()
    
    g = tail('file')     
    for i in g:            #输入文件会跟着一起读取
        print(i)
    for i in g:
        if 'python' in i:       #规定只读取带'python'的文件
            print(i)
  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/soleZ/p/8178969.html
Copyright © 2020-2023  润新知