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

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

如何在Python中的非默認(rèn)參數(shù)之前聲明一個(gè)帶有默認(rèn)參數(shù)的函數(shù)?

如何在Python中的非默認(rèn)參數(shù)之前聲明一個(gè)帶有默認(rèn)參數(shù)的函數(shù)?

慕森卡 2024-01-27 15:02:27
我想聲明一個(gè)帶有非默認(rèn)(強(qiáng)制)參數(shù)的函數(shù),前面有一個(gè)默認(rèn)參數(shù),就像內(nèi)置 range 函數(shù)一樣:range(start, end, step)有辦法做到這一點(diǎn)嗎?當(dāng)我嘗試以這種方式定義一個(gè)函數(shù)時(shí),我得到了SyntaxError一個(gè)def example(a = 0, b)
查看完整描述

3 回答

?
吃雞游戲

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

在 Python 中,位置參數(shù)必須位于關(guān)鍵字參數(shù)之前——這只是該語(yǔ)言的規(guī)則。也就是說(shuō),有幾種方法(我不一定推薦)可以編寫一個(gè)函數(shù)來(lái)解決這個(gè)問(wèn)題。


這本質(zhì)上就是內(nèi)置range函數(shù)執(zhí)行您所描述的操作的方式:


def range(*args):

    # default values

    start = 0

    step = 1


    n_args = len(args)

    if not 0 < n_args < 4:

        raise TypeError(f'range expected 1 arguments, got {n_args}')

    elif n_args == 1:

        stop = args[0]

    elif n_args == 2:

        start, stop = args

    else:

        start, stop, step = args

    

    # etc...

它要求參數(shù)以特定順序傳遞,然后根據(jù)傳遞的參數(shù)數(shù)量確定要為哪些變量賦值。


或者,考慮以下事項(xiàng):


def example(a=10, b=None):

    assert b is not None, "argument 'b' is required"

    # etc...

這是一個(gè)更丑陋的解決方案,因?yàn)椋?/p>

  1. 您必須b作為關(guān)鍵字參數(shù)傳遞,而不是位置參數(shù)

  2. 函數(shù)簽名不會(huì)向用戶提供任何b所需的指示 - 它看起來(lái)像是可選的,但如果未顯式傳遞,該函數(shù)將會(huì)失敗。

  3. 您必須將參數(shù)的“無(wú)效”值設(shè)置為您 100% 確定沒(méi)有人愿意實(shí)際傳遞給該參數(shù)的值。

除非有真正令人信服的理由不這樣做,否則最好堅(jiān)持通常的格式(首先是位置參數(shù),可選地隨后收集 leftover *args,然后是關(guān)鍵字參數(shù),可選地隨后收集 leftover **kwargs)。這是人們期望使用函數(shù)的方式,并使您的代碼更易于使用和閱讀。如果確實(shí)有令人信服的理由偏離這一點(diǎn),請(qǐng)模仿 的設(shè)置range。

編輯:

回復(fù):您關(guān)于“更正”函數(shù)簽名以顯示某些參數(shù)名稱而不是 的問(wèn)題*args,上面的示例極大地簡(jiǎn)化了range內(nèi)置函數(shù)的工作方式。實(shí)際上,它是用 C 實(shí)現(xiàn)的,其簽名/文檔字符串在此處設(shè)置。它更類似于定義在__call__構(gòu)造函數(shù)內(nèi)運(yùn)行的方法的類,而不是常規(guī)函數(shù)。

手動(dòng)覆蓋對(duì)象的簽名會(huì)很棘手(更不用說(shuō)避免使用“正?!眳?shù)順序的大量額外步驟)——最好將“正確”參數(shù)名稱放入文檔字符串中。

有一些非常非常古怪的方法可以做到這一點(diǎn)。例如,您可以將函數(shù)包裝在一個(gè)裝飾器中,該裝飾器使用類似inspect.Signature修改函數(shù)對(duì)象的東西。__init_subclass__或者,也許您可以將其轉(zhuǎn)換為一個(gè)類,讓它從某個(gè)父類繼承,然后在父類和__new__子類中使用組合來(lái)攔截和修改傳遞給構(gòu)造函數(shù)的參數(shù)。但這些解決方案還遠(yuǎn)遠(yuǎn)不夠,值得一問(wèn)的是為什么沒(méi)有更簡(jiǎn)單的方法來(lái)解決這個(gè)問(wèn)題。在我看來(lái),這是因?yàn)檫@根本不是你想做的事情。


查看完整回答
反對(duì) 回復(fù) 2024-01-27
?
互換的青春

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

你不能。默認(rèn)參數(shù)必須位于參數(shù)列表的最后。如果您想要不同的行為,那么您必須在函數(shù)內(nèi)部進(jìn)行驗(yàn)證。


def primes_in_interval(start=2, end=None):

    assert(end is not None)

    # Rest of code.


primes_in_interval(end=10)

您可以執(zhí)行類似的操作來(lái)獲取您正在尋找的調(diào)用約定。


def primes_in_interval(end_or_start, end=None):

    if end is None:

        start = 2

        end   = end_or_start

    else:

        start = end_or_start

        end   = end

    # Rest of code.


primes_in_interval(10)      # Start will be 2 and end 10

primes_in_interval(8, 16)   # Start will be 8 and end 16


查看完整回答
反對(duì) 回復(fù) 2024-01-27
?
縹緲止盈

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

你不能。range定義參數(shù)的方式是內(nèi)置range的,并且使用不同的解析參數(shù)的方式,大致相當(dāng)于接收*args, **kwargs和手動(dòng)解析它們(它手動(dòng)拒絕非空kwargs,但仍然必須接受它們,因?yàn)镃Python 的 C API 的約定)。如果你想自己做,也可以,但 Python 沒(méi)有幫助:


def myrange(*args):

? ? if not args or len(args) > 3:

? ? ? ? raise TypeError("Expected 1-3 args")

? ? if len(args) == 1:

? ? ? ? start, step = 0, 1

? ? ? ? stop, = args

? ? else:

? ? ? ? start, stop, step = (args + (1,))[:3]? # Stupid trick to reduce number of cases


? ? # Actual work done here


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

添加回答

舉報(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)