一、递归:函数自己调用自己
举例:问路
二、迭代:每次循环得到的结果都是依赖上一次而来的
举例:生宝宝
三、迭代器协议
- 迭代器协议:对象必须提供一个next方法,执行该方法姚蜜返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)
- 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max)使用迭代器协议访问对象
四、for循环
(字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环时,调用了他们内部的_iter_方法,把他们变成了可迭代对象
然后for循环调用可迭代对象的_next_方法去取值,而且捕捉Stoplteration异常,终止迭代
l=[1,2,3,4] iter_test=l.__iter__()#遵循迭代器协议转换成可迭代对象 print(iter_test) print(iter_test.__next__()) print(iter_test.__next__()) # <list_iterator object at 0x00A1DE50> # 1 # 2
#只用索引进行遍历,while循环无法遍历字典、集合 l=[1,2,3,4] index=0 while index<len(l): print(l[index]) index+=1 # 1 # 2 # 3 # 4
- 集合
s={1,2,3} iter_s=s.__iter__() print(iter_s) print(iter_s.__next__()) print(iter_s.__next__())
- 字典
# 取keys值 dic={"a":1,"b":2} iter_d=dic.__iter__() print(iter_d.__next__()) # a
- 文件
test.txt内容 22 3ed
445
f=open("test.txt","r+")
iter_f=f.__iter__()
print(iter_f)
print(iter_f.__next__(),end="")
print(iter_f.__next__())
# 22
# 3ed
- 用while去模拟for循环
# 用while去模拟for循环 l=[1,2,3,4] diedal_l=l.__iter__() while True: try: print(diedal_l.__next__()) except StopIteration: print("迭代完毕,循环终止") break # 1 # 2 # 3 # 4 # 迭代完毕,循环终止
l=["die","erzi","sunzi","chongsunzi"]#将所有内容放在内存中 iter_l=l.__iter__()#地址,迭代器对象 print(next(iter_l))#next方法就是在调用ter_l.__next__();next()是python内置方法;iter_l.__next__()数据类型内置方法,结果一样 print(iter_l.__next__())#数据类型内置方法 print(iter_l.__next__()) print(iter_l.__next__()) # die # erzi # sunzi # chongsunzi
迭代器就是可迭代对象,遵循迭代器协议生成的数据类型就是可迭代对象
eg:列表本身不遵循迭代器协议,通过调用__iter__()内置方法,转换成遵循迭代器协议的对象,如:上例中iter_l;打印时为迭代器,如:print(iter_l)#<list_iterator object at 0x0112DE90>;如果这个对象没有__iter__()内置方法,则不是可迭代对象;调用__iter__()内置方法,生成的结果就是生成了可迭代对象。
五、生成器
可以理解成一种数据类型;特点是自动实现了迭代器协议。也就是不用调用__iter__()方法,意味着有__next__(),本身就是一个可迭代对象。生成器就是可迭代对象。
07 python s3 day18 三元运算,列表解析,生成器表达式.ev4-5分未看