• 迭代器和生成器


    迭代器:

    什么是可迭代对象?

    方法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
  • 相关阅读:
    jprofiler监控分析
    实现loadrunner的IP欺骗
    dump内存和线程栈
    jprofiler监控tomcat
    nginx+tomcat负载均衡搭建及梦林博客http://www.limlhome.cn/blog/?p=298
    jconsole和jvisualvm监控tomcat配置
    apache+tomcat实现session共享
    性能测试流程
    AcWing101 最高的牛 (差分)
    AcWing100 增减序列 (差分)
  • 原文地址:https://www.cnblogs.com/pygg/p/8423765.html
Copyright © 2020-2023  润新知