成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

可視化數據結構以及算法演示工具

開發 前端
為了實現代碼的重用,避免重復造輪子,通常我們會將一段常用的代碼邏輯封裝為函數,這樣就可以實現代碼的一處編寫,多處調用。

今天筆者將向大家分享Python函數中應該避免的一個小細節。

為了實現代碼的重用,避免重復造輪子,通常我們會將一段常用的代碼邏輯封裝為函數,這樣就可以實現代碼的一處編寫,多處調用。

在函數設計和編寫中,常常會用到默認值參數,即在函數定義的時候就給定默認值。調用函數的時候,如果不給默認值參數傳遞值,則它將使用函數定義時設定的默認值。

本文要提醒大家的是,參數的默認值最好不要為可變類型,比如,x=[]。雖然這在Python的語法上是合法的,但合法的東西并不一定是好東西。比如,生活中你無故對陌生人作出無禮的行為,雖然不違法,但可能帶來意想不到的后果。

def my_func(lst: List[str] = []):
    # do something

在程序的世界中也是類似的道理。在Python函數中可變默認參數是合法的——我們可以運行上面這樣的代碼,并且Python也是允許的。然而,這并不是一個好的實踐,也并不推薦這樣做。

1. 可變性和不可變性的含義

可變性Mutability):

如果一個數據結構在創建后可以修改,那么它就是可變的。在Python中,像列表(List)、字典(Dict)和集合(Set)這樣的數據類型都是可變數據結構。

不可變性Immutability):

與可變性相反,如果一個數據結構在創建之后不可更改,那么它就是不可變的。在Python中,像整數、浮點數、布爾型、字符串、None、元組(tuple)和凍結集合(fozensets)這樣的數據類型都是不可變的。

2. 為什么要使用默認參數?

def say_hello(obj: str, greeting: str='Hello') -> None:
    print(f'{greeting}, {obj}!')

if __name__ == '__main__':
    say_hello(obj='World')  # Hello, World!
    say_hello(obj='World', greeting='Honey')    # Honey, World!

在上面的函數中,greeting 就是一個默認參數。在調用函數時,如果我們不給 greeting 傳值,那么它將采用默認值 Hello。如果我們給它傳遞了值,那它就會接受我們傳遞的值。

因此,如果我們可以接受默認參數的默認值,在函數調用時就可以選擇不傳遞默認參數,例如將上面示例中的 greeting 參數值設為 Hello。當函數中某個參數的值多數情況下不變時,就可以采用默認參數,比如一個讀取文件的函數,如果文件路徑一般不會改變,那就可以將其設置為默認參數。

3. 為什么不推薦使用可變默認參數呢?

def my_func(fruits: List[str] = []):
    fruits.append('apple')
    return fruits

這里,我們有一個接受 fruits 作為參數的函數 my_func,該函數會將 apple 追加到列表中,然后返回列表。

  • fruits 是一個默認參數。
  • 如果我們給 fruits 傳遞東西,它就會接受該值。
  • 如果我們不 fruits 傳遞東西,它就會使用默認值 []。
a = my_func(['banana'])
print(a)    # ['banana', 'apple']

這里,我們給 fruits 傳遞了內容,調用函數時,它將取值 banana,然后返回 ['banana', 'apple']。

a = my_func()
print(a)    # ['apple']

如果我們不向 fruits 傳遞任何內容,那么 fruits 將使用默認值 [],函數將返回 ['apple']。

4. 那么問題來了

print(my_func())    # ['apple']
print(my_func())    # ['apple', 'apple']
print(my_func())    # ['apple', 'apple', 'apple']

如果我們在不給 fruits 傳遞任何內容的前提下,多次調用函數,就會發生很奇怪的事。

  • 第一次調用 my_func(),fruits 被賦值給 [],而函數體中的 fruits.append('apple') 則會使它變成 ['apple']。
  • 第二次調用 my_func(),此時 fruits 的值為 ['apple']。我們再次執行 fruits.append('apple'),fruits 的值就變成了 ['apple', 'apple']。
  • 第三次調用 my_func(),此時 fruits 的值為 ['apple', 'apple']。再次執行 fruits.append('apple') 后,fruits 的值就變成了 ['apple', 'apple', 'apple']。

5. 為什么會發生這種情況呢?

from typing import List

def my_func(fruits: List[str] = []) -> List[str]:
    fruits.append('apple')
    return fruits
    
if __name__ == '__main__':
    print(my_func())    # ['apple']
    print(my_func())    # ['apple', 'apple']
    print(my_func())    # ['apple', 'apple', 'apple']

原因是:當我們定義函數 my_func() 時,Python解釋器只會讀取 fruits: List[str] = [] 一次。

如果我們執行 fruits.append('apple') 或其他行為,對 fruits 的這一改變將會保留在函數中,因為 fruits 不會再被賦值給 []。

6. 那么應該如何避免這種情況呢?

只需要將 fruits: List[str] = [] 的默認值修改為 None(不可變數據類型),并且在函數體中對 fruits 做一個是否為 None 的判斷即可。

from typing import List

def my_func(fruits: List[str] = None) -> List[str]:
    if fruits is None:
        fruits = []
    fruits.append('apple')
    return fruits
    
if __name__ == '__main__':
    print(my_func())    # ['apple']
    print(my_func())    # ['apple']
    print(my_func())    # ['apple']
  • 在函數定義中,我們將默認參數 fruits 的默認值設為不可變值 None。
  • 然后,我們判斷 fruits 是否為 None, 即 if fruits is None:,如果是則將其賦值給 []。

通過這種方式,就不會像使用可變默認參數那樣產生奇怪的副作用(不期望的結果)。雖然這樣使得代碼變得更長,但為了確保邏輯的正確性,這是必須要做的事。

7. 結論

今天的分享到此結束,感謝你的閱讀,希望這些淺顯易懂的內容對你有所幫助!

責任編輯:華軒 來源: 數據派探險家
相關推薦

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2017-10-14 13:54:26

數據可視化數據信息可視化

2018-09-26 16:15:31

數據可視化大數據數據分析

2023-10-31 08:51:25

數據結構存儲數據

2021-02-21 08:11:46

PythonDash工具

2013-05-07 14:56:27

大數據應用工具數據中心網絡

2017-04-19 08:32:50

大數據數據可視化編程工具

2023-05-06 12:57:34

Python工具

2018-02-04 22:22:46

大數據開發工具

2020-10-21 14:57:04

數據結構算法圖形

2015-08-20 10:00:45

可視化

2023-03-08 08:03:09

數據結構算法歸并排序

2021-02-25 15:21:27

Python 開發編程語言

2021-02-07 20:23:09

GoogeBlockly可視化編程

2022-03-03 13:02:37

可視化網頁低代碼編程工具

2020-06-03 07:00:00

數據可視化大數據

2021-01-05 11:05:35

數據可視化工具大數據

2023-04-14 08:21:55

2020-12-28 10:20:57

數據可視化工具大數據

2018-05-31 08:25:13

誤區工具可視化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩中文在线 | 欧美一级片在线看 | 天天干狠狠操 | 久久久久久国产精品 | 草草草草视频 | 国产精品成人一区二区 | 国产精品美女久久久久aⅴ国产馆 | 日韩免费一级 | 久久综合入口 | 特级黄一级播放 | 亚洲中字在线 | 在线播放国产一区二区三区 | 久久99精品视频 | 亚洲日韩中文字幕 | 日韩中文一区 | 国产中文视频 | 国产欧美精品一区二区三区 | 91精品免费视频 | 99久久成人 | 色免费看 | 日韩中文字幕在线 | 亚洲 欧美 日韩 在线 | 91一区二区三区在线观看 | 精国产品一区二区三区四季综 | 中文字幕 亚洲一区 | 成人国产精品 | 韩日一区二区三区 | 国产精品一区二区在线 | 国产98色在线 | 日韩 | 国产精品99久久久久久久vr | 97久久精品午夜一区二区 | 亚洲精品一区二区三区蜜桃久 | 9久9久| 在线免费观看视频你懂的 | 国产精品视屏 | 亚洲视频在线免费观看 | 久久免费精彩视频 | 成人在线中文字幕 | 免费看一区二区三区 | 国产精品久久久久久久久久免费看 | 久久国产三级 |