首先我們從一個小程式導入,各定一個list,找出其中的質數,我們會這樣寫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import math
def is_Prims(number):
if number == 2:
return True
elif number % 2 == 0:
return False
for cur in range(2,int(math.sqrt(number))+1,2):
if number % cur == 0:
return False
else :
return True
def get_Prims(input_list):
result_list = list()
for element in input_list:
if is_Prims(element):
result_list.append(element)
return result_list
aa = get_Prims([1,2,3,4,5,6,7,8,9])
print (aa)
|
登入後複製
但如果我們想給定一個數,然後列出比這個數大的所有質數呢?我們可能這樣寫:
1 2 3 | def get_Prims(number):
if is_Prims(number):
return number
|
登入後複製
但是一旦return函數將控制權交給呼叫者後徹底結束,任何局部變數和函數工作都被丟棄,下一次呼叫又會從頭開始。因此我們就可以用一下寫法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def get_Prims(number):
while (True):
if is_Prims(number):
yield number
number += 1
def get_numbers():
total = list()
for next_prim in get_Prims(2):
if next_prim < 100:
total.append(next_prim)
else :
print (total)
return
get_numbers()
|
登入後複製
下面解釋一下generator函數,一個函數的def程式碼裡包含了yield,函數就自動成為了一個generator函數(及時仍包含有return),generator函數創建generator(一種特殊形式的迭代器,這個迭代器有一個內建next()方法),當需要一個值的時候透過yield來產生而不是直接return,因此與一般函數不同的是,此時控制權並未交出。
for迴圈會隱式的呼叫next()函數,next()函數負責呼叫generator中的next()方法,此時generator負責傳回一個值給任何呼叫next( )的方法,利用yield將此值傳回去,相當於return語句。
以上是詳解python之yield和Generator實例代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!