一、迭代器
1.首先,器”,大家都已经了解,就是工具的意识,那么什么是迭代?
迭代:“迭代是一个重复的过程,并且每次的重复都是基于上一次的结果而来的
2.想要了解迭代器到底是什么?还必须先了解什么是“可迭代对象”?
可迭代对象:在python中,但凡内置有_iter_方法的对象,都是可迭代对象
例如以下都是可迭代对象
str1=‘hello‘ list1=[1,2,3] tup1=(1,2,3) dic={‘x‘:1} s1={‘a‘,‘b‘,‘c‘} f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
3.迭代器
定义:迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象
dic={‘x‘:1,‘y‘:2,‘z‘:3} # dic为可迭代对象 iter_dic= dic.__iter__() # iter_dic为迭代器对象 print(iter_dic.__next__()) print(iter_dic.__next__()) print(iter_dic.__next__()) 打印结果:x y z 会将键值打印出来 异常处理
如果循环取值,但是本身的值并没有那么多会出现什么情况呢? 当然会报错了,那么又有什么方法来控制呢 x=[1,2,3] iter_x=x.__iter__() while True: try: # try 就相当于与一个监督作用,如果取出的值超出了x的范围,那么就会停止取值 print(iter_x.__next__()) except StopIteration: break
4.可迭代对象与迭代器的比较
可迭代对象:
str,list,dict,tuple,set,file
获取可迭代对象方式:
无需获取,python内置str,list,dict,tuple,set,file都是可迭代对象
特点:
内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象
迭代器对象:
文件对象本身就是迭代器对象
获取迭代器对象的方式:
执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象
特点:
内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身
5.迭代器优缺点
优点:
1.>可以不按照索引取值
因为它可以利用可迭代的对象执行__iter__方法直接得到的返回值
2.>节省内存
它可以将所有的值全部储存在一个空间,就是一个存储地址
缺点:
1.>取值麻烦
因为它取值只能一个一个取,取完前面才能取后面
2.>取值是一次性的,无法用len获取长度
6.for 循环原理分析
1.>for循环称之为迭代器循环,in后面跟的必须是可迭代对象
2.>for循环会执行in后面对象的__iter__方法,转成迭代器对象
3.>然后调用迭代器__next__方法,进行取值
4.>依次循环,直到取值完毕,检测到异常StopIteration,自动结束循环
二、生成器
生成器的本质就是迭代器
函数内包含yield关键字,在调用函数,
就不会执行函数体代码,拿到的返回值就是一个生成器
如果取值范围超过本身的数值范围会怎样呢?
既然会出现这种报错的情况,那么自然就有解决的方法
yield即可以返回一个值,也可以返回多个值,
并且多个值是以元组的形式返回,
如果yield后面没有数值,那么就会返回None
def func(): print(‘=====>first‘) yield 1 print(‘=====>second‘) yield 2 print(‘=====>third‘) yield 3,4 print(‘=====>forth‘) yield s = func() print(s) print(s.__next__()) print(s.__next__()) print(s.__next__()) print(s.__next__()) # 打印结果: =====>first 1 =====>second 2 =====>third (3, 4) =====>forth None
练习:
自定义range功能
需要取出range里的值 平常是使用for循环来取值 for i in range(1,10): print(i) # 打印结果:1~9的值 这样就可以将其中的值全部取出,那么自定义生成器怎么取呢? def my_range(start,end,step=1): while start < end: yield start start += step for i in my_range(1,10): print(i) # 打印结果:1~9的值
原文:https://www.cnblogs.com/xiongying4/p/11185608.html