第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么 *args 參數(shù)解包會(huì)給出一個(gè)元組?

為什么 *args 參數(shù)解包會(huì)給出一個(gè)元組?

縹緲止盈 2021-10-10 16:09:27
在 python 中,可以定義一個(gè)帶有任意數(shù)量的位置參數(shù)的函數(shù),如下所示:def f(*args):    print(args)f(1, 2, 3)  # (1, 2, 3)當(dāng)調(diào)用 as 時(shí)f(a, b, c),所有位置參數(shù)都放在一個(gè)元組中。這種行為在 python 2和3文檔中有所描述,但我還沒(méi)有找到它的 PEP。PEP 3132,first, *middle, last = seqence在“接受”下引入擴(kuò)展的可迭代解包 ( ) 狀態(tài),即使加星標(biāo)的目標(biāo)成為元組而不是列表。這將與函數(shù)的 *args 一致,但會(huì)使結(jié)果的進(jìn)一步處理更加困難。進(jìn)行了討論。如果我寫(xiě)了一個(gè)包裝器,我可能還想進(jìn)一步處理這樣的參數(shù):def force_type(position, type):    def wrapper(f):        def new(*args, **kwargs):            args = list(args)  # Why?            args[position] = type(args[position])            return f(*args, **kwargs)        return new    return wrapper@force_type(1, int)def func(a, b, c):    assert isinstance(b, int)這進(jìn)一步處理由較硬的事實(shí)args是一個(gè)tuple。在引入的早期階段是否沒(méi)有使用包裝器?如果是這樣,為什么這在 python3 中沒(méi)有通過(guò)其他兼容性破壞性更改進(jìn)行更改(PEP3132 更傾向于易于處理而不是一致性(這似乎至少類似于兼容性破壞性更改中的兼容性)。為什么 a 函數(shù)*args(仍然)atuple即使 alist允許更容易的進(jìn)一步處理?
查看完整描述

3 回答

?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

我不知道這是否是它背后的想法,但是處理的簡(jiǎn)便性(即list使用tuple數(shù)據(jù)實(shí)例化 a并不難)可能會(huì)出現(xiàn)令人困惑的行為。


def fce1(*args):

   fce2(args)

   # some more code using args


def fce2(args):

   args.insert(0, 'other_val')


fce1(1, 2, 3)

編寫(xiě)fce1代碼的人可能會(huì)感到驚訝,因?yàn)閍rgs他們沒(méi)有意識(shí)到他們稍后處理的不是調(diào)用函數(shù)的內(nèi)容。


我還認(rèn)為不可變類型在內(nèi)部更容易處理并且開(kāi)銷更少。


查看完整回答
反對(duì) 回復(fù) 2021-10-10
?
MMTTMM

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊

我最好的猜測(cè)是,如果 *args 生成一個(gè)列表(可變),它會(huì)在多種情況下導(dǎo)致非常令人驚訝的結(jié)果。@Ondrej K. 給出了一個(gè)很好的例子。打個(gè)比方,當(dāng)有一個(gè)列表作為默認(rèn)參數(shù)時(shí),每個(gè)函數(shù)調(diào)用可能有不同的默認(rèn)參數(shù)。這是默認(rèn)參數(shù)只計(jì)算一次的結(jié)果,這種情況不是最直觀的。即使是官方的 python 文檔也有針對(duì)這種情況的特定解決方法。


執(zhí)行函數(shù)定義時(shí)從左到右計(jì)算默認(rèn)參數(shù)值。這意味著表達(dá)式會(huì)在定義函數(shù)時(shí)計(jì)算一次,并且每次調(diào)用都使用相同的“預(yù)計(jì)算”值。這對(duì)于理解何時(shí)默認(rèn)參數(shù)是可變對(duì)象(例如列表或字典)尤其重要:如果函數(shù)修改了對(duì)象(例如,通過(guò)將項(xiàng)目附加到列表),則默認(rèn)值實(shí)際上被修改了。這通常不是預(yù)期的。解決這個(gè)問(wèn)題的一種方法是使用 None 作為默認(rèn)值,并在函數(shù)體中明確測(cè)試它,例如:


def whats_on_the_telly(penguin=None):

if penguin is None:

    penguin = []

penguin.append("property of the zoo")

return penguin


總而言之,我認(rèn)為 *args 是一個(gè)元組,因?yàn)閷⑺鳛榱斜頃?huì)導(dǎo)致與可變類型相關(guān)的所有問(wèn)題(如速度較慢),更大的問(wèn)題是大多數(shù)人不希望函數(shù)參數(shù)發(fā)生變化。盡管我確實(shí)同意這種實(shí)現(xiàn)與PEP-3132非常不一致,并且會(huì)導(dǎo)致大多數(shù)學(xué)習(xí)者感到困惑。我對(duì) Python 非常陌生,為了與PEP-3132 的接受保持一致,我花了一段時(shí)間才理解 *args 成為元組而不是列表的原因可能是什么。


查看完整回答
反對(duì) 回復(fù) 2021-10-10
?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

為什么不?關(guān)于元組的事情是,你不能在創(chuàng)建后改變它。這允許提高執(zhí)行腳本的速度,并且您實(shí)際上不需要函數(shù)參數(shù)列表,因?yàn)槟鷮?shí)際上不需要修改函數(shù)的給定參數(shù)。你需要為你的參數(shù)附加或刪除方法嗎?在大多數(shù)情況下,它不會(huì)。你想讓你的程序運(yùn)行得更快嗎?那會(huì)是的。這就是大多數(shù)人喜歡擁有東西的方式。*args 的東西因此返回元組,如果你真的需要一個(gè)列表,你可以用一行代碼來(lái)轉(zhuǎn)換它!

args = list(args)

所以總的來(lái)說(shuō):它可以加快您的程序執(zhí)行速度。你不要改變論據(jù)。改變它的類型并不難。


查看完整回答
反對(duì) 回復(fù) 2021-10-10
  • 3 回答
  • 0 關(guān)注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)