TIL30. Python:Generatorコンセプトまとめ


📌 この位置決めではPythonのジェネレータを整理した。

🌈 「ジェネレータ」(Generator)の概念をまとめる


🔥 発電機とは何ですか。 🔥 発電機の作成 🔥 リスト計算とマネージャの違い

発電機とは何ですか。


🤔 発電機とは何ですか。


ААААААААААААА
✔隆関数の内部でyieldを使用すると、この関数はジェネレータとなり、ジェネレータはウィジェットを作成します.
ААААААААААААААА
✔朕朕朕朕朕朕朕朕朕朕朕朕朕朕
def generator_func(): yield 1 yield 2 yield 3 print(generator_func() # <generator object generator_func at 0x7fc786582580> print(hasattr(generator_func(), '__iter__')) # True print(hasattr(generator_func(), '__next__')) # True

🤔 yieldは右側の値を関数の外に出力(本番リターン)し、実行させます。


✔yieldで作成した関数を使用してjnerを返すため、iterを使用する必要はなく、次のyieldの右側にある値を順次関数の外に出力します.
✔」関数のreturnとjenerのyieldの違いは、returnは関数が呼び出されると値を返して関数を終了しますが、yieldは値を関数内部から関数外部に順次渡します.さらにsend関数によりmianルーチンから値を取得して双方向通信を行うこともできる.

def generator_func(): yield 1 yield 2 yield 3 g = generator_func() # 👈 完成品から作成されたサードパーティ print(g) # <generator object generator_func at 0x7fc786582580> print(g.__next__()) # 1 print(g.__next__()) # 2 print(g.__next__()) # 3

2.発電機の作成


🤔 どうして発電機で小さなモーターを作るのですか。


✔✔を使用しない場合は、「勘定科目」および「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」、「勘定科目」データ量が増加すると、次のコードのメモリ効率は低下します.
numbers = [i for i in range(10)] print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

✔ウィジェットにウィジェットを作成すると、オブジェクトは次の順序で作成され、呼び出すまですべての値はメモリに入れません.すなわち、生産量起動発電機を呼び出して値を計算し、対応するメモリを使用する.
「遅延評価」とは、勘定科目の「遅延評価」と呼ばれます.以下に示すように、マネージャを使用してウィジェットを作成します.
def numbers(): yield 0 yield 1 yield 2 yield 3 yield 4 yield 5 yield 6 yield 7 yield 8 yield 9 gen_numbers = numbers() # 👈 ジェネレータを使用したイテレーションの作成 print(gen_numbers) # <generator object numbers at 0x7fcb396199e0> for i in gen_numbers: print(i, end=" ") # 0 1 2 3 4 5 6 7 8 9

🤔 ジェネレータを使用してrange関数を作成するには


✔while文では、次のrangeのように動作するマネージャを作成できます.
def gen_range(start, stop): while start < stop: yield start start += 1 print(gen_range(0, 10)) # <generator object gen_range at 0x7fab88f219e0> res = [i for i in gen_range(0, 10)] print(res) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

✔¥¥АААААААААААААА
✔¥АААААААААААА
def gen_range(start, stop): while start < stop: yield start start += 1 res = gen_range(0, 5) print(res) # <generator object gen_range at 0x7fb5990219e0> print(next(res)) # 0 print(next(res)) # 1 print(next(res)) # 2 print(next(res)) # 3 print(next(res)) # 4 print(next(res)) # StopIteration

🤔 send()関数を使用して値をプライマリ・インスタンスからプライマリ・インスタンスに渡します。


✔yieldは、関数で値を宣言できますが、メインルーチンの関数呼び出し領域からサードパーティ内部に値を渡すことができます.
✔朕はEquityの非常にクールな機能です.Equityは左側に変数を割り当て、メインルーチン(関数外部)から値を取得できるからです.
✔朕は双方向通信(coroutin)の概念を許可する.
✔send()は次のとおりです.
def generator_send(): # 👈 パラメータは存在しません。 main_routine_value = 0 while True: main_routine_value = yield yield main_routine_value * 2 gen=generator send()#作成マネージャ print(gen) # <generator object generator_send at 0x7fc4ab9219e0> next(gen) print(gen.send(100)) # 200 next(gen) print(gen.send(300)) # 600

3.リスト計算とマネージャの違い


🤔 メモリ効率:サードパーティ>リスト計算


✔リストコンパイラを使用して作成したオブジェクトに大量のデータがあると仮定すると、効率に差が出ます.
✔」これは、すべての値の順番がメモリに記録されてからメモリに割り当てられますが、リストコンパイルでは起動時にすべての値がメモリにアップロードされます.
ААААААААААААААА