Python“三大器”之迭代器
迭代器
1、什么是迭代器
迭代:迭代指的是重复迭代,每一次迭代的结果都是基于上一次而来的
迭代器:指的是迭代取值的工具,可以迭代取值”“‘’‘’
2、可迭代对象
可迭代对象: 所有的序列类型:str,list,tuple,dict,set,file都是可迭代对象
凡是内部有.__iter__()方法的都是可迭代对象
# 字符串
str.__iter__()
# 元组
tuple.__iter__()
# 列表
list.__iter__()
# 字典
dict.__iter__()
# 集合
set.__iter__()
# 文件
file = open("dir/passwd.txt", "r", encoding="utf-8")
file.__iter__()
3、获取迭代器
通过序列类型.__iter__(),得到的返回值就是”迭代器对象“
迭代器是迭代取值的工具,作用是迭代取值
# f ---> 可迭代对象
f = open("dir/passwd.txt", "r", encoding="utf-8")
# f_iter ---> 迭代器对象
f_iter = f.__iter__()
print(f is f_iter)
(1)如何迭代取值
通过可迭代对象.__next__(),每一次执行,都会从迭代器对象中取出一个值
str1 = "靓仔靓女"
str_iter = str1.__iter__()
print(str_iter) # iterator就是迭代器对象
print(str_iter.__next__()) # .__next__()取值
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())
(2)迭代器的优缺点
优点:
1.不依赖于索引取值
2.节省内存空间
# 依赖于索引取值
list1 = ['apple', 'cat', 'dog', 'bear', 'banana']
n = 0
while n < len(list1):
print(list1[0])
n += 1
# 不依赖于索引取值
list1 = ['apple', 'cat', 'dog', 'bear', 'banana']
list_iter = list1.__iter__()
# list_iter.__next__()
while True:
# 补充: try:捕获异常
try:
print(list_iter.__next__()) # 迭代五次报错
# 报错之后触发此处代码,Exception接受所有异常报错(不区分错误类型)
except Exception:
print("迭代完成")
break
缺点:
1.取值麻烦
2.每次取值都要从第一个值开始,无法通过索引来取值
4、For循环的原理
list1 = [1, 2, 3, 4] # 可迭代对象list1
list1_iter = list1.__iter__() # 可迭代对象list1使用.__iter__()转化为迭代器对象list1_iter
while True:
try: # 捕获异常,遇到异常停止取值
print(list1_iter.__next__())
except Exception:
print("打印完成...")
break
for i in list1: # in会将可迭代对象自动变成迭代器对象
# for ... in内部也会自动调用.__next__()
print(i)
# for循环内部也会有一个捕获异常机制,一旦遇到异常也会停止取值
5、可迭代器对象和迭代器对象(总结)
(1)获取可迭代对象:定义序列类型(str,list,tuple,dict,set,file)
特点:凡是内置有.__iter__()都是可迭代对象
(2)获取迭代器对象:通过可迭代对象调用.__iter__()得到返回值
特点:内置有.__next__()
迭代器本质上是一个可迭代对象
文件本质上既是迭代器对象,也是可迭代对象。(文件比较特殊:因为文件从读出来的时候就是一个迭代器对象)
可迭代器对象不一定是迭代器对象(文件的可迭代对象一定是迭代器对象)
# 文件的可迭代对象一定是迭代器对象
# f ---> 可迭代对象
f = open("dir/passwd.txt", "r", encoding="utf-8")
# f_iter ---> 迭代器对象
f_iter = f.__iter__()
print(f is f_iter) # True
# str、tuple、list、dict、set的可迭代对象不是迭代器对象
# str1 ---> 可迭代对象
str1 = "靓仔靓女"
# str_iter ---> 迭代器对象
str_iter = str1.__iter__()
print(str1 is str_iter) # False