053 迭代器

迭代器解决了不依赖索引取值的问题

一、可迭代对象

特征: __iter__()方法的对象就是可迭代对象

x = 1                   # 不可迭代对象
s = 'nick'              # 可迭代对象
lt = [1, 2, 3]          # 可迭代对象
dic = {'a': 1, 'b': 2}  # 可迭代对象
tup = (1,)              # 可迭代对象,元组只有一个元素必须得加逗号
se = {1, 2, 3}          # 可迭代对象
f = open('time.py')     # 可迭代对象
def func():             # 不可迭代对象
    pass

总结:除了数字类型和函数之外Python内置str、list、tuple、dict、set、file都是可迭代对象

二、迭代器对象

只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。

特征: 具有__iter__()以及__next__()方法的叫做迭代器对象

s = 'nick'              # 可迭代对象,不属于迭代器对象
lt = [1, 2, 3]          # 可迭代对象,不属于迭代器对象
dic = {'a': 1, 'b': 2}  # 可迭代对象,不属于迭代器对象
tup = (1,)              # 可迭代对象,不属于迭代器对象
se = {1, 2, 3}          # 可迭代对象,不属于迭代器对象
f = open('time.py')     # 可迭代对象,迭代器对象
def func():             # 不可迭代对象,不属于迭代器对象
    pass

总结:只有文件是迭代器对象

三、for循环原理

for循环 == 迭代循环

lt = [1,2,3]
lt_iter = lt.__iter__()
# li_iter = iter(lt)        # iter(lt) 和 lt.__iter__() 功能相同,都可以使用
while 1:
    try:
        print(lt_iter.__next__())
        # print(next(lt_iter))  # next(lt_iter) 和 lt_iter.__next__() 功能相同,都可以使用
    except StopIteration:
        break

总结:

  1. (可迭代对象/迭代器对象)可以用__iter__()方法转换成迭代器对象
  2. 使用__next__()取出迭代器里的所有值
  3. 使用__next__()方法取尽迭代器中的所有值,一定会报错,通过异常捕捉退出while循环

可迭代对象: 具有__iter__()方法的对象就是可迭代对象,除了数字类型和函数都是可迭代对象
迭代器对象: 具有__iter__()__next__()方法的都是迭代器对象,只有文件是迭代器对象

迭代器对象一定是可迭代对象; 可迭代对象不一定是迭代器对象

原文地址:https://www.cnblogs.com/XuChengNotes/p/11341360.html