天天看點

[Python學習筆記-005] 了解yield

網絡上介紹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
[Python學習筆記-005] 了解yield
  •  運作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章。

參考資料:

  1. What does the "yield" keyword do?

繼續閱讀