Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回はジェネレータ式で作ったジェネレータオブジェクトを関数の引数として使う場合の、特に「*」記号を使ってアンパックして使う方法の解説です。
Contents
まずPythonにおけるジェネレータオブジェクとジェネレータ式については次の記事をご覧ください。
【Python入門】ジェネレータとは?for文との関係や、yieldとprint/returnとの違いは?
また、ジェネレータ式とはジェネレータオブジェクトを作るための書き方の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__()メソッドが全て自動的に実行される
↓
数字の、0、1、2が生成される(ただしこの時点ではリストでもタプルでもありません。[0, 1, 2]などにはなっていません。)
↓
この時点で引数が3つとなる
↓
その3つの数字が、仮引数の「*unpacked」に渡される
↓
unpackedには「*」がついているため、3つの引数がまとめて「unpacked」引数にまとめられ、タプル型オブジェクトでunpackedという名前のものができる
↓
そのタプルオブジェクトの要素を1つずつ表示
このような処理となります。少しややこしいところは、
ということで少しだけ意味(機能)が異なるという点ですね。
以上、ジェネレータオブジェクトとそのアンパック、そして関数の引数として使う場合の方法の解説でした。今回のジェネレータオブジェクトについてもUdemyのPython動画学習ではわかりやすく説明されています。次のPython動画を利用してみてください。