• 迭代器,生成器


    迭代器

    迭代是Python最强大的功能之一,是访问集合元素的一种方式

    迭代提供了一种通用的不依赖索引的迭代取值方式(next)

    什么是迭代器?

    迭代器是访问可迭代对象的工具

    (是指用可迭代对象的 __iter__ 方法返回迭代器对象,用迭代器对象的 __next__方法取值 )

    迭代器有两个基本的方法iter()next()

    一.可迭代对象

    #以下都是可迭代对象
    str1 = 'hello tank!'
    str1.__iter__()
    list1 = [1, 2, 3]  # list([1, 2, 3])
    list1.__iter__()
    set.__iter__()
    dict.__iter__()
    tuple.__iter__()
    open('a.txt').__iter__()
    

    但凡内置有iter方法的对象,都称为可迭代对象,可迭代的对象: str ,list,tuple,dict,set,文件对象

    二.迭代器对象

    1、又内置有__iter__方法的对象,执行迭代器的__iter__方法得到的依然是迭代器本身

    2、既内置有__next__方法的对象,执行该方法可以不依赖索引取值

    迭代器对象一定是可迭代对象

    可迭代对象不一定是迭代器对象,文件对象本身就是一个迭代器对象

    例如:执行可迭代对象下的__iter__方法,返回一个迭代器对象,在通过迭代器对象的__next__方法取值,如果取值次数超过源值的数量就会报错

    for循环本质为迭代器循环

    工作原理:

    1.先调用可迭代对象的__iter__方法,将其变成一个迭代器对象

    2.调用next(迭代器),将得到的返回值赋值给变量名

    3.while循环往复直到next(迭代器)抛出异常,for会自动捕捉异常然后结束循环

    迭代器优点

    1.提供了一种通用不依赖索引的迭代取值方式

    2.同一时刻在内存中只存在一个值,更节省内存

    迭代器缺点:

    1.取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去

    2.无法预测迭代器的长度

    生成器

    • 什么是生成器

    生成器就是一种自定义的迭代器,本质为迭代器

    • 如何实现生成器

    但凡函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象

    yield与return

    相同点:返回值的个数都是无线的

    不同点:return只能返回一次只值,

    yield每一次都会往生成器对象中添加一个值

    yield只能在函数内部定义

    yield可以保存函数的暂停状态

    def func():
        print('1')
        yield 11
        print('2')
        yield 22
    
    res = func()
    print(res.__next__())
    print(res.__next__())
    1
    11
    2
    22
    

    当我们通过__next__取值时,才会执行函数体代码

    #range()
    
    python2: range(1,5) ---> [1,2,3,4,5]
    python3: range(1,5) ---> range对象 ---> 生成器 --- >迭代器
    
    自定义range()功能,创建一个自定义的生成器
    start-->1,end-->5,move=2
    def my_range(start,end,nove=1):
        while start < end:
            yield start
            start += move
            
    for i in my_range(1,10):
        print(i)
    
  • 相关阅读:
    C语言经典算法100例(二)
    Plus One @LeetCode
    hdu 4099 Revenge of Fibonacci 字典树+大数
    算法入门系列一--DP初步
    《当裸辞的程序猿遇上最冷季八》——第一次约女孩吃饭
    UVa 297
    手机NFC通信的安全车钥匙
    innosetup卸载软件后,删除定时任务schedule task
    VS2008调试程序时出现"XXX mutex not created."
    centOS7关闭防火墙的命令
  • 原文地址:https://www.cnblogs.com/kai-/p/11850314.html
Copyright © 2020-2023  润新知