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

    可迭代协议

    iterable:可迭代的,重复的。

    迭代:将某个数据集内的数据一个挨一个的取出来,叫迭代

    from collections import Iterable
    l = [1,2,3,4]
    t = (1,2,3,4)
    d = {1:2,3:4}
    s = {1,2,3,4}
    print(isinstance(l,Iterable))
    print(isinstance(t,Iterable))
    print(isinstance(d,Iterable))
    print(isinstance(s,Iterable))
    View Code

    可迭代协议:可以被迭代满足要求的协议就叫做可迭代协议,就是内部实现了_iter_方法

    print(dir([1,2]))
    print(dir((2,3)))
    print(dir({1:2}))
    print(dir({1,2}))
    View Code

    iterator 迭代器,迭代程序

    迭代器协议:必须拥有_iter_和_next_方法

    '''
    dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他们转换成集合,
    然后取差集。
    '''
    #print(dir([1,2].__iter__()))
    #print(dir([1,2]))
    print(set(dir([1,2].__iter__()))-set(dir([1,2])))
    View Code
    谁能取值

    我们用迭代器next来写一个不依赖for的遍历

    l = [1,2,3,4]
    l_iter = l.__iter__()
    item =l_iter.__next__()
    print(item)
    item =l_iter.__next__()
    print(item)
    item =l_iter.__next__()
    print(item)
    item =l_iter.__next__()
    print(item)
    View Code

    使用while循环实现

    l =[1,2,3,4]
    l_iter = l.__iter__()
    while True:
        try:
            item = l_iter.__next__()
            print(item)
        except StopIteration:
            break
    View Code

    还账:next和iter

    print('_next_' in dir(range(12)))
    print('_iter_' in dir(range(99)))
    
    from collections import  Iterable
    print(isinstance(range(10000000),Iterable))
    View Code

    为什么要用for循环,年轻人,for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法

    l = [1,2,3]
    
    index = 0
    while index < len(l):
        print(l[index])
        index +=1
    View Code

    生成器:自己写的这个能实现迭代器功能的东西就叫生成器

    Python中提供的生成器:

    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

     

    生成器Generator:

      本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

      特点:惰性运算,开发者自定义

     

    生成器函数

    初识生成器函数

    复制代码
    import time
    def genrator_fun1():
        a = 1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在又定义了b变量')
        yield b
    
    g1 = genrator_fun1()
    print('g1 : ',g1)       #打印g1可以发现g1就是一个生成器
    print('-'*20)   #我是华丽的分割线
    print(next(g1))
    time.sleep(1)   #sleep一秒看清执行过程
    print(next(g1))
    View Code
    #初识生成器二
    
    def produce():
        """生产衣服"""
        for i in range(2000000):
            yield "生产了第%s件衣服"%i
    
    product_g = produce()
    print(product_g.__next__()) #要一件衣服
    print(product_g.__next__()) #再要一件衣服
    print(product_g.__next__()) #再要一件衣服
    num = 0
    for i in product_g:         #要一批衣服,比如5件
        print(i)
        num +=1
        if num == 5:
            break
    View Code
  • 相关阅读:
    Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动
    Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
    Flash/Flex学习笔记(26):AS3自定义右键菜单
    Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)
    Flash/Flex学习笔记(35):如何正确监听Stage对象的事件
    jQuery autoComplete 自动完成 支持中文
    黑马程序员视频学习下载地址记录一下
    汉语分词系统 网址
    【转】Lucene.Net 详解
    MongoDB开发学习 开天辟地,经典入门 解决关系型数据库大数据量处理的瓶颈问题
  • 原文地址:https://www.cnblogs.com/wanghaohao/p/7275668.html
Copyright © 2011-2022 走看看