十二、迭代器,生成器,for循环原理
一.迭代器:
迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 迭代器给你提供了一种不依赖于索引取值的方式 基本数据类型中可迭代对象的有: str list tuple dict set 文件对象(执行内置的__iter__之后还是本身 没有任何变化):文件对象本身就是迭代器对象 s = 'hello' l = [1,2,34,] t = (1,2,34) s1 = {1,2,3,4} d = {'name':'jason'} f1 = open('xxx.txt','w',encoding='utf-8') # 文件类型不需要 res1 =iter(s) # 变成迭代器对象 res2 =iter(t) # 变成迭代器对象
迭代器取值: print(res.__next__()) # 取值 print(res.__next__()) print(res.__next__()) 1.只能往后依次取 不能后退 2. ps:迭代器一定是可迭代对象 而可迭代对象不一定是迭代器对象
二、for循环的基本原理
for循环内部本质:1.将in后面的对象调用__iter__转换成迭代对象 2.调用__next__迭代取值 3.内部有异常捕获Stopteration,当__next__报这个错,自动结束循环 如:d = {"name":"jasoon","password":"123","hobby":"read"} for i in d : print(i) for 循环后面的in跟一个可迭代对象,转换成迭代器对象,然后调用__next__取值,再捕获异常
三、生成器
# 1.生成器的定义:用户自定义的迭代器,本质就是迭代器。 # 2.函数内部有一个yield关键字,加括号执行函数并不会触发函数体代码的运行 # 3.yield可以返回一个和多个值,多个已元组方式返回 # 4.生成器初始化中,g=func(),函数变成迭代器,已一个yield为节点,依次迭代,执行第二次迭代器,运行第一个yield下面代码,到第二个yield结束 # def func(): # print('first') # yield 666 # print('second') # yield 777 # print('third') # yield 888 # print('forth') # yield # yield # print(g) # print(g.__next__()) # print(g.__next__()) # print(g.__next__()) # print(g.__next__()) # print(g.__next__())
# 自定义一个range def my_range(start,end,step=1): while start < end: yield start start += step for j in my_range(1,100,2): print(j)
四、生成器的表达式
# res = (i for i in range(1,100000000) if i != 4) # 生成器表达式 # print(list(res)) # # """ # 生成器不会主动执行任何一行代码 # 必须通过__next__触发代码的运行 # """ # print(res.__next__()) # print(res.__next__()) # print(res.__next__()) # print(res.__next__())
五、内置函数