Pythonの関数で使う *(アスタリスク)と **(ダブルアスタリスク)の違いとは?可変長引数を徹底解説
はじめに
Pythonの関数定義では、引数名の前に *(アスタリスク1個)や **(アスタリスク2個)を付けることで、呼び出し側から渡される可変個の引数を受け取れるようになります。本記事では、それぞれの役割と具体的な使い方をサンプルコード付きで分かりやすく解説します。
*(アスタリスク1個):可変長の位置引数を受け取る
引数名の前に * を1つ付けると、その引数はタプルとして受け取られます。これにより、呼び出し時に任意の個数の位置引数を渡すことが可能になります。
>>> def function(*arg):
... for i in arg:
... print(i)
>>> function(1, 2, 3, 4, 5)
1
2
3
4
5
この例では、function(1, 2, 3, 4, 5) のように5つの値を渡していますが、arg にはタプル (1, 2, 3, 4, 5) が格納され、for文で順番に取り出せます。なお、慣例として *args という引数名が広く使われています。
**(アスタリスク2個):可変長のキーワード引数を受け取る
引数名の前に ** を2つ付けると、その引数は辞書(dict)として受け取られます。キーワード引数として、任意の個数の「キー=値」のペアを関数に渡せるようになります。
>>> def function(**arg):
... for i in arg:
... print(i, arg[i])
>>> function(a=1, b=2, c=3, d=4)
a 1
b 2
c 3
d 4
この場合、arg は {'a': 1, 'b': 2, 'c': 3, 'd': 4} という辞書になります。こちらも慣例として **kwargs という名前がよく使用されます。
Python 3での拡張アンパック(代入文における * の活用)
Python 3では、代入文の中でも * を使用できるようになりました。これにより、リストなどのイテラブルを柔軟に展開(アンパック)できます。
>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]
>>> a, *b, c = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3]
>>> c
4
上記のように、* を付けた変数には「残りの要素」がリストとして代入されます。先頭・末尾・中間のいずれの位置に置いても機能するため、要素の分割処理を非常に簡潔に記述できるのが魅力です。
まとめ
*args:可変個の位置引数をタプルとして受け取る**kwargs:可変個のキーワード引数を辞書として受け取る- Python 3以降では、代入文でも
*を使ってイテラブルを柔軟にアンパックできる
これらの構文を使いこなせば、柔軟で再利用性の高い関数を設計できるようになります。ぜひ実際のコードで試してみてください。
-
Pythonの名前空間とは?仕組みとスコープの関係をわかりやすく解説
Pythonにおける名前空間の基本名前空間(namespace)とは、変数名とオブジェクトを対応付ける仕組みであり、スコープ(名前の有効範囲)を実現するための基盤となるものです。Pythonでは、パッケージ、モジュール、クラス、関数、メソッドなど、それぞれが独自の「名前空間」を持ち、その中で変数名が解決されます。名前空間の生成と破棄関数やモジュール、パッケージが評価されて実行が始まると、そのための新しい名前空間が作成されます。これは「評価コンテキスト」と捉えると理解しやすいでしょう。そして、関数などの実行が終了すると、その名前空間は破棄され、そこに含まれていた変数も一緒に消えます。さらに、ロー
-
Pythonの「%」演算子とは?文字列フォーマットの基本と使い方を解説
Pythonの「%」演算子の役割 Pythonにおける「%(パーセント)」は、文字列フォーマット演算子(補間演算子)として機能します。「format % values」という形式で記述すると、フォーマット文字列内の変換指定子が、values側の要素によって置き換えられます。この仕組みは、C言語のsprintf()関数とよく似ています。 基本的な使い方:文字列の埋め込み 最もシンプルな例は、文字列の中に変数の値を埋め込むケースです。 >>> lang = Python >>> print %s is awesome! % lang Python is awe