python学习笔记,视频day18-迭代器、

一、递归:函数自己调用自己

      举例:问路

二、迭代:每次循环得到的结果都是依赖上一次而来的

      举例:生宝宝

三、迭代器协议

  1. 迭代器协议:对象必须提供一个next方法,执行该方法姚蜜返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退)
  2. 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)
  3. 协议是一种约定,可迭代对象实现了迭代器协议,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分未看

猜你喜欢

转载自www.cnblogs.com/ppll/p/11768667.html