迭代器与生成器讲解

102 阅读3分钟

迭代器与生成器的讲解

一、可迭代对象与迭代器

1. 可迭代对象

首先,要知道迭代是什么?迭代其实就是一件事反复地去做,而迭代器则是可以记住遍历位置的对象,实现__next__()方法,通常其从序列的第一个元素开始访问,直到所有的元素都被访问才结束,Python中的列表,元组,字符串集合等容器都可以在for循环中使用,在每次循环中,for语句都从迭代器序列里获取一个数据元素。下面请看代码:

#检测是否为可迭代对象
from collections import Iterable #从collections导入Iterable类 ,其中Iterable是可迭代对象
str1="hello world"
list1=[1,2,3]
tuple1=(1,2,3)
dict1={1:2,3:4}
set={1,2,3}

print(isinstance(str1,Iterable)) # 是可迭代对象返回True否则返回False
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(s,Iterable))

2.迭代器

迭代器必须要遵守迭代协议 迭代协议: 迭代器必须要有__iter__()和__next__()两个方法

代码演示:

#dir()判断当前的数据的数据类型可以使用的方法有哪些
print(dir([1,2])) 
print(dir((1,2)))
print(dir({1,2}))
print(dir({1:2}))
#综合输出结果后发现都有__iter__()方法,如下所示可执行__iter__()
print([1,2].__iter__()) #打印的结果为list_iterator 而list_iterator就是一个列表迭代器

iter1=[1,2,3,4,5].__iter__()
# 获取迭代器中元素长度
print(iter1.__length_hint__())
# 根据索引值从哪里迭代
print(iter1.__setstate__(1))

from collections import Iterator # Iterator判断是否为迭代器

#对比原来的列表里面多出来的方法
print(set(dir([1,2].__iter__()))-set(dir([1,2])))
#输出__iter__()__和__next__()和__setstate()__

iter1=[1,2,3,4,5].__iter__()
# 获取迭代器中元素长度
print(iter1.__length_hint__())
# 根据索引值从哪里迭代
print(iter1.__setstate__(1))
#一个一个取值
print(iter1.__next__())
print(iter1.__next__())
print(iter1.__next__())
print(iter1.__next__())
print(iter1.__next__()) #迭代的对象个数不能超过迭代器中序列的或元素长度否则会报错:StopIteration 即迭代器里面的下标溢出

比较迭代器和迭代对象:
from collections import Iterator 
from collections import Iterable 

print(isinstance(range(5),Iterable)) #输出为True
print(isinstance(range(5),Iterator)) #输出为False
print(isinstance([1,2],Iterable)) #输出为True
print(isinstance([1,2],Iterator)) #输出为False

综上判断出是迭代器就一定是可迭代对象,但是是可迭代对象就不一定是迭代器

二、生成器

定义

生成器(generator)是一种特殊类型的迭代器,它允许你逐个生成值而不是一次性生成所有值并将它们存储在内存中。生成器使用 yield 语句来产生值,而不是使用 return。生成器在迭代过程中维持其状态,而不会完全计算所有值 代码演示:

def my_generator():
    yield 1
    yield 2
    yield 3

# 使用生成器
gen = my_generator()

for value in gen:
    print(value)

#伪代码
def my_generator():
    # 生成器的初始化代码

    while condition:  # 替换为实际的终止条件
        # 生成器的逻辑代码

        yield generated_value

# 使用生成器
gen = my_generator()

for value in gen:
    # 处理生成器产生的值
    print(value)

最后,如果觉得这篇文章能帮到你的话,还请你给点个赞外可以的话还请关注up主,你的点赞和关注就是对up主的最大鼓励,相信日后一定会写出越来越优秀的文章的与大家分享的!