位置引数とキーワード引数


81

基づいて、この

位置引数は、等号(=)とデフォルト値が後に続かない名前です。

キーワード引数の後には、等号とデフォルト値を与える式が続きます。

def rectangleArea(width, height):
    return width * height

print rectangleArea(width=1, height=2)

質問>とは両方とも位置引数であるwidthと思いheightます。では、なぜキーワード引数構文で呼び出すことができるのでしょうか。


1
「なぜキーワードの実引数構文で呼び出すこともできるのですか?」それが言語の仕組みだからです。
S.Lott 2012

回答:


152

引用するテキストは関数の定義用であり、関数の呼び出しとは関係ありません。その関数の呼び出しでは、「名前付き引数」機能を使用しています。あなたが提供するそのリンクはあまり質の良いものではありません、著者は2つの異なるものの間で混乱しているようです。

Pythonリファレンスは、関数の呼び出しに関してのみ、位置引数とキーワード引数を参照します(セクションを参照5.3.4 Calls)。

セクション7.6 Function definitionsで関数の定義について話すとき、それは「デフォルトのパラメータ値」というまったく異なる用語です。

そのコースウェアをまとめた人々はPythonに完全に精通していなかったと思います:-)


例として、次の定義と呼び出しを参照してください。

def fn (a, b, c = 1):          # a/b required, c optional.
    return a * b + c

print fn (1, 2)                # returns 3, positional and default.
print fn (1, 2, 3)             # returns 5, positional.
print fn (c = 5, b = 2, a = 2) # returns 9, named.
print fn (b = 2, a = 2)        # returns 5, named and default.
print fn (5, c = 2, b = 1)     # returns 7, positional and named.
print fn (8, b = 0)            # returns 1, positional, named and default.

=定義にあるか呼び出しにあるかに応じて、変更の意味が変わります。

定義では、引数をオプションとしてマークし、デフォルト値を設定します。

呼び出しでは、必要な順序で、どの引数をどの値にするかを指定できます。


36

Python 3.8では位置引数のみが導入されたため、この投稿は更新が必要です。

位置引数、キーワード引数、必須引数、およびオプションの引数は、しばしば混同されます。位置引数は、必須の引数と同じではありません。およびキーワード引数は、オプションの引数と同じではありません

位置引数は、関数定義内の位置によって呼び出すことができる引数です。

キーワード引数は、名前で呼び出すことができる引数です。

必須の引数は、関数に渡さなければならない引数です。

オプションの引数は、関数に渡すことができない引数です。Pythonでは、オプションの引数はデフォルト値を持つ引数です

オプションの位置引数(python 3.8)

def f(a=2, /):
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

必要な位置引数(python 3.8)

def f(a, /):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

オプションのキーワード引数

def f(*, a=1):
    pass


f()  # Allowed
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

必要なキーワード引数

def f(*, a)
    pass


f()  # Error, argument required
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

オプションの位置引数とキーワード引数

def f(a=1)
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a=1, /):
    pass

必要な位置引数とキーワード引数

def f(a):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a, /):
    pass

結論として、引数はオプションでも必須でもかまいませんが、同時に両方ではありません。位置、キーワード、またはその両方を同時に使用することもできます。

Python 3.8では、位置のみのパラメーターが導入されました。

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass

最後の2つの例ではf(/,a,*)なく、という意味f(*, a, /)ですか?
Jagerber 4820

21

キーワード引数は、デフォルト値を持つ単なる定位置引数です。デフォルト値を持たないすべての引数を指定する必要があります。つまり、キーワード引数は、特に指定されていない場合はデフォルト値に設定されるため、「オプション」にすぎません。


それは理にかなっていますが、なぜ「キーワード」引数と呼ばれるのかについて詳しく説明していただけますか?「positional」引数は、関数を呼び出すときにそれらの位置が重要であることを意味することを私は知っています。
はNoName

3

位置引数は、値を順番に使用するか、それぞれに名前を付けることによって呼び出すことができます。たとえば、次の3つすべてが同じように機能します。

def rectangleArea(width, height):
    return width * height

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))

これは正しくないと思います。ここにあるPythonの公式用語集によると、位置引数はキーワード引数ではない引数です。キーワード引数の定義は、name=関数呼び出しで識別子(例)が前に付いている引数、またはが前に付いている辞書の値として渡される引数です**。これらの2つの定義は、あなたの例と矛盾します。
ラファエル

1

位置引数:正しい位置順序で関数に渡される引数。以下のプログラムは、関数の位置引数を理解します

#positional arguments example
def combine(str1, str2):
#To join str1 and str2 with str3
    str3 = str1 + str2
    print(str3)

#call combine() and pass 2 strings
combine("Well", "come")   #positional arguments 

最初に「come」、次に「well」を渡したとすると、結果はcomewellになります。また、関数を呼び出すと3文字列がエラーになります。


0

関数のキーワード引数を理解します。

キーワード引数は、名前でパラメーターを識別する引数です。

#keyword arguments example: 
def employee(name, Id):
    print("Employee Name: ", name)
    print("Employee Id  : ", Id)
#call employee() and pass 2 arguments
employee(name = "inban", Id = "pay001")
employee(Id = "pay002", name = "karthik") #we can change the order args.

0

ここでパラメータと引数を定義すると役立つ場合があります。

  1. パラメータ:引数を指定する関数/メソッド定義の名前付きエンティティ。
  2. 引数:関数に渡される値。

例えば、

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

ここで、位置引数と言うときは、引数について話しているので、関数の定義とは何の関係もありません。widthそしてheightあなたの例では、位置パラメータですのキーワードパラメータ(いわゆるキーワード位置-またはパラメータ)。

値を呼び出す/関数に渡す方法によって、それらが位置引数であるかキーワード引数であるかが決まります

rectangleArea(1, 2) # positional arguments
rectangleArea(width=1, height=2) # keyword arguments

多くの人々が知っている事は、あなたが使用することにより、位置のみのパラメータを指定することができるということである/パラメータリスト(の例ではここに)。

def func(positional_only1, positional_only2, /, positional_or_keyword): ...

同様に、*文字を使用してキーワードのみのパラメーターを設定することもできます。

def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...

最後に、var-positionalとvar-keyword(それぞれ* argsと** kwargs)もあります。つまり、任意の順序の位置引数またはキーワード引数を関数に渡すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.