zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    迭代器:

    什么是可迭代对象?

    方法1:dir(被测对象)  如果里面含有 __iter__  则是可迭代对象

    s = 'abc'
    print(dir(s))
    #输出:['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', .......]
    # 如果此列表里面有 __iter__,则是可迭代对象
    s = 'abc'
    print('__iter__' in dir(s))
    #输出True  则代表是可迭代对象

    方法2: 测试他是迭代器还是可迭代对象

    from collections import Iterable
    from collections import Iterator
    l = [1,2,3]
    l_iter = l.__iter__()
    print(isinstance(l,Iterable))           #True
    print(isinstance(l,Iterator))         #False
    print(isinstance(l_iter,Iterator))      #True
    print(isinstance(l,list))            #True

    可迭代对象 转换成 迭代器:

    可迭代对象.__iter__()  ---> 迭代器

    s = 'abc'
    s = s.__iter__()
    print(s)
    #输出:<str_iterator object at 0x000000029B515588>

    迭代器取值:

    s = 'abcd'
    s = s.__iter__()
    print(s.__next__())        #用next,写一个打印一个
    print(s.__next__())
    #输出:    a
    #        b
    l = [1,2,3,4]
    print(dir(l))                   #打印:['__add__', '__class__', '__contains__', '__delattr__',....]
    print('__iter__' in dir(l))     #输出:True   表示__iter__ 在dir(l)里面
    print('__next__' in dir(l))     #输出:False  表示__next__ 不在dir(l)里面
    liter = l.__iter__()             #把列表转换成迭代器
    print(liter.__next__())          #输出:  1    
    print(liter.__next__())          #输出:2
    print(liter.__next__())        #输出:3
    print(liter.__next__())       #输出:4

    可迭代对象和迭代器的区别:

    只含有__iter__方法的数据是可迭代对象
    含有__iter__方法,并且含有__next__方法的数据是迭代器

    迭代器的意义?
    1,迭代器节省内存.
    2,迭代器惰性机制.
    3,迭代器不能反复,一直向下执行.

    生成器:

    生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.

    1,可以用生成器函数
    2,可以用各种推导式构建迭代器.
    3,可以通过数据转化.

    def gener():
        print('aaa')
        yield 222
        print('bbb')
        yield 333
        print('ccc')
    g = gener()
    print(g.__next__())    #输出:aaa   222
    print(g.__next__())    #输出:bbb   333
    #yiled 返回给调用者值,并将指针停留着当前位置.

    return yield 区别:
    return 返回给调用者值,并结束此函数.
    yiled   返回给调用者值,并将指针停留着当前位置.

    send:

    1,send 和next功能一样
    2, 给上一个yiled 整体发送一个值

      send不能给最后一个yield发送值

      获取第一个值的时候,不能用send 只能用next

    def gener():
        yield 222
        count = yield 333
        print('-------->',count)
        yield 'aaa'
        yield 'bbb'
    g = gener()
    print(g.__next__())
    print(g.__next__())
    print(g.send('AAAA'))
    print(g.__next__())
    # 输出:
    #    222
    #    333
    #    --------> AAAA
    #    aaa
    #    bbb
  • 相关阅读:
    MAC上最好用的免费全能音乐播放器VOX 2.6.5
    Linux发行版的排行
    Linux发行版的排行
    ImageButton的背景设为透明或者半透明以及按下效果
    ImageButton的背景设为透明或者半透明以及按下效果
    软件缘-网友个人精心打造的精品软件收集
    软件缘-网友个人精心打造的精品软件收集
    滚动条
    em
    配色
  • 原文地址:https://www.cnblogs.com/pygg/p/8423765.html
Copyright © 2011-2022 走看看