Pythonの処理において「アスタリスク(*)」は変数を扱うにあたって、重要な機能の1つです。
リストやタプルなどの変数での応用、関数やメソッドの引数における使い方など、さまざまな場面で活用することができます。
本記事ではそんな「アスタリスク(*)」のさまざまな使い方についてを知っていきましょう。
目次
閉じる
1.Pythonでのアスタリスク(*)の役割
Pythonに限らず、プログラミングにおけるアスタリスク(*)の使用方法で真っ先に思い浮かぶのは以下のような数値の計算です。
例)
6*4 #6×4 2**5 # 2の5乗
24 32 |
Pythonにおいては数値計算以外にも以下のような使用方法があります。
可変長引数の定義
変数定義の拡張
リストやタプル、文字列などの拡張
リストやタプルのunpacking(アンパッキング)
上記の詳しい内容は次章以降でコード例も交えて見ていきましょう。
可変長引数とは
可変長引数とは、「関数やメソッドにおいて渡す引数の数を決めずに定義する際に使用する方法」です。Pythonで引数の前に「*」「**」がついているものが可変長引数として定義されます。
引数の中に「*」「**」をつけていい引数は1つずつです。それぞれ、「*」がついた引数を「可変長位置引数」または「*args」、「**」がついた引数を「可変長キーワード引数」または「**kwargs」と呼び、役割も変わってきます。詳しくは後述の例などを含めて、確認してみてください。
可変長位置引数と可変長キーワード引数
まず初めに、引数には可変長位置引数と可変長キーワード引数があります。具体的には以下の通りです。
例)
def func(a, b, c): print(a) print(b) print(c)
func(1, 2, 3)
func(a=1, c=3, b=2)
# 位置引数 1 2 3
1 2 3 |
上記からもわかるように関数を実行する際、変数名を指定せずに書いてある順番に代入するのが「位置引数」、キーワードを指定して代入するのが「キーワード引数」になります。
「*args」は余分な位置引数をタプルとして受け取り、「**kwargs」は余分なキーワード引数を辞書として受け取ります。
次章からはアスタリスクの個数ごとの使用方法を説明していきます。
2.Python変数とアスタリスク(*)1個
ここから説明するのはアスタリスクが1個の場合についてになります。
変数定義の拡張
アスタリスクを使用することで変数定義の拡張をすることが可能です。
Pythonでは複数の変数を以下のように同時に定義できます。
a1,a2,a3=1,2,3 print(a1) print(a2) print(a3)
1 2 3 |
この時、左辺にカンマ区切りで定義した変数名と右辺にカンマ区切りで定義した値の数を同じにすることが必要です。同じでないと以下のようにエラーが発生します。
a1,a2=1,2,3 print(a1) print(a2)
too many values to unpack (expected 2) |
ここでアスタリスクの出番です。アスタリスクを使用することで右辺の値の数が多い分には対応できるようになります。
具体的には以下の通りです。
【1つ目の変数についている場合】
*a1,a2,a3,a4 = 1,2,3,4,5,6,7,8,9 print(a1) print(a2) print(a3) print(a4)
[1, 2, 3, 4, 5, 6] 7 8 9 |
【2つ目以降の変数についている場合】
a1,*a2,a3,a4 = 1,2,3,4,5,6,7,8,9 print(a1) print(a2) print(a3) print(a4)
1 [2, 3, 4, 5, 6, 7] 8 9
list = [1, 2, 3, 4, 5] tuple = (1, 2, 3, 4, 5)
a3,*a4 = tuple
print(a2) print(a3) print(a4)
[1, 2, 3, 4] 5 1 [2, 3, 4, 5] |
上記の通り、左辺の変数名の数に対して、多い分の右辺の値をアスタリスクを付けた変数にリストとして格納します。
複数の変数を一度に定義する場合だけでなく、エラー発生時の確認にも使用できるので活用してみると良いでしょう。
タプルやリスト、文字列などの拡張
アスタリスクはかけ算と同じような方法で他のデータ型の拡張(繰り返し)をすることが可能です。
具体的には以下のようになります。
例)
# 文字列 str = “Python *” print(str * 3)
tuple = (2,) print(tuple * 4)
list1 = [1, 2, 3] list2 = [[1, 2, 3]] print(list1 * 3) print(list2 * 2)
# 文字列 Python Python Python *
(2, 2, 2, 2)
[1, 2, 3, 1, 2, 3,1, 2, 3] [[1, 2, 3], [1, 2, 3]] |
こちらのようにアスタリスクを使うことで同じ値を複数に拡張することが可能です。値を複数表示したい場合や同じ値で増やしたい場合などに活用すると良いでしょう。
リストやタプルなどのunpacking(アンパッキング)
リストやタプル、辞書などの複数の値を含んでいるデータ型アンパッキング(展開または分解)する際にもアスタリスクは活用されます。
それぞれ見ていきましょう。
例)
# タプル tuple = (1, 2, 3) print(*tuple)
list = [1, 2, 3, 4] print(*list)
dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} print(*dict) print(*dict.values())
# タプル 1 2 3
1 2 3 4
key1 key2 key3 value1 value2 value3 |
上記のようにリストやタプル、辞書を展開することが可能です。この機能はデバッグやエラーなどのログ表示で活用できるでしょう。
可変長引数の位置引数定義(*args)
可変長の位置引数の基本
関数の引数定義において、アスタリスクが1個で定義可能なのが「可変長の位置引数」です。具体的に見ていきましょう。
例)
def func(*args): print(args)
func(1, 2, 3) func(1, 2, 3, “aaa”)
(1,) (1, 2, 3) (1, 2, 3, “aaa”) |
このように可変長の位置引数は関数内でタプル型で格納されます。引数に指定するデータ型は統一しなくとも実行が可能です。
可変長の位置引数の注意点
可変長の位置引数を関数に使用する場合には他の引数を定義することも可能ではあります。しかし、その場合は可変長の位置引数の前に定義するか、後に定義するかで注意が必要です。
def func(before, *args, after): print(before) print(args) print(after) # OK func(1, 2, 3, after=“aaa”)
func(1, 2, 3, “aaa”)
# OK 1 (2, 3) aaa
TypeError: func() missing 1 required keyword-only argument: 'after' |
上記からわかるように可変長の位置引数の前にある引数(例のbefore)は通常の位置引数と同じように使用することが可能になります。しかし、可変長の位置引数の後にある引数(例のafter)はキーワード引数として代入しないとエラーとなり実行が不可能です。
これはキーワード引数以外が可変長の位置引数の一部と認識され、最後の変数が未代入扱いにされてしまうという処理が発生しています。
こちらを防ぎたい場合の対処法の1つが以下のように後の引数にデフォルト値を設定する方法です。
例)
def func(before, *args, after=”default”): print(before) print(args) print(after)
(2, 3, 'aaa') default |
値をリストや辞書型に変換する際などに重宝する処理なので、しっかりと使用方法を覚えておきましょう。
関連記事
Python配列完全ガイド|初期化・追加・操作・要素数・二次元化から配列操作・連想配列まで徹底解説
3.Python変数とアスタリスク(**)2個
可変長引数のキーワード引数定義(kwargs)
可変長のキーワード引数の基本
関数定義でアスタリスクが2個で定義可能なのが「可変長のキーワード引数」です。
例)
def func1(before, **kwargs): print(before) print(kwargs)
print(args) print(kwargs)
func2('位置変数', 'キーワード引数', a='aaa', b='bbb', c='ccc')
位置変数 {‘a’: ‘aaa’, ‘b’: ‘bbb’, ‘c’: ‘ccc’}
{‘a’: ‘aaa’, ‘b’: ‘bbb’, ‘c’: ‘ccc’} |
func1のように通常の引数と可変長のキーワード引数を組み合わせることも可能ですが、基本的にはfunc2のように可変長の位置引数と可変長のキーワード引数はセットで使用されます。
可変長のキーワード引数の注意点
キーワード引数と位置引数は順番が大切です。位置引数とキーワード引数の順番をバラバラに代入した場合はエラーとなってしまうため注意しましょう。
例)
def func(*args, **kwargs): print(args) print(kwargs)
SyntaxError: positional argument follows keyword argument |
上記のような代入を行った場合にはエラーが発生してしまいます。関数の実行を行う際には位置引数とキーワード引数のまとまりにして代入するようにしましょう。
関連記事
Pythonとは?コードの具体例など人気プログラミング言語を初心者にわかりやすく解説
4.まとめ
ここまでPythonでのアスタリスク「*」の使用方法について紹介してきました。
本業でPythonの開発チームに加わった時やフリーランスで業務を受けた時にお客様のルールにもよりますが、本記事で紹介した機能を活用することでエラーを減らし、業務の効率化も期待できるでしょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。