什么是迭代(iteration):
1.所谓迭代就是重复运行一段代码语句块的能力
2.迭代就是从某个容器对象中逐个地读取元素,直到容器中没有元素为止
什么是可迭代对象(iterable):
1.可以被迭代的类型
2.只要类型有__iter__()方法就是可迭代的
3.判断某个对象是否可迭代的方法:
(1)用
dir()
函数来查询是否包含__iter__()
方法(2)对象.方法的方式去调用__iter__(),看有没有该方法
(3)通过内置的实例对象函数
isinstance
判断,可迭代对象是Iterable
类的str1 = "abc" print("__iter__" in str1.__dir__()) # 判断变量是否为可迭代类型 print(isinstance(str1, Iterable))
运行结果: True True
迭代器(Iterator):
1.迭代器一定是可迭代对象,可迭代对象不是迭代器
2.迭代器中有两个特殊的方法是
__iter__()
和__next__()
方法3.迭代器通过
__next__()
方法取值,每迭代一次取一个值,只能往后取4.当取完最后一个值的时候,再执行
__next__()
方法会报StopIteration
异常,表示取完了5.创建迭代器的方法:
使用内置的
iter()
函数或者__iter__()
方法来创建迭代器判断一个对象是迭代器还是迭代对象:
(1)通过对象包含
__iter__()
和__next__()
方法确定(2)需要判定是迭代器还是迭代对象可以通过实例对象函数进行判定;迭代器和可迭代对象的对象类型分别是
Iterator
和Iterable
str_iterator = str1.__iter__() #创建字符串的迭代器 print(isinstance(str_iterator, Iterator)) #判断str_iterator是否是迭代器 print(isinstance(str1, Iterator)) #判断str1是否是迭代器
运行结果: True False
str_iterator.__iter__() #创建迭代器str_iterator的迭代器 print(isinstance(str_iterator, Iterable)) #判断str_iterator是否是迭代对象
运行结果: True
使用__next__()/next()取迭代器中的值时,一次只能取一个值,同时在取完这个值后会驻留在该处,下次取值时就从此处开始
str1 = "abc" print(str_iterator.__next__()) print(str_iterator.__next__()) print(next(str_iterator)) print(str_iterator.__next__())
运行结果: a b c StopIteration ----->表示生成器中的值已经取完了
for循环的底层原理:
for循环可迭代类型时,可迭代类型使用__iter__方法或内置的iter()函数创建迭代器。
迭代器使用__next__或内置的next()函数取可迭代类型的元素,一直取到报StopIteration的错误,for循环或捕获StopIteration的错误,只要for循环捕获到StopIteration的错误,for循环就停止。
生成器(generator ):
1.本质是一个迭代器
2.使用了yield 的函数被称为生成器(generator)
yield的功能:
返回值# 定义一个生成器 def gen1(): print("第一次取值") yield 1 print("第二次取值") yield 2 # 判断生成器是否是一个迭代器 print(isinstance(g, Iterator)) # 判断生成器是否是一个可迭代类型 print(isinstance(g, Iterable)) # 取生成器的值 print(g.__next__()) print(g.__next__())
运行结果: True True 第一次取值 1 第二次取值 2
让程序挂起/暂停
接收值
使用生成器的send方法将值发送给生成器
send方法的机制:先向生成器挂起的位置发送值,再执行生成器中后面的代码# 定义一个生成器 def gen2(): var = yield 1 var = var.upper() yield var # 取生成器中的值 generator1 = gen2() print(next(generator1)) #第二次取值,先向生成器返回值,再取值 print(generator1.send("python"))
运行结果: 1 PYTHON
def gen3(): print("第一次取值") var = yield 1 print(f"var的值为{var}") var1 = yield 2 print(f"var1的值为{var1}") yield var yield 3 print("生成器代码执行完成") generator3 = gen3() print(generator3.__next__()) # 第一次取值 1 print(generator3.send("hello")) # 2 print(generator3.send("python")) # hello print(generator3.__next__()) # 3 print(generator3.__next__())
运行结果: 第一次取值 1 var的值为hello 2 var1的值为python hello 3 生成器代码执行完成 StopIteration
yield和return的共同点:都可以返回值
yield和return的区别点:return代表函数的结束,yield不会让代码结束 ,yield之后的代码还会在运行
3.生成器和迭代器的共同点:都可以使用__next__()方法或next()函数取值
4. 生成器和迭代器的区别点:
生成器自己会生成值
迭代器是可迭代类型创建的,迭代器自己没有元素(值),迭代器每次取的元素(值)是可迭代类型的元素(值)