Python 3.1 快速導覽 - 函數 產生器

函數 (function) 中若使用 return ,函數會直接回傳數值 (value) ,也隨之終止函數執行。若使用另一個關鍵字 (keyword) yield ,可使函數產生數值,而不會結束函數執行,這樣的函數被稱為產生器函數 (generator function) 。



例如以下程式可產生 2 到 n-1 之間的整數
def fun(n):
    for i in range(2, n):
        yield i
        
for j in fun(7):
    print(j) 

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:gen01.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



第 5 行利用 j 取得產生器函數 fun() 所產生的數字,然後在第 6 行呼叫 print() 印出。


以下程式可將字串 (string) 倒過來印出
def reverse(data):
    for i in range(len(data) - 1, -1, -1):
        yield data[i]
        
for i in reverse("wonderful"):
    print(i * 33) 

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:gen02.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



這是利用 range() 建立一個串列 (list) ,該串列中依序儲存字串的最大索引值到最小索引值,然後用 yield 產生字元,直到倒序讀完字串。


以下程式將英文單字中母音字母以 1 替換,非母音字母以 0 替換,產生的 01 序列儲存在串列中
def t(data):
    for i in data:
        if i in "aeiou":
            yield 1
        if i not in "aeiou":
            yield 0

s = "perpetual"
d = []
        
for i in t(s):
    d.append(i)
    print(d)
print()

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:gen03.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



第 12 行
d.append(i)


這是利用串列的 append() 方法 (method) ,可附加任意物件 (object) 到串列裡頭,排在所有元素 (element) 的最後。


中英文術語對照
函數function
數值value
關鍵字keyword
產生器函數generator function
串列list
方法method
物件object
元素element






2 則留言:

藍天小綿羊 提到...

第1個範例應該是產生2(含)到7(不含)之間的整數

Kaiching Chang 提到...

這部份打錯了,已修改,感謝指正 :)