Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

プログラミング、ブログ、IT、分析

【Python入門】関数の引数にジェネレータ式のアンパック(*引数)を使う方法の解説

Pythonのジェネレータオブジェクトの使い方として、関数の引数に「*」記号を使った可変長位置引数に、アンパックされたジェネレーターオブジェクトを使う方法の解説

今回はジェネレータ式で作ったジェネレータオブジェクトを関数の引数として使う場合の、特に「*」記号を使ってアンパックして使う方法の解説です。

前提知識:ジェネレータオブジェクト、ジェネレータ式、可変長位置引数

ジェネレータオブジェクトとは?

まずPythonにおけるジェネレータオブジェクとジェネレータ式については次の記事をご覧ください。

【Python入門】ジェネレータとは?for文との関係や、yieldとprint/returnとの違いは?

ジェネレーター式(generator expression)とは?

また、ジェネレータ式とはジェネレータオブジェクトを作るための書き方の1つです。次の記事を読んでみてください。

【Python入門】ジェネレーター式と、リスト・辞書の内包表記との違いをわかりやすく解説

可変長位置引数

また関数の引数として「*」という記号を使って複数の引数をまとめて引数として処理できる方法については、

これらの記事で解説しましたのでぜひご覧ください。

ジェネレータオブジェクトのアンパックの使用例と解説


# ジェネレータ式
generator_expression = ( i for i in range(0, 3) )

# 型を確認(特に特殊メソッド__iter__があることを確認)
dir(generator_expression)  #__iter__があるのでイテラブルオブジェクト

# 複数の任意の引数をまとめて処理できる可変長位置引数を使った関数を定義
def print_unpacked_generator_expression(*unpacked):
    print(type(unpacked))
    for i in range(0, len(unpacked)):
        print("unpacked["
              +str(i)
              +"]: "
              +str(unpacked[i])
              )

# 関数の実行
print_unpacked_generator_expression(*generator_expression)

特に複雑なことをしているわけではありませんが、このコードの処理のプロセスを下に書いておきます。

引数で、「*generator_expression」とすることでジェネレータオブジェクトenerator_expressionをアンパックして展開

そのジェネレータオブジェクトenerator_expressionが持つ__next__()メソッドが全て自動的に実行される

数字の、012が生成される(ただしこの時点ではリストでもタプルでもありません。[0, 1, 2]などにはなっていません。)

この時点で引数が3つとなる

その3つの数字が、仮引数の「*unpacked」に渡される

unpackedには「*」がついているため、3つの引数がまとめて「unpacked」引数にまとめられ、タプル型オブジェクトでunpackedという名前のものができる

そのタプルオブジェクトの要素を1つずつ表示

このような処理となります。少しややこしいところは、

  • 「*generator_expression」の「*」はジェネレータオブジェクトのアンパックという意味
  • 「*unpacked」の「*」は可変長位置引数という意味

ということで少しだけ意味(機能)が異なるという点ですね。

以上、ジェネレータオブジェクトとそのアンパック、そして関数の引数として使う場合の方法の解説でした。今回のジェネレータオブジェクトについてもUdemyのPython動画学習ではわかりやすく説明されています。次のPython動画を利用してみてください。

愛を分かち合いましょう