リストを展開する時に、yieldという概念があることを知りまとめる。
- リストにして出力
# sample.csvを読み込む処理
def fetch_line(filename:str):
with open(filename,"r") as file:
lines: list[str] = []
for line in file:
lines.append(line)
return lines
result = fetch_line("sample.csv")
print(result)
実行すると、sample.csvに書かれている内容のリストが表示される
実行結果
['実行!\n', 'いけた!\n', '3行目!\n']
- 以下はyieldを使用
def fetch_line(filename:str):
with open(filename,"r") as file:
lines: list[str] = []
for line in file:
yield(line)
result = fetch_line("sample.csv")
print(result)
print(result.__next__())
print(result.__next__())
実行結果
<generator object fetch_line at 0x10e571c80>
実行!
いけた!
全て表示
for i in result:
print(i)
実行結果
実行!
いけた!
3行目!
コードの説明
for line in file:
yield(line)
ここが、yieldのところ。
listにappendしなくても全てgeneratorというオブジェクトで作成してくれる。
<generator object fetch_line at 0x10e571c80>
のようなオブジェクトとなり
1つづつ表示させるには.next()を使ってあげる(python3系)
全て表示させるには、forなどを使ってあげる。
利点など
1GBなんかの大きい重たい容量のデータを扱うときに使用する。
また、returnは1GB全て良い込んで返すのに対し、
yieldは読み込んでいる最中でもデータの参照が可能になる。
その他
returnは処理を終了し値を返す
yieldは処理を一旦停止し値を返す
要素が要求される場面でその都度データを算出する(yield)ため、メモリ消費を抑える。
現状を保持できる関数でもあり、
直前に算出した値を次に算出する演算で使用可能
<通常の関数はまっさらな状態で処理が開始される>
何度も同じ関数を実行し、リストに追加するような処理ならyieldの方が良い。
あとは、タイムアウトする重たい処理の実行時に、使うこともある???
この辺わからんな〜〜〜