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'))
     


  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8423191.html
Copyright © 2011-2022 走看看