迭代器
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来迭代提供了一种通用的不依赖索引的迭代取值方式。
可迭代对象
可以用for循环遍历的对象都是可迭代对象。
~str,list,tuple,dict,set等都是可迭代对象
~generator(生成器和yield的生成器函数)也是可迭代对象
迭代器
~有内置的__iter__()方法的对象,执行迭代器的__iter__()方法得到的依然是迭代器本身
~有内置的__next__()方法的对象,执行该方法可以不依赖索引取值
问题:可迭代对象一定是迭代器吗 false
1.掌握如何转为迭代器
1.1 转为迭代器的方法__iter__() iter()
2.迭代器与生成器的取值
2.1 lis.__next__() next()
3.生成器的运行方式
# 可迭代对象
# 1,包含__iter__方法
# str()
# list()
# int() # 不是可迭代
# isinstance 来判断是否为可迭代对象
# from collections.abc import Iterable # 判断是否为可迭代对象
# from collections.abc import Iterator # 判断迭代器
#
# print(isinstance('abc', Iterable))
# print(isinstance([1, 2, 3], Iterator))
li = [1,2,3,4]
print(type(li))
# lis = li.__iter__()
lis = iter(li)
print(type(lis))
# print(lis[0])#会报错,迭代不能通过下标取值,因为数据不是全部存储在内存里面,只有在调用的时候才会使用
# print(lis.__next__()) #只能顺序取值
print(lis.__next__())
# print(lis.__next__())
# print(lis.__next__())
# print(lis.__next__())#StopIteration
print(next(lis))
生成器
在python中,一边循环一边计算的机制,称为生成器:generator。
为什么会有生成器?
生成器就是在循环的过程中根据算法不断推算出后续的元素,这样就不用创建整个完整的列表,从而节省大量的空间。
生成器表达式
生成器表达式来源于迭代和列表解析的组合,生成器和列表解析类似,但是它使用()而不是[]。
# q = (i for i in range(5))
# print(type(q))
# # print(g[0])# 生成器不能通过下标取值
# print(next(q))
# def yieldtest(num): # num :20
# n = 0
# li = []
# while n < num:
# li.append(n)
# n = n + 1
# print(li)
#
#
# yieldtest(20)
'''
yield:将函数变成生成器的关键字,将值返回的next(g),直到遇到下一个next(g),会接着上一段代码执行
return :函数执行到return时,就退出了函数
'''
# def yieldtest(num): # num :20
# n = 0
# li = []
# while n < num:
# # li.append(n)
# n = n + 1
# # print(li)
# yield n
#
# res = yieldtest(20)
# print(next(res))
# print(next(res))#遇到第二个next(g),会接着上一次的yield下面代码继续执行
def test():
a1 = yield "hello"
yield a1
res = test()
print(next(res)) #hello
print(res.send("world")) #world,增加了传值的功能