return,yield,print聯絡與區別

2021-10-06 11:07:58 字數 1884 閱讀 8433

看到一道題,return和yield有什麼區別,所以就連著print一起寫一下吧

print、return、yield都有列印的功能

首先看一下**以及輸出

def do_print():

for i in range(1, 5):

print(i)

print(do_print())

print("--------這是一條分割線---------")

def do_return():

for i in range(1, 5):

return i

print(do_return())

print("--------這是一條分割線---------")

def do_yield():

for i in range(1,5):

yield i

print(do_yield())

輸出如下:

123

4none

--------這是一條分割線---------

1--------這是一條分割線---------

print:

這個地方出了列印了1,2,3,4以外,為什麼後面還會列印乙個none?

是因為do_print()函式內部是預設存在乙個return的,只是不返回任何值,所以最後會返回乙個none

return:

只返回了1,就結束了遍歷迴圈,後面的2,3,4沒有機會返回

這個功能就類似迴圈中我們學到的break,程式執行到此便結束了,後面的不再執行

yield:

這個地方請注意,請執行以下**對yield進行更深入的了解:

print(type(do_yield()))

yi = do_yield()

for i in yi:

print(i)

輸出:

123

4

由此可見

1、yield的資料型別是generator,generator什麼意思,是指生成器

2、yield輸出1,2,3,4,那麼也就是說,yield並沒有阻斷迴圈的執行,他也是執行完所有的迴圈過程,最後通過迴圈列印出所有的值

綜上:

print需要注意:內部有乙個預設未展示的return,會列印出none

return會執行到這一步的時候中斷迴圈

yield則不會中斷迴圈,並且需要乙個新的迴圈列印返回值

*********************************************

延伸知識:

1、yield生成器不太明白,暫時擱下不講

2、yield和list的遍歷區別

從**程度上看,都是先執行乙個迴圈(do_yield()),然後再執行乙個for i in yi:列印出值

但是這個地方是有區別的

list列表,是先迴圈,然後將所有的值存進list中間,然後再將值乙個個取出,乙個個列印

yield,是執行一次do_yield()迴圈,獲取乙個值,執行一次for i in yi:列印獲取到的值

ps:上述可以通過debug進行驗證

由於這些值都是存放在記憶體中,list需要存放整個迴圈中的值,然後再列印出來

而yield是獲取到乙個列印乙個,那麼就會導致yield整體上占用的記憶體空間較小

Atitit 事件機制 與 訊息機制的聯絡與區別

atitit.事件機制 與 訊息機制的聯絡與區別 1 訊息 事件機制是幾乎所有開發語言都有的機制,在某些語言稱之為訊息 event 有些地方稱之為 message 12 發布 訂閱模式13 事件 是侵入式設計,霸佔你的主迴圈 訊息是非侵入式設計,將主迴圈該怎樣設計的自由留給使用者。13 1.事件越如...

《常用的機器學習演算法 SVM與LR的聯絡和區別》

上面那篇文章,簡單的總結了李航老師 統計機器學習 上面的svm的問題。其中軟間隔的svm主要指的是對那些線性不可分的樣本集構建svm分類的問題,允許一定的誤分類,所以優化問題引入了引數c 作為懲罰因子,c越大懲罰越大允許的錯誤越小。但是直接使用0 1損失函式的話其非凸 非連續,數學性質不好優化起來比...

LDO DCDC聯絡與區別

dcdc的意思是直流變 到 直流 不同直流電源值的轉換 只要符合這個定義都可以叫dcdc 轉換器,包括ldo。但是一般的說法是把直流變 到 直流由開關方式實現的器件叫dcdc。ldo是低壓降的意思,這有一段說明 低壓降 ldo 線性穩壓器的 成本低,噪音低,靜態電流小,這些是它的突出優點。它需要的外...