16

Pythonでは、デフォルトの引数が最後に来ること、およびデフォルト以外の引数がデフォルトの引数の後に続くことができないことを理解しています。それは結構です。たとえば、次のようになります。

>>> def foo(x=0, y):
        return x, y
SyntaxError: non-default argument follows default argument

さすがに大丈夫です。

ただし、最初の引数をデフォルトの引数にしたい場合はどうでしょうか。たとえば、上記のコードから明らかなxように、最初の引数である必要があり、デフォルト値は0である必要があります。

これを行うことは可能ですか?range関数の中でも、次のようなものだと思いますので、お願いします。

def range(start=0, end):
    pass

では、これはどのように行われ、それが不可能な場合、これはどのように実装されrangeますか?私は最初の引数をデフォルトにすることを主張していることに注意してください。それが全体のポイントです。range私の問題に完全に適合するので、例として使用しています。もちろん、rangeとして実装することもできますdef range(end, start=0)が、それは重要ではありません。

4

6 に答える 6

11

さて、rangeこれを少し良くすることができるCコードです。とにかく、あなたはこれを行うことができます:

def range(start, stop=None):
    if stop is None: # only one arg, treat stop as start ...
        stop = start
        start = 0
    ...

それに応じて機能を文書化します。

于 2010-11-09T19:50:35.620 に答える
3

いくつかのアプローチがあります。最初の方法は、引数の一部が「なし」の場合、関数内の引数を切り替えることです。それはこのように機能します。

def range1(value, end=None):
    if end == None:
        end = value
        value = 0
    return _generate_range_values(value, end)

もう 1 つの主な方法は、関数が受け取るすべての引数のリストを関数に取得させることです。次に、引数の数に基づいて何をすべきかを決定できます。

def range2(*args):
    if len(args) == 1:
        start = 0
        end = int(args[0])
    elif len(args) == 2:
        start = int(args[0])
        end = int(args[1])
    return _generate_range_values(start, end)

3 つ目は、名前付き引数を関数に渡すようユーザーに促すことです。これにより、順序の重要性が低くなります。

def range3(end, start=0):
    return _generate_range_values(start, end)

次に、ユーザーは、0 以外の何かが必要な場合に、名前付きの start 引数を指定して呼び出します (名前付きの引数は必要ありませんが、コードを明確に保ちます。

for i in range3(55, start=12)
于 2010-11-09T19:54:44.180 に答える
2

によって実装されていませんrange。タプルまたはディクテーションを必要に応じて使用*argsまたは処理できます。**args例えば:

def f(* args):
  len(args)== 1の場合:
     「最初のものがデフォルトであると仮定して」を印刷します
  elif len(args)== 2:
     「2つの引数が渡されました」と出力します
  そうしないと:
     「不平」を印刷

于 2010-11-09T19:50:39.957 に答える
1

本当に必要な場合は、例外を自分で処理できます

def Range(start=0, end=None):
    if end is None:
        raise AttributeError("end value not specified")
     pass
于 2010-11-09T19:50:24.107 に答える
1

範囲のコードはありませんが、この種のトリックを実行することは確かです:

def range(start, stop=None, step=1):
    if stop is None:
        start, stop = 0, start
    ...

編集: martineau のコメントごとに修正されたコード。

于 2010-11-09T19:55:05.973 に答える
0

最初のデフォルト値パラメーターの後に他のパラメーターが続く関数の場合:

def fn(first=value, *rest):
    # code

例えば:

def fn(first=1, *rest):
    print(first)

fn()
fn(11, 2, 3)
>>>
1
11
于 2020-12-14T01:55:15.200 に答える