2

参考までに、この投稿の回答を参照しています

回答の作成者は次のコードを提供します

def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if neg:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15

ただし、私が実行すると、次のエラーが表示されます

NameError: global name 'neg' is not defined

誰でもこれを説明できますか。そして一般に、関数はいつvalues終了し、いつoptions開始するかをどのように認識しますか

4

2 に答える 2

4
if neg:

その行はバグです。そのはず:

if options["neg"]:

関数は、値がいつ終了し、オプションがいつ開始するかをどのように認識しますか?

名前のない値が入り*valuesます。キーワード引数は に入り**optionsます。

于 2013-08-07T14:37:15.500 に答える
3

あなたは小さな間違いを犯しました。コードを次のように変更すると、動作するはずです。辞書"neg"からの値を取得するだけです(名前のない引数を保持し、キーワード引数を保持します)optionsvaluesoptions

>>> def sum(*values, **options):
        s = 0
        for i in values:
            s = s + i
        if "neg" in options:
            if options["neg"]:
                s = -s
        return s

>>> s = sum(1, 2, 3, 4, 5, neg=True)
>>> s
-15
>>> sum(1, 2, 3, 4, 5)
15
>>> sum(1, 2, 3, 4, 5, neg=True)
-15
>>> sum(1, 2, 3, 4, 5, neg=False)
15

ただし、@glglgl が指摘したように、コードを次のように変更すると、両方のifステートメントが 1 つに消費されます。

>>> def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if options.get("neg", False):
            s = -s
    return s

どのように機能しget(...)ますか?

optionsディクショナリに key , "neg"(最初の if 条件で処理される)がない場合、 andget(...)のデフォルト値が返され、否定されません。ディクショナリの値。Falsesoptions"neg"s

于 2013-08-07T14:37:27.127 に答える