Python“三大器”之迭代器

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

以上是 Python“三大器”之迭代器 的全部内容, 来源链接: utcz.com/z/531213.html

回到顶部