網絡上介紹yield的文章很多,但大多講得過于複雜或者追求全面以至于反而不好了解。本文用一個極簡的例子給出參考資料[1]中的講解,因為個人覺得其講解最為通俗易懂,讀者隻需要對Python的清單有所了解即可。
When you see a function with yield statements, apply this easy trick to
understand what will happen:
1. Insert a line result = [] at the start of the function.
2. Replace each yield expr with result.append(expr).
3. Insert a line return result at the bottom of the function.
4. Yay - no more yield statements! Read and figure out code.
5. Compare function to original definition.
例如:
- foo1.py
1 #!/usr/bin/python3
2 import sys
3
4 def foo(n):
5 for i in range(n):
6 yield i * i
7
8 def main(argc, argv):
9 for i in foo(int(argv[1])):
10 print(i)
11 return 0
12
13 if __name__ == '__main__':
14 sys.exit(main(len(sys.argv), sys.argv))
- foo2.py
1 #!/usr/bin/python3
2 import sys
3
4 def foo(n):
5 result = []
6 for i in range(n):
7 result.append(i * i)
8 return result
9
10 def main(argc, argv):
11 for i in foo(int(argv[1])):
12 print(i)
13 return 0
14
15 if __name__ == '__main__':
16 sys.exit(main(len(sys.argv), sys.argv))
- meld foo1.py foo2.py

- 運作foo1.py 和 foo2.py
lijin$ ./foo1.py 3
0
1
4
lijin$ ./foo2.py 3
0
1
4
那麼,問題來了,
Q1 - yield的含義是什麼?
A:相當于return, 不過傳回的是一個生成器函數。
Q2 - 為什麼要引入yield?
A: 省記憶體!如果使用return一個list, 則list的元素全部儲存在記憶體裡;如果使用yield, 那就隻需要在通路某個元素時将對應的元素裝入記憶體即可。更多内容,請參考《Python學習手冊》第4版第20章。
參考資料:
- What does the "yield" keyword do?