デカ文字Python

デカ文字&短文でPythonを簡潔にまとめたブログ

Python generator まとめ記事

Pythonのgeneratorについてわかりやすくまとめたブログのリンク集となっています。

 

 

Pythonのジェネレーターってなに?

nihaoshijie.hatenadiary.jp

 

一番詳しく書いているブログ。

これだけでも十分きれいにまとめられているので、これひとつで大丈夫な気がする。

 

ジェネレーター関数

def generatorName():

   ~~~~~~~

   yield x

で定義される関数のこと。

通常の関数との違いは、記述面においてはreturnかyieldかという違いのみ。

大きな違いはその構造にある。

 

通常の関数は、(global変数の存在を無視すれば)ひとつの引数につき一定の値を戻すものである。純粋関数という言葉があるように。

一方でジェネレーター関数は、内部にwhile,for等のループステートメントを持ち、あるいは複数のyieldを持つことで、前回のyieldまでの処理を記憶し、そこからまた再スタートする、という構造になっている。

つまり、呼び出した回数が戻り値yieldに影響を与えるものであるため、厳密には関数と呼べない。(ブログではClassだと言っているものもある。)

 

 ジェネレーターオブジェクト

ジェネレーター関数の実行により戻される値のこと。

ジェネレーターオブジェクトは、for文やnext関数で回したときしか値を戻さないという特性を持っている。

def number(x):
for i in range(x):
if i % 2 == 0:
yield i


print(number(10))
>>><generator object number at 0x000001967F8B5990>

これを遅延評価という。

この特性のため、値を直接取り出せない、[]を使って何番目とか指定できない、

等のデメリットはあるものの、list等のコンテナとは異なり、すべての内包するすべての値にメモリを割く必要がない、という利点もある。

そのためとても省エネ。

import sys

x: int
gen = (x ** 2 for x in range(100) if x % 2 == 0)
func = [x ** 2 for x in range(100) if x % 2 == 0]

print(sys.getsizeof(gen))
>>>88
print(sys.getsizeof(func))
>>>588

ジェネレーター関数の要素数

ジェネレータ―関数の要素数は、要素を呼び出せなくなったときまでの数である。

例えば、

def generator():
yield 1
yield 2
yield 3

で定義されるgenerator関数の要素数は1,2,3の3つである。

def number(x):
for i in range(x):
if i % 2 == 0:
yield i

 の場合だと、渡された引数xの値による。

def number(x):
for i in range(x):
if i % 2 == 0:
yield i


for i in number(10):
print(i)

の場合は、number(10)が空っぽになるまで、繰り返し繰り返しnumber(10)が実行される。

python の yield。サクッと理解するには return と比較

python の yield。サクッと理解するには return と比較 | コード7区

 

 

 Pythonイテレータとジェネレータqiita.com

 今回はここまで。