一.
1.迭代器
1.迭代更新的过程 ,重复的过程
2.每次迭代都是基于上一次的结果
2.作用:
提供了一种不需要索引去取值的方式
迭代器:
# l = [1,2,3,4,5] # n = 0 # while n < len(l): # print(l[n]) # n += 1
二.可迭代对象
内置有__iter__方法叫做可迭代器
可迭代的数据类型有:str list tuple set dict 文件
三.迭代器对象
1.内置__iter__和__next__的方法叫做迭代器对象
2.迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象
比如 :文件:既是可迭代对象也是迭代器对象
list 是可迭代对象,不是迭代器对象
3.迭代器对象不管__iter__多少次,结果还是还是它本身
四.迭代器的取值
1.把可迭代对象通过___iter__生成可迭代器对象
2.然后通过__next__取值
# l = [1,2,3,4] # iter_l = l.__iter__() # 先生成可迭代对象 # print(iter_l.__next__()
3.报错:当迭代器取值去玩之后,在往下取值就会报错 StopIteration
4.报错处理: 时刻监视迭代取值,以报错就退出取值
l = [1,2,3,4] iter_l = l.__iter__() while True: try: print(iter_l.__next__()) except StopIteration: break
5.取值的优点:
1.不用索引取值
2.只占一份内存,不会导致内存溢出
缺点:
1.不能去除指定的元素
2.取完值报错
取值的特点:
1.只能从前往后,不能后退
五.
for循环的本质
1.for循环后面的in为可迭代对象,用__iter__生成迭代器对象
2.迭代器对象调用__next__取值
3.报错处理,当__next__报StopIteration的错,循环结束
d = {‘name‘:‘jason‘,‘password‘:123} for i in d: # in后面跟的是可迭代对象 print(i)
六.生成器
def func(): print(‘hello‘) yield 111 print(‘world‘) yield 123 func() g = func() # 生成器初始化:将该函数变成迭代器 print(g) print(g.__next__()) print(func().__next__())
函数内有yield关键字,那么函数加括号不能执行函数体代码,而是生成了生成器,调用__next__才能执行代码
1.返回值 可以多次返回值.暂停程序. 帮你提供一种自定义生成器方式
2.yield可以接受外部传参
def dog(name): print(‘%s准备开吃‘%name) while True: food = yield print(‘%s吃了%s‘%(name,food)) g = dog(‘tom‘) g.__next__() g.send(‘饺子‘) g.send(‘mouth‘)
七.生成器表达式:
生成器不会主动执行代码
必须通过__next__才能执行代码
# res = [i for i in range(1,100000) if i != 4] # res = res.__iter__() # print(res.__next__())
面试题
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) # [6, 6, 6, 6]
原文:https://www.cnblogs.com/zhuangshenhao/p/11191033.html