一、迭代器
迭代:是一个重复的过程,但每次重复都是基于上一次的结果而来的
迭代器:就是一种不依赖于索引的取值工具
为什么要用迭代器:
1.迭代器是一种通用的迭代取值方法(可以无视是否有索引)
2.惰性计算,节省内存。迭代器在生成时,并没有产生值,并不会占用很多内存。在每次使用next方法后,会临时计算一个值,更节省内存。
迭代器的优点:
①、是一种通用的迭代取值方案
②、惰性计算,节省内存
如何用迭代器:
在下面我们会使用到双下划线加方法名的使用,其实和iter(),next()是等同的
dic = {"name": "yang", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
res1 = dic_iterator.__next__()
res2 = dic_iterator.__next__()
res3 = dic_iterator.__next__()
print(res1,res2,res3)
------------------------------------
name age gender
dic_iterator.__next__() # 第四次next()抛出异常
-----------------------------------
StopIteration
'''
当迭代器中取完了值之后,会抛出异常,提示我们已经取完了值,抛出StopIteration,
因为在我们直接拿到一个迭代器的时候,我们是不知道这个迭代器到底有多少个值的
'''
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
'''
try:
代码
except 异常类型:
代码
是一种处理异常的情况,和java的异常处理机制try,catch类似,目前我们只需要记住这个格式,他而已帮助我们捕获异常,在出现了我们指定的异常的时候,会帮助我们执行下部的代码,防止程序崩溃
'''
二:可迭代对象与迭代器对象
可迭代对象/类型
内置有__iter__方法的类型称之为:可迭代的对象/类型
所有的常用类型,都是可以被转成迭代器的对象,也叫可迭代对象
1、字典dict
2、集合set
3、文件对象(也是迭代器对象)
f = open('a.txt')
f.__iter__()
4、字符串str
5、列表list
6、元组tuple
迭代器对象
迭代器对象: 内置有__next__方法、内置有__iter__方法
可迭代对象可以用iter()方法转化成迭代器对象,迭代器对象也可以再使用iter方法,但是得到的是它本身,这个特性是为了迎合for循环的工作原理,下面会讲到。
对于文件对象,它既是可迭代对象,又是迭代器对象,做成这样的原因是因为某些文件可以很大,因为迭代器的特性,每次调用才产生值,不会造成内存冲击,而其他的类型,一般不会存放非常大量的数据。
三:for循环的工作原理
dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
for k in dic:
print(k)
'''
步骤1 dic_iterator = dic.__iter__()
步骤2 k=dic_iterator.__next__(),执行循环体代码
步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环
'''
dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
for k in dic_iterator:
print(k)
print(dic_iterator)
四、生成器
生成器 = 自定义迭代器
但凡是函数内出现了yield关键字,调用函数不会执行函数整体代码,而是得到一个返回值,这个返回值就是生成器。
def func():
print("hello1")
yield 111
print("hello2")
yield 222
print("hello3")
yield 333
g = func()
print(g) # 生成器本质就是迭代器
res=next(g)
print(res)
res=next(g)
print(res)
res=next(g)
print(res)
# next(g) 此行会报错,因为取值完毕了
-----------------------
hello1
111
hello2
222
hello3
333
yield与return:
(1)相同点:都可以用来返回值
(2)不同点:
return只能返回一次值,函数就立即结束了
yield能返回多次值,yield可以挂起函数(即停住函数)
# 案例
def func():
res=0
while True:
res+=1
yield res
g=func()
for i in g:
print(i)
-----------
死循环
迭代器的优缺点:
优点:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
缺点:
1、取值不如索引、key的取值方式灵活
2、取值是一次性的,只能往后取,不能预估值的个数
小练习:用迭代器写一个简单的range功能
def my_range(start, stop, step=1):
while start < stop:
yield start
start += step
for i in my_range(1,5,2):
print(i)