概念层面:
可迭代对象:
一个可迭代对象是指任何可以返回一个迭代器的对象。换句话说,它实现了 __iter__()
方法
比如:列表、元组、字典、字符串、集合等
直接通过 for 循环使用,因为 for 循环内部会调用其 __iter__() 方法来获取一个迭代器。
迭代器:
迭代器是一个对象,它封装了遍历数据的过程。迭代器对象必须实现两个方法:
-
__iter__()
:返回自身,用于支持迭代器协议。 -
__next__()
:返回下一个元素;当没有元素时会抛出StopIteration
异常。
my_list = [1, 2, 3, 4]
it = iter(my_list) # 将列表转换为迭代器
print(next(it)) # 输出 1
print(next(it)) # 输出 2
代码层面:
迭代器:
import sysdef main():# 读取二进制输入并解码(假设为 UTF-8 编码)data = sys.stdin.buffer.read().decode('utf-8').split()it = iter(data) # t = int(next(it))res = []for _ in range(t):a = int(next(it))b = int(next(it))res.append(str(a + b))# 输出前先编码成二进制sys.stdout.buffer.write("\n".join(res).encode('utf-8'))if __name__ == '__main__':main()
可迭代对象:
import sysdef main():# 读取二进制输入并解码(假设为 UTF-8 编码)data = sys.stdin.buffer.read().decode('utf-8').split()# 第一个元素是测试用例数 tt = int(data[0])res = []# 后续的数字按照成对顺序排列,第 i 个测试用例对应 data[1 + i*2] 和 data[1 + i*2 + 1]for i in range(t):a = int(data[1 + i * 2])b = int(data[1 + i * 2 + 1])res.append(str(a + b))# 输出前先编码成二进制sys.stdout.buffer.write("\n".join(res).encode('utf-8'))if __name__ == '__main__':main()
两者之间的关系
-
转换关系:
每个可迭代对象都可以通过内置函数iter()
转换为一个迭代器。这意味着当你对一个可迭代对象使用iter()
时,它返回的是一个能依次产生该对象中所有元素的迭代器 -
迭代过程:
当你在for
循环中遍历一个可迭代对象时,实际上是调用了这个对象的__iter__()
方法,返回一个迭代器,然后不断调用迭代器的__next__()
方法来获取元素,直到遇到StopIteration
异常为止
-
简化理解:
-
可迭代对象 就像一个“容器”,里面装着很多数据。
-
迭代器 则是一个“指针”或“工具”,用来逐个取出容器中的数据。
-