迭代器,可迭代对象,迭代器对象和生成器

Posted cmd61

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器,可迭代对象,迭代器对象和生成器相关的知识,希望对你有一定的参考价值。

1  迭代器

技术图片
迭代的定义:迭代是一个重复的过程,不同于其他纯粹的重复,迭代的每一次结果都是基于上一次迭代的结果产生的。

迭代器就是一个可以进行迭代取值的工具

作用:给我们提供了一种不依赖索引取值的方式
View Code

补充:针对双下划线开头,双下滑线结尾的方法

推荐读:双下+方法名

2 可迭代对象

内置有__iter__方法的对象(列表,词典,元组,字符串,集合等)

3 迭代器对象

即内置有__iter__方法也内置有__next__方法的对象(文件,类等)

注意:迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象

可迭代对象转化为迭代器对象:

iter_d = d.__iter__()  # 后面可以跟多个__iter__方法 

迭代器对象取值必须使用__next__方法

注意:

技术图片
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
注意

 

4 for循环本质

技术图片
for循环内部的本质
    1.将in后面的对象调用__iter__转换成迭代器对象
    2.调用__next__迭代取值
    3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
View Code

5 迭代取值的优缺点:

技术图片
优点
        1.不依赖于索引取值
        2.内存中永远只占一份空间,不会导致内存溢出
    
    缺点
        1.不能够获取指定的元素
        2.取完之后会报StopIteration错
View Code

6 生成器

技术图片
用户自定义的迭代器,本质就是迭代器
View Code
技术图片
def func():
    print(first)
    yield  666  # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
    print(second)
    yield  777
    print(third)
    yield  888
    print(forth)
    yield
    yield
# yield后面跟的值就是调用迭代器__next__方法你能得到的值
# yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
g = func()  # 生成器初始化:将函数变成迭代器
示例
技术图片
# 自定义range生成器,range的功能基本上实现,但美中不足的是有一点小瑕疵无法解决,当传入的finish==0时,如果传入的start<=finish且step==-1时,结果就跟原来的range函数不一样
def func(start, finish, step):
    if step >= 1:
        while start < finish:
            yield start
            start += step
    else:
        while start > finish:
            yield start
            start += step


def my_range(start, finish=0, step=1):
    if finish == 0 and start > finish:
        res = func(finish, start, step)
        return res
    else:
        res = func(start, finish, step)
        return res


for i in my_range(1, 0, -1):
    print(i)
自定义range函数

以上是关于迭代器,可迭代对象,迭代器对象和生成器的主要内容,如果未能解决你的问题,请参考以下文章

迭代器,可迭代对象,迭代器对象和生成器

迭代器 生成器, 可迭代对象以及应用场景

可迭代对象迭代器和生成器

迭代器/可迭代对象/生成器

可迭代对象迭代器和生成器

可迭代对象迭代器和生成器