Generator
🔕

Generator

 
下面把 generator 的本质yieldnext() 的关系,以及 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 循环会:
  1. 调用 iter(fib_n(10)) —— 得到 generator object 本身
  1. 调用 generator 的 __next__() —— 相当于 next(generator)
  1. 每得到一个值就赋给 x
  1. 当遇到 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)