面试题答案
一键面试range函数在迭代器协议方面的实现细节
- 可迭代性:
range
函数返回的对象是可迭代的,这意味着它实现了迭代器协议中的__iter__
方法。__iter__
方法返回一个迭代器对象,在range
的情况下,这个迭代器对象就是range
对象本身(因为range
对象同时也是一个迭代器,实现了__next__
方法)。 - 迭代器实现:
range
对象实现了__next__
方法。当调用__next__
时,它会按照设定的起始值、步长逐步生成下一个值。例如range(0, 10, 2)
,从0开始,每次增加2,依次生成0, 2, 4, 6, 8。当生成的值达到或超过结束值(不包含结束值)时,__next__
方法会抛出StopIteration
异常,标志着迭代结束。
将range函数与自定义生成器函数深度结合实现复杂迭代逻辑
以下是一个示例,假设我们要生成一系列经过复杂计算的数值序列,例如生成斐波那契数列的平方,并且结合range
来控制生成的数量:
def fibonacci_square_generator():
a, b = 0, 1
while True:
yield a ** 2
a, b = b, a + b
# 使用range和自定义生成器函数
def complex_sequence():
fib_gen = fibonacci_square_generator()
for _ in range(10):
yield next(fib_gen)
# 输出结果
for num in complex_sequence():
print(num)
在上述代码中:
fibonacci_square_generator
是一个自定义生成器函数,它生成斐波那契数列每个数的平方。complex_sequence
函数结合了range
和fibonacci_square_generator
。range(10)
控制只生成10个由fibonacci_square_generator
生成的数值。这样就实现了一个复杂的迭代逻辑,生成特定规律且经过复杂计算(斐波那契数平方)的数值序列。