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

    一 迭代器

    迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口。

    for 循环
    str list tuple dict set 文件句柄
    可迭代:
    s = 'abc'
    for i in s:
        print(i)

     不可迭代

    iterable
    for i in 55:
        print(i)

    什么是可迭代对象?
    方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
    遵循可迭代协议
    s = 'abc'
    print('__iter__' in dir(s))
    print('__iter__' in dir(333))

    可迭代对象,iterable 与迭代器有什么关系
    可迭代对象 ---> 转化成迭代器
    可迭代对象.__iter__() ---> 迭代器
    s = 'abc'
    
    s1 = s.__iter__()
    print(s1) #iterator  遵循迭代器协议
     
    
    
    
    迭代器取值:
    s2 = 'abcd'
    s3 = s2.__iter__()
    print(s3.__next__())
    print(s3.__next__())
    print(s3.__next__())
    print(s3.__next__())
    print('__iter__' in dir(s2))
    print('__iter__' in dir(s3))
    print('__next__' in dir(s2))
    print('__next__' in dir(s3))

    
    
    只含有__iter__方法的数据是可迭代对象
    含有__iter__方法,并且含有__next__方法的数据是迭代器
    l = [1,2,3,4]
    #print(dir(l))
    print('__iter__' in dir(l))#判断l是不是可迭代对象
    print('__next__' in dir(l))#判断l是不是迭代器
    liter = l.__iter__()#l转换成迭代器
    print(liter.__next__())#输出值
    print(liter.__next__())
    print(liter.__next__())
    print(liter.__next__())
    print(liter.__next__())#没有第五项所以报错


    方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
    遵循可迭代协议
    s = 'abc'
    print('__iter__' in dir(s))
    print('__iter__' in dir(333))


    方法二 测试他是迭代器还是可迭代对象
    l = [1,2,3]
    l_iter = l.__iter__()
    from collections import Iterable
    from collections import Iterator
    print(isinstance(l,Iterable))
    print(isinstance(l,Iterator))
    print(isinstance(l_iter,Iterator))
    print(isinstance(l,list))


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

    for循环的机制.
    内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
    ,然后在调用__next__方法.
    他有异常处理的方法.
    for i in [1,2,3]:
        print(i)
    
    
    
    l = [1,2,3]
    l_iter = l.__iter__()
    while True:
        try:
            print(l_iter.__next__())
        except StopIteration:
            break
    可迭代对象:str list tuple dict set range
    迭代器: 文件句柄
    print('__iter__' in dir(range(10)))
    print('__next__' in dir(range(10)))
    l=[1,2,3,4,5]
    s=l.__iter__()
    print(s.__next__())
    print(s.__next__())
    print(s.__next__())
    print(s.__next__())
    print(s.__next__())
    # print(s.__next__())
    while True:
        try:
            print(s.__next__())
        except:StopIteration
        break

     迭代器:文件句柄是一个迭代器

    二  生成器

    什么是生成器?
    生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.
    1,可以用生成器函数
    2,可以用各种推导式构建迭代器.
    3,可以通过数据转化.
    def func():
        print(111)
        return 222
    ret = func()
    print(ret)

    生成器函数 生成器
    def gener():
        print('aaa')
        yield 222
        print('bbb')
        yield 333
        print('ccc')
    g = gener()
    print(g)
    print(g.__next__())
    print(g.__next__())
    return yield 区别
    
    return 返回给调用者值,并结束此函数.
    yiled 返回给调用者值,并将指针停留着当前位置.
    def cloth():
        for i in range(10000):
            print('衣服%s'%i)
    cloth()
     


    def cloth():
        for i in range(8):
            yield '衣服%s'%i
    
    g_cloth = cloth()
    print(g_cloth.__next__())
    print(g_cloth.__next__())
    for i in range(2):
        print(g_cloth.__next__())
    for i in range(2):
        print(g_cloth.__next__())


    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.send('AAA'))
    print(g.send(None))
    print(g.send('AAAA'))
    print(g.send('wwwwww'))
    def gener():
        yield 222
        count = yield 333
        print('-------->',count)
        coubt1=yield 444
        print(coubt1)
        yield 'bbb'
    g = gener()
    print(g.__next__())
    print(g.send('None'))
    print(g.send('AAAA'))
    print(g.send('ccc'))
     


  • 相关阅读:
    关于本人对javascript闭包的理解
    关于闭包内存泄露的处理方法
    javascript超时调用、间歇调用
    浏览器加载和渲染html的顺序
    CSS hack
    JS在操作IE与FF的一些区别
    javascript对select option操作
    jsp端使用ApplicationContext
    人生的35个经典好习惯
    2008个人总结
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8423191.html
Copyright © 2011-2022 走看看