2016/06/22更新

[Python] *を用いて位置引数をタプル化する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
Pythonには時々独特な記法がありますが、今回はその中の1つ、「*(アスタリスク)」を用いた位置引数のタプル化」を扱ってみたいと思います。

画像

目次




*を用いた位置引数のタプル化とは

Pythonコードやドキュメントで、時々以下のような引数を持った関数を見たことがあるのではないでしょうか?
def print_args(*args):
    print("Positional arguments tuple:", args)
上記の*argsが今回取り上げたいところで、*を使って位置引数をタプルとして受け取れるようにしています。具体的には、以下のように引数をいくつでも指定することができます。
# 引数なしで呼び出した
print_args()
# Positional arguments tuple: ()

# 引数を3つ指定して呼び出した
print_args("a", "b", "c")
# Positional arguments tuple: ('a', 'b', 'c')
このように*argsを引数に定義することで、位置引数(※1)の数を任意にすることができます。


※1 ちょっと余談:位置引数とは

上記で何度か「位置引数」という単語が出てきました。実のところPythonの関数の引数には2種類あり、それぞれ「位置引数」と「キーワード引数」と言います。
例えば以下のような関数があるとします。
def do_something(arg1, arg2, arg3):
    print(arg1, arg2, arg3)
これを、以下のように呼び出すと、位置引数を指定した呼び出しとなり、
# 位置引数を用いて関数を呼び出す
do_something("a", "b", "c")
# a b c
以下のように呼び出すと、キーワード引数を指定した呼び出しとなります。
# キーワード引数を用いて関数を呼び出す
do_something(arg1="a", arg2="b", arg3="c")
# a b c
このように、関数の引数には位置引数とキーワード引数があり、今回は位置引数についてブログを書いている次第です。



必須の引数との組み合わせ

*を用いた位置引数のタプル化は、必須の引数と組み合わせても使うことができます。その場合には、必ず、必須の引数の後にタプル化する引数を指定します。
# 必須引数と位置引数の組み合わせ
def print_more(required1, required2, *args):
    print("required1:", required1)
    print("required2:", required2)
    print("other:", args)

# 引数2個の場合
print_more(1, 2)
# required1: 1
# required2: 2
# other: ()

# 引数3個の場合
print_more(1, 2, 3)
# required1: 1
# required2: 2
# other: (3,)

# 引数5個の場合
print_more(1, 2, 3, 4, 5)
# required1: 1
# required2: 2
# other: (3, 4, 5)

# 必須引数が足りなければエラー
print_more(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: print_more() missing 1 required positional argument: 'required2'



引数をタプルで渡す

今までは関数の受ける側のタプル化の話でしたが、タプルを用いて位置引数を関数に渡すこともできます。具体的には以下のような実装を行います。
# 位置引数が2つの関数
def say_hello(name, age):
    print("Hi, my name is %s, %d years old" % (name, age))

# 関数に渡したい値をタプルで用意して、タプルで渡す
user = ("Yohei", 30)
say_hello(*user)
# Hi, my name is Yohei, 30 years old
このように、いろいろと柔軟に関数を定義/利用できるところは、Pythonの魅力ですね!



参考資料

Pythonの基礎勉強は、以下の書籍を熟読して猛威勉強中です。色々と掲載されていて非常に参考になります。

『入門 Python 3(O'Reilly)』



最後に

今日は*を用いた位置引数のタプル化を書きました。最初にこれを見たときはポインター渡しか何かと勘違いしていましたが、学んでみると便利なものだなぁと理解することができました。Pythonはいろいろと便利ですね。

最後になりますが本ブログでは、Python・Swift・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。