2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

yieldについて

Last updated at Posted at 2023-04-06

リストを展開する時に、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の方が良い。

あとは、タイムアウトする重たい処理の実行時に、使うこともある???
この辺わからんな〜〜〜

参考:
http://ailaby.com/yield/

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?