QQ:3020889729 小蔡
函數返回值涉及的關鍵字
return關鍵字
含義/用法:返回或中斷
用途 | 含義 |
---|---|
返回單個數據 | 直接返回該數據類型的對象(比如reutrn 0 # 意味着返回整型對象(也可以返回list等數據)) |
返回多個數據 | 直接返回包含所有數據的元組(比如reutrn 0, 1 # 意味着返回二元元組對象) |
用於中斷程序 | 直接返回None——形式:return None 或者 return |
yield關鍵字
含義/用法:yield返回的是一個生成器對象——然後通過__next__方法獲取一個數據,再次調用__next__獲取下一個數據——返回的對象是可迭代的,迭代通過__next__實現
用途 | 含義 |
---|---|
返回數據 | 直接返回該數據的一個生成器對象 |
補充說明 | 可以使用生成器對象下的__next__()方法讀取生成器下當前的返回值 |
具體實現下,yield的運行本質是首先開始返回一個生成器對象,然後暫停關於yeild部分的函數內容,直到使用了__next__方法後,纔會繼續yield部分函數的運行,然後得到一個數據並返回,接着又暫停,進而反覆運行,直到yield的部分徹底運行結束(也就是不再返回任何值)。如果已經沒有需要返回的數據了,再使用__next__會發出錯誤。
yield的實現展示(代碼+gif)
代碼實例
'''爲了理解yield實際的工作路徑,採用調試的方法來看一下
其次,我們是用一個for循環來比較它與return的區別之處
'''
def text_func_return(in_num):
'''採用for循環得到一個階乘的每一項的列表——return
'''
results = [] # 列表輸出多個數據,如果是採用return x1, x2, x3返回的數據會打包成元組
for i in range(1, in_num+1):
results.append((i*1))
return results
def text_func_yield(in_num):
'''採用for循環輸出一個階乘的每一項——yield
'''
for i in range(1, in_num+1):
yield i
if __name__ == "__main__":
input_data = int(input('請輸入一個階乘最高項: '))
print(text_func_return(input_data))
iters_elem = text_func_yield(input_data)
print(iters_elem.__next__()) # 打印第一次yield返回的數據
print(iters_elem.__next__()) # 打印第二次yield返回的數據
輸出結果:
請輸入一個階乘最高項: 5
[1, 2, 3, 4, 5]
1
2
Debug效果
首先在打印yield返回的生成器的值的每一個print處打上斷點,然後進入debug模式,進行調試。
然後輸入階乘項,進入調試窗口部分,默認運行到斷電處停下載——當點擊下一步——纔可以看到程序一步步的向下運行,直到結束。
(下面就是debug生成器的效果:每調用一次__next__,yield方纔返回一個實際的數據(一開始只是返回了一個生成器對象,只有對生成器對象使用__next__方法纔會開始返回具體的數據))
yield返回的數據類型——數據知多少?
這裏作爲對yield返回數據的複習——首先返回的是一個生成器對象,然後每一次使用方法返回的是原數據。
就用上邊的代碼——實現數據類型的判斷。
'''爲了理解yield實際的工作路徑,我們採用調試的方法來看一下
其次,我們用一個for循環,看看它與return的區別之處
'''
def text_func_return(in_num):
'''採用for循環得到一個階乘的每一項的列表——return
'''
results = []
for i in range(1, in_num+1):
results.append((i*1))
return results
def text_func_yield(in_num):
'''採用for循環輸出一個階乘的每一項——yield
'''
for i in range(1, in_num+1):
yield i
if __name__ == "__main__":
input_data = int(input('請輸入一個階乘最高項: '))
print(text_func_return(input_data))
iters_elem = text_func_yield(input_data)
# print(iters_elem.__next__()) # 打印第一次yield返回的數據
# print(iters_elem.__next__()) # 打印第二次yield返回的數據
print(type(iters_elem)) # yield一開始返回的iters_elem的數據類型
print(type(iters_elem.__next__())) # yield返回的數據的類型
print(type(iters_elem.__next__()))
結果:說明輸出的數據本身類型沒有發生變化——也就是yield返回的數據是單個原始數據
請輸入一個階乘最高項: 5
[1, 2, 3, 4, 5]
<class ‘generator’>
<class ‘int’>
<class ‘int’>