zoukankan      html  css  js  c++  java
  • Day 13 迭代器,生成器.

     

     

     

    一、迭代器

    可以进行for循环的 数据类型

    str ,list tuple dict set 文件句柄 

    什么是可迭代对象?

    方法一:dir(被测对象) 如果他含有__iter__,那这个对象就叫做可迭代对象.

    s="abcd"

    print 

    # # l = [1,2,3,4]
    # # print("_iter_" in dir(l))#判断是否为迭代对象
    #
    # # l1=l.__iter__()
    # # print(l1)# 将l 列表转换成迭代器
    # # #<list_iterator object at 0x0079F9D0>
    #
    # # print(l1.__next__())
    # # print(l1.__next__())
    # # print(l1.__next__())
    # # print(l1.__next__())#取值.
    #
    # r=range (100)
    # print("_iter_" in dir(r)) # True
    #
    # r_iter = r.__iter__()
    # print(r_iter)#转换成迭代器.
    #


    # s ="abcde"
    # print("__iter__" in dir(s))
    # print("_iter_" in dir(555))
    # 输出结果:
    # True
    # False

    # 可迭代对象,iterable 与迭代器有什么关系?
    # 可迭代对象--->转换成迭代器
    #
    # 可迭代对象.__iter__() --->迭代器
    s = "abcdefg"
    s1 = s.__iter__()
    print(s1)

    # 输出结果:<str_iterator object at 0x0048FAB0>

    # 迭代器的取值:
    # 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("__iter__" in dir(s3))
    # print("__iter__" in dir(s3))

    # 输出结果:
    # <str_iterator object at 0x0205C910>
    # a
    # b
    # c
    # d
    # True
    # True
    # True
    # True

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

    # l=[1,2,3,4,5]
    # print("__iter__"in dir(l))##判断是否为迭代对象
    # print("__next__" in dir(l))
    # liter= l.__iter__()
    # print(liter.__next__())
    # print(liter.__next__())
    # print(liter.__next__())
    # print(liter.__next__())
    # 输出结果
    # <str_iterator object at 0x0021FAB0>
    # True
    # False
    # 1
    # 2
    # 3
    # 4
    #方法一:dir(被测对象)如果他含有__iter__,那么这个对象就叫做可迭代对象.
    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))

    # 输出结果:
    # <str_iterator object at 0x005DC910>
    # True
    # False
    # 1
    # 2
    # 3
    # 4
    # True
    # False
    # True
    # True

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

    '''
    # for 循环机制:
    # 内部还有__iter__方法,if __name__ == '__main__':
    # 他会将可迭代对象先转换成迭代器然后在调用__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
    print("__iter__" in dir(range (10)))
    print("__next__" in dir(range(10)))
    # 输出结果:
    # True
    # False

    二、生成器

    '''
    什么是生成器
    生成器的本质就是迭代器 ,生成器是自己用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 返回给调用者值,并结束此函数.
    #yiled 返回给调用者值,并将指针停留在当前位置.
    #返回结果.
    # <generator object gener at 0x022A5780>
    # aaa
    # 222
    # bbb
    # 333

    def cloth():
    for i in range(10000):
    print("衣服%s"%i)

    cloth()
    g_cloth =cloth()
    print(g_cloth._next_())
    print(g_cloth._next_())
    for i in range (50):
    print(g_cloth._next_())
    for i in range (50):
    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'))



  • 相关阅读:
    Zookeeper之 为什么最好是奇数台机器?
    Kafka 之 如何高吞吐和低延迟
    hbase 之 rowkey的设计
    Zookeeper之 两种选举制度|为什么需要过半投票机制?
    Mysql 之 union和union all
    Mysql之 distinct & null | distinct 调优
    Linux 之 系统资源命令
    Linux 之 vi 之 快速定位到n line
    Zeppelin问题 之 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
    springboot项目中进行XSS过滤
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/8422866.html
Copyright © 2011-2022 走看看