• 生成器与迭代器笔记


    生成器与迭代器

    生成器generator

    定义:在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    1.生成器函数

    生成器函数 ——本质上就是我们自己写的函数

    只要含有yield关键字的函数都是生成器函数,yield不能和return共用且需要写在函数内

    def generator():
        print(a)
        yield 1
    ret=generator()
    #生成器函数 : 执行之后会得到一个生成器作为返回值
    print(ret)
    
    def generator():
         print(1)
         yield 'a'
         print(2)
         yield 'b'
         yield 'c'
     g = generator()
     for i in g:
         print(i)
     ret = g.__next__()
     print(ret)
     ret = g.__next__()
     print(ret)
     ret = g.__next__()
     print(ret)
    

    2.列表推到式与字典推导式

    列表推导式

    语法[结果,for循环 条件筛选]

    需求:要求把列表[0,1,2,3,4,5,6,7,8,9]里的每个值加1

    这里可以用列表生成式搞定

    lst=[i+1 for i in range(10)]
    print(lst)
    

    字典推导式

    lst=[11,22,33,44]
    dic={i:lst[i] for i in range(len(lst))}
    print(dic)
    

    输出

    {0: 11, 1: 22, 2: 33, 3: 44}
    

    生成器表达式

    g=(x+1 for x in range(10))
    print(g)
    

    输出

    <generator object <genexpr> at 0x00000223B825C890>#生成器内存地址
    

    其实就是把列表生成式的[]改成(),就创建了一个生成器

    迭代器

    l = [1,2,3]
    索引
    循环 for
    for i in l:
    	pass
    for k in dic:
        pass
    '''list
    dic
    str
    set
    tuple'''
    f = open()
    range()
    enumerate
    print(dir([]))   #告诉我列表拥有的所有方法
    ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))
    print(ret)  #iterable
    print('__iter__' in dir(int))
    print('__iter__' in dir(bool))
    print('__iter__' in dir(list))
    print('__iter__' in dir(dict))
    print('__iter__' in dir(set))
    print('__iter__' in dir(tuple))
    print('__iter__' in dir(enumerate([])))
    print('__iter__' in dir(range(1)))
    

    只要是能被for循环的数据类型 就一定拥有__iter__方法

    print([].__iter__())
    

    一个列表执行了__iter__()之后的返回值就是一个迭代器

    print(dir([]))
    print(dir([].__iter__()))
    print(set(dir([].__iter__())) - set(dir([])))
    print([1,'a','bbb'].__iter__().__length_hint__())  #元素个数
    l = [1,2,3]
    iterator = l.__iter__()
    print(iterator.__next__())
    print(iterator.__next__())
    print(iterator.__next__())
    print(iterator.__next__())
    

    Iterable 可迭代的 -- > iter #只要含有__iter__方法的都是可迭代的
    [].iter() 迭代器 -- > next #通过next就可以从迭代器中一个一个的取值

    只要含有__iter__方法的都是可迭代的 —— 可迭代协议

    print('__iter__' in dir( [].__iter__()))
    print('__next__' in dir( [].__iter__()))
    from collections import Iterable
    from collections import Iterator
    print(isinstance([],Iterator))
    print(isinstance([],Iterable))
    
    class A:
    	def __iter__(self):
    		pass
    	def __next__(self):
    		pass
    a = A()
    print(isinstance(a,Iterator))
    print(isinstance(a,Iterable))
    
    l = [1,2,3,4]
    for i in l.__iter__():
    	print(i)
    

    迭代器的概念iteration

    迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器

    迭代器协议和可迭代协议
    可以被for循环的都是可迭代的
    可迭代的内部都有__iter__方法
    只要是迭代器 一定可迭代
    可迭代的.iter()方法就可以得到一个迭代器
    迭代器中的__next__()方法可以一个一个的获取值

    for循环其实就是在使用迭代器
    iterator:可迭代对象
    直接给你内存地址

    print([].__iter__())
    print(range(10))
    

    只有是可迭代对象的时候才能用for
    当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代

    for i in l:
    	pass
    iterator = l.__iter__()
    iterator.__next__()
    

    迭代器的好处:

    1.从容器类型中一个一个的取值,会把所有的值都取到。

    2.节省内存空间

    #迭代器并不会在内存中再占用一大块内存,
        # 而是随着循环 每次生成一个
        # 每次next每次给我一个
    
    l = [1,2,3,45]
    iterator = l.__iter__()
    while True:
    	print(iterator.__next__())
    
    print(range(100000000000000))
    print(range(3))
    print(list(range(3)))
    def func():
        for i in range(2000000):
            i = 'python%s'%i
        return i
    func()
    
  • 相关阅读:
    tinyhttp源码阅读(注释)
    BSON 1.0版本规范(翻译)
    linux下编译qt5.6.0静态库——configure配置
    springboot(二):web综合开发
    Linux 4.10中两个新特性与我的一段故事
    [Perforce]password (P4PASSWD) invalid or unset. 的错误解决
    Cross compiling coreutils and generate the manpages
    【蓝桥杯】PREV-21 回文数字
    【Qt】StackedWidget
    凡人视角C++之string(上)
  • 原文地址:https://www.cnblogs.com/zhang1947604022/p/13177059.html
Copyright © 2020-2023  润新知