Python 面试题, Python 的 iterables 和 iterators 有什么区别?
Python 面试题, Python 的 iterables 和 iterators 有什么区别?
QA
Step 1
Q:: Python 的 iterables 和 iterators 有什么区别?
A:: 在 Python 中,iterables 是可以被迭代的对象,例如列表、元组和字符串。这些对象实现了 __iter__()
方法,可以返回一个 iterator。iterator 则是一个实现了 __next__()
方法的对象,它通过每次调用 __next__()
返回下一个元素,并且在没有元素时抛出 StopIteration
异常。简单来说,iterable 是包含元素的数据结构,iterator 是用来逐个访问这些元素的工具。
Step 2
Q:: 如何手动创建一个 iterator?
A:: 可以通过实现一个带有 __iter__()
和 __next__()
方法的类来手动创建一个 iterator。例如:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
iter_obj = MyIterator([1, 2, 3])
for item in iter_obj:
print(item)
这个例子展示了如何手动创建一个 iterator,并通过 for
循环迭代其内容。
Step 3
Q:: 如何使用 iter()
函数将 iterable 转化为 iterator?
A:: iter()
函数用于将一个 iterable 对象转化为 iterator。举例来说,列表是一个 iterable,但不是一个 iterator,因此可以使用 iter()
函数将它转化为一个 iterator。例如:
my_list = [1, 2, 3]
my_iterator = iter(my_list)
print(next(my_iterator)) # 输出 1
print(next(my_iterator)) # 输出 2
print(next(my_iterator)) # 输出 3
在此例中,iter()
将列表 my_list
转化为了 my_iterator
,后者可以通过 next()
逐步访问列表中的元素。
Step 4
Q:: 什么是生成器(generator),它如何与 iterator 相关?
A:: 生成器是一种特殊的 iterator,它使用 yield
关键字来返回元素。与普通 iterator 不同,生成器不需要实现 __iter__()
和 __next__()
方法,因为它们是通过函数定义的。生成器每次迭代时保存上次离开的位置,能够继续执行。例如:
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # 输出 1
print(next(gen)) # 输出 2
print(next(gen)) # 输出 3
生成器在大数据处理时非常有用,因为它们不会一次性加载所有数据,而是按需生成数据。