見出し画像

59【完全ガイド】Pythonの位置専用引数・キーワード専用引数とアンパックの使い方!

こんにちは!TechCommitメンバーの友季子です♬
今回は、Pythonの関数における「位置専用引数」「キーワード専用引数」「アンパック」について、まとめてみます!
特にPythonを学んでいる方や、関数定義の高度な使い方を知りたい方に役立つ情報です。自分のコードをさらにスマートにしたい方の参考になる部分があれば幸いです



1. 位置専用引数 (/ を使う)

位置専用引数とは?

位置専用引数とは、関数に引数を位置で渡す必要がある場合に使われます。これにより、関数を呼び出すときに、引数を必ず位置引数として渡さなければならなくなります。

Pythonでは、関数定義で / を使うことで位置専用引数を指定できます。 / より前にある引数はすべて位置専用となります。

使い方

def add(a, b, /): return a + b

この関数 add では、引数 a と b が位置専用引数として定義されています。これらの引数は位置引数で渡す必要があります。

add(3, 4) # OK 
add(a=3, b=4) # TypeError: 
add() got some positional-only arguments passed as keyword arguments

a=3 のようにキーワード引数で指定するとエラーになります。

位置専用引数を使うメリット

  • 直感的な呼び出し: 関数の引数が位置で渡されることが明確で、コードを読む人にもわかりやすい。

  • 引数名の変更に柔軟: 呼び出す側が引数名を意識する必要がないので、将来的に関数内の引数名を変更しても影響を受けにくい。

問題1: 次の関数呼び出しのうち正しいものはどれでしょう?

def subtract(a, b, /): return a - b

A. subtract(10, 5)B. subtract(a=10, b=5)C. subtract(10, b=5)

解答: A
解説: a と b は位置専用引数なので、キーワード引数で指定するとエラーになります。


2. キーワード専用引数 (* を使う)

キーワード専用引数とは?

キーワード専用引数は、関数の引数を必ずキーワードで指定する必要がある場合に使います。関数定義で * を使用すると、その後に続く引数はすべてキーワード引数として指定する必要があります。

使い方

def greet(*, name, message): return f"Hello {name}, {message}"

この関数 greet では、name と message がキーワード専用引数です。したがって、呼び出すときには次のようにキーワード引数で指定します。

greet(name="Alice", message="Good morning!") # OK greet("Alice", "Good morning!") # TypeError: greet() takes 0 positional arguments but 2 were given

位置引数で name と message を指定するとエラーになります。

キーワード専用引数を使うメリット

  • 可読性の向上: 関数呼び出し時に、引数名が明示されるので、何が渡されているのかが一目瞭然。

  • 引数の順序に依存しない: キーワード引数を使うため、引数の順番に縛られない。

問題2: 次の関数呼び出しのうち正しいものはどれでしょう?

def introduce(*, first_name, last_name): return f"My name is {first_name} {last_name}."

A. introduce("John", "Doe")B. introduce(first_name="John", last_name="Doe")C. introduce(first_name="John", "Doe")

解答: B
解説: first_name と last_name はキーワード専用引数なので、キーワード引数で指定する必要があります。


3. アンパック (Unpacking) の使い方

アンパックとは?

Pythonのアンパック機能は、リストや辞書などのデータ構造の中身を展開して、関数に渡すために使います。これを使うと、個々の引数を手動で指定する手間が省け、より柔軟に引数を渡すことができます。

タプルやリストのアンパック (* を使う)

例えば、タプルやリストの中の値を一度に関数に渡したい場合、* を使います。

def show_values(a, b, c): print(a, b, c) values = (1, 2, 3) show_values(*values) # 1 2 3

この場合、*values によってタプル (1, 2, 3) が展開され、a, b, c にそれぞれの値が渡されます。

辞書のアンパック (** を使う)

辞書の内容をキーワード引数として関数に渡したいときは、** を使います。

def display_person(name, age): print(f"{name} is {age} years old.") person = {"name": "Alice", "age": 30} display_person(**person) # Alice is 30 years old.

**person によって辞書のキーと値が展開され、それぞれ name と age に渡されます。

問題3: 次のコードは正しく動作するでしょうか?

def show_info(a, b, c): print(a, b, c) info = {"a": 1, "b": 2, "c": 3} show_info(**info)

A. 正しく動作する
B. TypeError になる
C. SyntaxError になる

解答: A
解説: 辞書のアンパック **info によって、キーと値が正しく展開され、関数に渡されます。


終わりに

いかがでしたか?今回は、**Pythonの「位置専用引数」「キーワード専用引数」そして「アンパック」**について、より深く解説し、いくつかの問題も出しました!これらの機能を使うことで、関数定義がより柔軟で、明示的に記述できるようになります。

もし、この記事がPythonの学習やコーディングの参考になれば幸いです。これからもどんどん学んで、実際のプロジェクトで活用してみてくださいね!

【参考文献】


この記事が気に入ったらサポートをしてみませんか?