目录python
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来函数
迭代提供了一种通用的不依赖索引的迭代取值方式工具
一.可迭代对象code
#如下都是可迭代对象 str1 = 'hello tank!' str1.__iter__() list1 = [1, 2, 3] # list([1, 2, 3]) list1.__iter__() set.__iter__() dict.__iter__() tuple.__iter__() open('a.txt').__iter__()
但凡内置有__iter__方法的对象,都称为可迭代对象,可迭代的对象: str ,list,tuple,dict,set,文件对象对象
二.迭代器对象索引
# 不依赖索引的取值方式 # tuple1 = ('tank', 'jason鸡哥', 'sean', '饼哥') # # 获取迭代器对象: iter_list1 # iter_tuple1 = tuple1.__iter__()
# while True: # try: # print(iter_tuple1.__next__()) # 报错 # # 当即触发此处代码 StopIteration # except StopIteration: # break
1既内置又__next__方法的对象,执行该方法能够不依赖索引取值内存
2.又内置有__iter__方法的对象,执行迭代器的__iter__方法获得的依然是迭代器自己it
迭代器对象必定是可迭代对象,可迭代对象不必定是迭代器对象,文件对象自己就是一个迭代器对象io
例如:执行可迭代对象下的__iter__方法,返回一个迭代器对象,在经过迭代器对象的__next__方法取值,若是取值次数超过源值的数量就会报错for循环
for循环本质为迭代器循环
工做原理:
1.先调用可迭代对象的__iter__方法,将其变成一个迭代器对象
2.调用next(迭代器),将获得的返回值赋值给变量名
3.while循环往复直到next(迭代器)抛出异常,for会自动捕捉异常而后结束循环
迭代器优势:
1.提供了一种通用不依赖索引的迭代取值方式
2.同一时刻在内存中只存在一个值,更节省内存
迭代器缺点:
1.取值不如按照索引的方式灵活,不能取指定的某一个值,只能日后取,不能往前去
2.没法预测迭代器的长度
生成器就是一种自定义的迭代器,本质为迭代器
但凡函数内包含yield关键字,调用函数不会执行函数体代码,会获得一个返回值,该返回值就是生成器对象
yield与return
相同点:返回值的个数都是无线的
不一样点:return只能返回一次只值,
yield每一次都会往生成器对象中添加一个值
yield只能在函数内部定义
yield能够保存函数的暂停状态
def func(): print('1') yield 11 print('2') yield 22 res = func() print(res.__next__()) print(res.__next__()) 1 11 2 22
当咱们经过__next__取值时,才会执行函数体代码
#range() python2: range(1,5) ---> [1,2,3,4,5] python3: range(1,5) ---> range对象 ---> 生成器 --- >迭代器 自定义range()功能,建立一个自定义的生成器 start-->1,end-->5,move=2 def my_range(start,end,nove=1): while start < end: yield start start += move for i in my_range(1,10): print(i)