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
posted @ 2020-10-11 21:10  chchcharlie、  阅读(254)  评论(0编辑  收藏  举报