下面把 generator 的本质、
yield 和 next() 的关系,以及 for x in fib_n(10) 到底返回了什么,都解释清晰。✅ 1. Generator 是什么?是不是只是用 yield?
不是。
Generator 的本质是:
一个带有 yield 的函数,它返回的是一个 generator object,而不是返回最终结果。这个 generator object 实现了 iterator 接口(定义了 __next__())。
所以:
yield是创建 generator 的关键 —— 但 generator 的本质是一个 iterator
- 函数里只要有
yield,Python 会自动把这个函数编译成 generator-function
✔ 使用
yield → 函数不再一次性返回值,而是暂停并返回一个值✔ 下一次再调用
next() → 会从暂停处继续运行✅ 2. next() 怎么用?
你写的 generator:
def fib_n(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b
当你调用:
g = fib_n(5)
此时:
g是一个 generator object
- 并不会马上执行代码
使用
next(g) 才会真正跑起来:print(next(g)) # 0 print(next(g)) # 1 print(next(g)) # 1 print(next(g)) # 2 print(next(g)) # 3 print(next(g)) # StopIteration when exhausted
当 generator 结束时,会抛出一个
StopIteration。for 循环就是靠捕捉这个异常来停止的。✅ 3. for x in fib_n(10) 返回的是什么?
分两部分:
(1) fib_n(10) 返回的是什么?
✔ 它返回一个 generator object,类似:
<generator object fib_n at 0x1083d2f80>
你可以认为它是一个“可迭代的 Fibonacci machine”。
(2) for x in fib_n(10) 实际发生了什么?
for 循环会:- 调用
iter(fib_n(10))—— 得到 generator object 本身
- 调用 generator 的
__next__()—— 相当于next(generator)
- 每得到一个值就赋给
x
- 当遇到
StopIteration时结束循环
也就是说:
for x in fib_n(10): print(x)
相当于:
g = fib_n(10) while True: try: x = next(g) print(x) except StopIteration: break
⭐ 总结(面试可用版)
❗ What is a generator?
A generator is an iterator created by a function containing
yield.It produces values lazily, one at a time.
❗ What does yield do?
yield pauses the function and returns a value.The next call to
next() resumes execution.❗ What does next() do?
Runs the generator until the next
yield and returns that value.❗ for x in fib_n(10) 是什么?
fib_n(10)→ 返回一个 generator object
for循环内部不断调用next()
- 每次取到一个值赋给
x
如果你愿意,我可以用图帮你把 generator 的执行流程画出来(暂停/恢复的过程),会更直观。
在python中处理大型数据,可以考虑使用generator,进行lazy evaluation。
对pandas.csv,使用chunk,chunksize可控。
或者进行memmap自动。
arr = np.memmap("bigfile.dat", dtype='float32', mode='r') for x in arr: process(x)
