• 迭代器和生成器


    可迭代协议

    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
  • 相关阅读:
    JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
    ASP.NET MVC的运行机制--url的全局分析
    ASP.NET MVC
    [Android 新特性] 15项大改进 Android 4.4新特性解析
    [Android Pro] activity-alias的使用
    [Android Pro] 控制硬加速 hardwareAccelerated 在3.0才有的
    [Android Pro] Android中IntentService的原理及使用
    [SQLite] SQLite学习手册(数据库和事务)
    [Android UI] ActionBar 自定义属性
    [Android Memory] App调试内存泄露之Context篇(下)
  • 原文地址:https://www.cnblogs.com/wanghaohao/p/7275668.html
Copyright © 2020-2023  润新知