最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小議Python中自定義函數的可變參數的使用及注意點

 更新時間:2016年06月21日 15:50:22   作者:TypingQuietly  
Python函數的默認值參數只會在函數定義處被解析一次,以后再使用時這個默認值還是一樣,這在與可變參數共同使用時便會產生困惑,下面就來小議Python中自定義函數的可變參數的使用及注意點

可變參數

Python的可變參數有兩種,一種是列表類型,一種是字典類型。列表類型類似 C 中的可變參數,定義方式為

def test_list_param(*args) :
  for arg in args :
    print arg

其中 args 是一個 tuple。
字典類型的可變參數:

def test_dict_param(**args) :
  for k, v in args.iteritems() :
    print k, v

其中 args 是一個 dictionary
可以分別傳遞 tuple 和 dictionary 給相應的可變參數,格式如下

a = (1, 2, 3)
b = {"a":1, "b":2, "msg":"hello"}
test_list_param(*a)
test_dict_param(**b)

帶默認參數的函數

函數的帶默認值參數能夠很大程度上方便我們使用:一般情況下可以省略傳參使用參數的默認值,也可以主動傳參;調用的時候也不用在意參數的順序方便使用,并且直接、顯式;甚至還能用來當作魔法值,做一些邏輯上的控制。

但是由于python的默認值參數只會在函數定義處被解析一次,此后每次調用函數的時候,默認值參數都會是這個值了。碰到一些不可變的數據類型比如:整型,字符串,元祖之類的還好,但如果碰到可變類型的數據比如數組的話,就會有發(fā)生一些意想不到的事情。
讓我們舉一個簡單的例子說明一下:

def add_to(num, target=[]):
  target.append(num)
  print id(target), target

add_to(1)
# Output: 39003656, [1]
add_to(2)
# Output: 39003656, [1, 2]
add_to(3)
# Output: 39003656, [1, 2, 3]

很顯然如果你是想每次調用函數都能得到一個新的包含期望結果的數組,肯定不能如愿了。函數add_to的參數target在函數第一次被解析的時候會被賦值成空的數組,因為只會被解析一次,以后每次調用的時候都會在這個target變量的基礎上進行操作,變量的id值也完全一樣。想要得到預期的結果,可以為這種可變數據類型的參數指定一個None來表示空值:

a = (1, 2, 3)
b = {"a":1, "b":2, "msg":"hello"}
test_list_param(*a)
test_dict_param(**b)

在python的世界里,參數是按標識符傳遞(粗暴點解釋就是按引用傳遞的),你需要擔心的是參數的類型是否是可變的:

>>> def test(param1, param2):
...   print id(param1), id(param2)
...   param1 += 1
...   param2 += 1
...   print id(param1), id(param2)
...
>>> var1 = 1
>>> var2 = 2
>>> print id(var1), id(var2)
36862728 36862704
>>> test(var1, var2)
36862728 36862704
36862704 36862680

可變的數據類型,函數局部作用域里面的任何改變會保留在數據上;不可變的數據類型,發(fā)生的任何改變都只會體現在新生成的局部變量上,如同上面的列子中所示的效果,讀者可以對比一下。

相關文章

  • python 字典生成樹狀圖的實例

    python 字典生成樹狀圖的實例

    這篇文章主要介紹了python 字典生成樹狀圖的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python中flask框架跨域問題的解決方法

    Python中flask框架跨域問題的解決方法

    本文主要介紹了Python中flask框架跨域問題的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python合并字符串的3種方法

    Python合并字符串的3種方法

    這篇文章主要介紹了Python合并字符串的3種方法,本文講解了使用+=操作符、使用%操作符、使用String的' '.join()方法3種方法,需要的朋友可以參考下
    2015-05-05
  • 時間序列重采樣和pandas的resample方法示例解析

    時間序列重采樣和pandas的resample方法示例解析

    這篇文章主要為大家介紹了時間序列重采樣和pandas的resample方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • python多進程(加入進程池)操作常見案例

    python多進程(加入進程池)操作常見案例

    這篇文章主要介紹了python多進程(加入進程池)操作,結合常見案例形式分析了Python多進程復制文件、加入進程池及多進程聊天等相關操作技巧,需要的朋友可以參考下
    2019-10-10
  • Python包資源下載路徑報404解決方案

    Python包資源下載路徑報404解決方案

    這篇文章主要介紹了Python包資源下載路徑報404解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Python2 與Python3的版本區(qū)別實例分析

    Python2 與Python3的版本區(qū)別實例分析

    這篇文章主要介紹了Python2 與Python3的版本區(qū)別,結合實例形式分析了Python2 與Python3的版本使用過程中的各種常見區(qū)別、用法與注意事項,需要的朋友可以參考下
    2020-03-03
  • python實現每次處理一個字符的三種方法

    python實現每次處理一個字符的三種方法

    這篇文章主要介紹了python實現每次處理一個字符的三種方法,是非常實用的字符串操作技巧,需要的朋友可以參考下
    2014-10-10
  • numpy的squeeze函數使用方法

    numpy的squeeze函數使用方法

    這篇文章主要介紹了numpy的squeeze函數使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 使用Python腳本將文字轉換為圖片的實例分享

    使用Python腳本將文字轉換為圖片的實例分享

    這篇文章主要介紹了使用Python腳本將文字轉換為圖片的實例分享,主要用到了PIL庫,需要的朋友可以參考下
    2015-08-08

最新評論

泾川县| 伊春市| 陆丰市| 富宁县| 古交市| 德阳市| 吉水县| 南陵县| 南木林县| 乐昌市| 乌鲁木齐市| 肥城市| 墨玉县| 仙居县| 台湾省| 孙吴县| 长治市| 西林县| 桐梓县| 宁蒗| 山阳县| 雅安市| 偃师市| 博罗县| 凤翔县| 腾冲县| 大悟县| 马山县| 勐海县| 永昌县| 新建县| 额济纳旗| 三台县| 同仁县| 新干县| 昭觉县| 资中县| 勐海县| 苍梧县| 通江县| 榆树市|