zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    golang 相关
    ES root用户启动失败can not run elasticsearch as root
    基于 Flink CDC + Hudi 湖仓一体方案实践
    数据平台上云
    多云趋势
    数果实时数仓探索
    宽表的设计
    数仓指标体系
    Hudi在医疗大数据的应用
    Hudi on Flink上手使用总结
  • 原文地址:https://www.cnblogs.com/soleZ/p/8178969.html
Copyright © 2011-2022 走看看