亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

變量參數 vs Python 中的列表作為函數參數

變量參數 vs Python 中的列表作為函數參數

智慧大石 2021-12-21 16:00:49
我想了解什么時候應該在 Python 2.7 的函數參數中使用可變參數 vs 列表類型假設我編寫了一個處理 URL 列表的函數。我可以用兩種不同的方式定義函數:選項1:def process_urls(urls):  if not isinstance(urls, list) or  isinstance(urls, tuple):       raise TypeError("urls should be a list or tuple type")選項 2: def process_urls(*urls):      # urls is guaranteed to be a tuple選項 2 保證urls是一個元組,但可以接受隨機數量的位置參數,這些參數可能是垃圾,例如process_urls(['url1', 'url2'], "this is not a url")從編程的角度來看,哪個選項是首選?
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

第一個,但沒有類型檢查。類型檢查殺死鴨子打字。如果調用者想要傳入生成器、集合或其他可迭代對象怎么辦?不要將它們限制為列表和元組。


查看完整回答
反對 回復 2021-12-21
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

兩者都不是最好的。每種風格在不同情況下都有好處。


大多數時候使用單個可迭代參數會更好,特別是如果調用者已經將 URL 打包到列表中。如果他們有一個列表并且需要使用 varargs 樣式,則他們需要調用process_urls(*existing_list_of_URLs)whoild 不必要地解包然后重新打包參數。正如John Kugelman在他的回答中所建議的那樣,您可能不應該使用顯式類型檢查來強制參數的類型,只需假設它是一個可迭代的并從那里開始工作。


如果您的函數主要使用單獨的 URL 調用,則使用可變參數列表可能比需要列表更好。比如,也許網址是硬編碼是這樣的:process_urls("http://example.com", "https://stackoverflow.com")。或者它們可能在單獨的變量中,但要使用的特定變量直接編碼為:process_url(primary_url, backup_url)。


最后一個選擇:支持這兩種方法!您可以指定您的函數接受一個或多個參數。如果它只得到一個,它需要一個包含 URL 的可迭代對象。如果它得到多個參數,它希望每個參數都是一個單獨的 URL。這可能是這樣的:


def process_urls(*args):

    if len(args) == 1:

        args = args[0]


    # do stuff with args, which is an iterable of URLs

這樣做有一個缺點,即自身傳遞的單個 URL 字符串將被錯誤地識別為一系列 URL,每個 URL 由原始字符串中的一個字符組成。這是一個非常尷尬的失敗案例,因此您可能需要明確檢查它。您可以選擇引發異常,或者只接受單個字符串作為參數,就像它在容器中一樣。


查看完整回答
反對 回復 2021-12-21
  • 2 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號