不一樣的函數返回值~yield關鍵字*核心講解(內含debug的git圖展示)

                         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’>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章