Python 位置引数のタプル化

Python学習【365日チャレンジ!】51日目のマスターU(@Udemy11)です。

いよいよ4月に入りましたね。

4月といえば、Udemyでは毎年、新年度の応援キャンペーンを実施していて、各講座が最安値で購入できるチャンスになっています。

もちろんUdemy最大のセールはブラックフライデーになるわけですが、春の新学期セールもかなりお得なセールには間違いありません。

ぜひ、この機会に気になっていた講座を購入しておきましょう!

それでは、今日もPython学習を進めていきましょう!

昨日の復習

昨日は、デフォルト引数を使う際の注意点を学習しました。

デフォルト引数でリストを指定するときは、引数のリストが指定されない場合は、参照渡しになって、何度も関数を実行するときは、デフォルト引数の値が勝手に変わってしまうことがあるため、直接リストを指定してはいけませんでした。

def num_func(x, l=[]):
    l.append(x)
    return l
 
m = num_func(10)
print(m)
n = num_func(10)
print(n)

出力結果

[10]
[10, 10]

なので、リストをデフォルト引数に指定するときは、引数がNoneであるかどうかの判断をして、引数がNoneの場合だけ空のリストを代入するようにしました。

def num_func(x, l=None):
    if l is None:
        l = []
    l.append(x)
    return l
 
m = num_func(10)
print(m)
n = num_func(10)
print(n)

出力結果

[10]
[10]

基本的に、デフォルト引数には、参照渡しになるリスト型や辞書型は指定せずに、このようなNoneの判断をしてから、空のリストを指定するということでした。

今日は、引数をたくさん使いたいときに便利に使える引数のタプル化を学習します。

位置引数が多いとき

引数が一つの場合は、関数定義の際に一つだけ指定すればいいのですが、たくさんの引数を指定したいときは、コードが長くなってしまうので、大変です。

def word_func(word, word2, word3, word4, word5):
    print(word)
    print(word2)
    print(word3)
    print(word4)
    print(word5)
 
word_func('Hi', 'Mike', 'How', 'Are', 'You')

出力結果

Hi
Mike
How
Are
You

このような場合、ある方法を使えば、引数をタプルにまとめて、コードを簡潔にすることができます。

それが、引数のタプル化です。

位置引数のタプル化

タプル化できるのは、位置引数で、基本は引数(argument)を意味する【args】を使ってタプルを指定します。
ちなみに他の名前でもタプル化は可能です。

def word_func(*args):
    for i in args:
        print(i)
 
word_func('Hi', 'Mike', 'How', 'Are', 'You')

出力結果

Hi
Mike
How
Are
You

変数argsの前に*(アスタリスク)をつけることで、実行時に指定された引数をまとめてタプルにすることができます。

タプルにまとめたら、forループで出力を回せば、最初に書いたコードと同じ実行結果を得ることできますので、結果は同じでもコードはかなりシンプルになりました。

*(アスタリスク)を使うことで、位置引数がいくつあってもタプルにまとめてくれるので、引数をいくつ入れるかわからないというときに使うと便利な方法です。

最初の引数だけ指定する

まとめてタプルにしてくれる*(アスタリスク)ですが、位置引数が一つは確実にあるというときは、最初だけ位置引数を指定して、残りは*でまとめるという使い方もできます。

def word_func(word, *args):
    print('word=', word)
    for i in args:
        print(i)
 
word_func('Hi', 'Mike', 'How', 'Are', 'You')

出力結果

word= Hi
Mike
How
Are
You

現時点で、具体的にどのように使うかはわからないのですが、一つの回答は必須で、他の回答は任意という場合などに使うんでしょうか?

とりあえず、このような使い方ができるということを頭の片隅に入れておけば、実際のプログラミングの場面で出てきたとしてもコードを理解することができるので、憶えておきましょう。

タプルのアンパッキングからのタプル化

講座ではさらにややこしいことも解説してくれていました。

それが、関数の実行時に定義した変数のタプルをアンパッキングしたあと、関数でさらにタプル化するということなのですが、最初は意味がわかりませんでした。

def word_func(word, *args):
    print('word=', word)
    for i in args:
        print(i)
 
t = ('How', 'Are', 'You')
word_func('Hi', *t)

出力結果

word= Hi
How
Are
You

普通に引数を入れたときとなにが違うのかわからなかったのですが、落ち着いてコードの意味を考えてみると、変数tはタプルなので、そのまま関数の引数に代入すると、関数の中の*によって、タプルをタプル化(つまりネストされたタプル)してしまいます。

なので、*によって、実行時にタプルをアンパッキングしているわけです。

*(アスタリスク)には、タプル化する働きと、タプルをアンパッキングする働きがあるということですね。

まー、講座の中でもこのことはまだ憶えておかなくても大丈夫といっていましたが、今後使う場面が出てくると思うので、頭の片隅にでも残しておいたほうがいいでしょう。

感覚も大切

Python学習を開始してから50日が経過しましたが、コードもなんとなくわかるようになってきました。

今やってることは、ほんとに初歩の初歩だと思いますが、講座の解説を聴きながら・「そういうことか!」とわかることもあり、「もしかして、こうしたらこうなるんじゃないかな?」と考えられるようにもなっています。

試してみて想像した結果が得られなくても、どうしてそうなるのか考えることで、仕組みやルールも感覚的に捉えられるようになってきます。

感覚的に動きを想像することは大切で、間違っていれば修正すればいいだけです。

もう何度言ってるかわかりませんが、重要なのは、試してみることです。

いろいろと試して、どんどん経験を積みましょう!

それでは、明日もGood Python!