Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonジェネレーターの書き方

イテレータはPythonで重要な役割を果たします。これらを使用すると、反復可能なオブジェクトを作成できます。これは、forinループを介してアクセスできるデータを格納するための優れた方法です。

イテレータの問題は、イテレータを構築するのに多くの作業が必要になることです。それらは便利ですが、1つを機能させるには多くのコードを作成する必要があります。ジェネレータはこの問題の解決に役立ちます。

このガイドでは、Pythonジェネレーターとは何か、なぜそれらを使用する必要があるのか​​について説明します。また、Pythonでジェネレーターを実装して、それらがどのように機能するかを理解できるようにします。

面倒なことはせずに、始めましょう!

ジェネレーターとは何ですか?

ジェネレーターは、Pythonでイテレーターを作成する簡単な方法です。これは、反復できるオブジェクトを返す関数です。

ジェネレータはしばしばシンタックスシュガーと呼ばれます。これは、必ずしもPythonに新しい機能が追加されるとは限らないためです。これらは、コードをより効率的にするのに役立ちます。

イテレータと同様に、ジェネレータを反復処理できるのは1回だけです。これは、ジェネレーターが繰り返された回数を追跡し、リセットできないためです。

Pythonイテレータを見てみましょう。

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

class Cookies:
	def __init__(self, value):
		self.value = value

	def __iter__(self):
		return self

	def __next__(self):
		return self.value

このコードは、Cookiesと呼ばれるイテレータを作成します。このイテレータを介してデータを渡すと、データは反復可能なオブジェクトに変換されます。これは、forinループを使用してデータをループできることを意味します。このコードを見て、本当に長いと思うなら、それはそうだからです。

ジェネレーターは、このコードを短縮するのに役立ちます。上記のイテレータのジェネレータを作成しましょう。

def cookies(value):
	while True:
		yield value

コードのサイズが大幅に縮小されました。これがどのように機能するかについて説明しましょう。

ジェネレーターは、returnステートメントの代わりにyieldキーワードを持つ関数です。 Yieldステートメントは、関数から値を返します。

yieldステートメントとreturnステートメントの違いは、returnステートメントは関数の実行を停止するのに対し、yieldステートメントは関数を一時停止して反復を続行することです。

単純なジェネレーター関数を繰り返してみましょう。

for cookie in cookies("Raspberry"):
	print(cookie)

私たちのコードは次を返します:

ラズベリー

ラズベリー


このコードは、プログラムを停止するまで繰り返されます。これは、whileを使用したためです。 永久に実行されるループ。ほとんどの場合、これはあまり役に立ちません。アクションが実行されたときに停止するジェネレーターを作成しましょう。

Pythonジェネレーターの書き方

コンソールに出力するCookieのリストがあります。このリストは次のようになります。

[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]

これらをコンソールに出力するために、単純なジェネレーターを作成できます。新しいPythonファイルを開き、次のコードを貼り付けます。

def print_cookies(cookies):
	length = len(cookies)
	for cookie in range(0, length):
yield cookies[cookie]

ジェネレータは、指定したリスト内のすべてのCookieを調べ、各Cookieを個別に返します。このジェネレーターはまだ機能していません。 forループを使用して反復処理する必要があります。

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

for c in print_cookies(cookie_list):
	print(c)

cookie_listという配列を定義しました 4つのCookieのリストを格納します。次に、ジェネレーターを使用してcookie_listの値を反復処理するforループを設定しました。 。

forループの反復ごとに、生成されたオブジェクトがコンソールに出力されます。

ラズベリー

チョコチップ

シナモン

オーツ麦

やりました!このジェネレーターは、変数cookie_listの各値まで値を返します。 繰り返されました。

ジェネレータにはさまざまなユースケースがあります。合計したい注文価格のリストがあるとしましょう。次のコードを使用してこれを行うことができます。

def total_orders(orders):
	length = len(orders)
	total = 0
	for o in range(0, length):
		total += orders[o]
		yield total

このジェネレーターは、リスト内のすべての注文の値の現在の合計を保持します。各アイテムが繰り返された後、ジェネレーターは注文の現在の合計値を生成します。ジェネレーターを使用するforループを書いてみましょう。

order_list = [2.30, 2.50, 1.95, 6.00, 7.50, 2.15]

for order in total_orders(order_list):
	print(order)

私たちのコードは次を返します:

2.3

4.8

6.75

12.75

20.25

22.4

ジェネレーターは、order_list変数内のすべての注文の累積値を計算しました。リストを繰り返すたびに、新しい累積値が返されます。

ジェネレータ式の書き方

ジェネレーターは、イテレーターよりも作成がすでに簡単です。ジェネレーター式のおかげで、よりクリーンなコードを書くための私たちの探求を止める必要はありません。

ジェネレータ式はリスト内包に似ています。ジェネレータ式は、ジェネレータのように、一度に1つのアイテムを生成します。これは、リスト全体を一度に生成するリスト内包表記とは異なります。

Cookieの例のジェネレーターを書いてみましょう。

cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"]

cookie_generator = (cookie for cookie in cookie_list)

変数cookie_listでCookieのリストを定義しました 。次に、ジェネレータ式を作成します。この式はリスト内包表記の構文を使用しますが、大きな違いが1つあります。リスト内包表記は角かっこで定義されますが、ジェネレーターは丸かっこで定義されます。

式を反復処理するforループを作成しましょう。

for cookie in cookie_generator:
	print(cookie)

私たちのコードは次を返します:

ラズベリー

チョコチップ

シナモン

オーツ麦

このジェネレーターの応答は、最初の例の応答と同じです。構文が大幅に明確になりました。

ジェネレータ式を使用して宣言されたジェネレータを反復処理する場合、それを関数として呼び出さないことに注意することが重要です。 cookie_generator ジェネレータは入力値を受け入れません。cookie_listを反復処理するために必要なコードがすでに含まれています。 リスト。

単純な関数を実行するジェネレーターを作成する必要がある場合にのみ、ジェネレーター式の構文を使用する必要があります。値のリストを印刷することは良い例です。リスト内の値に特定の数値を掛けることも良い例です。

これは、ジェネレータ式の構文は明確ですが、主に1行の式用に設計されているためです。ジェネレーターが複数行のコードを使用する場合は、この記事の前半で説明した構文を使用して、ジェネレーター関数として記述してください。

ジェネレーターが使用される理由

ジェネレーターが使用される主な理由は、ジェネレーターがイテレーターよりも簡潔であるためです。

ジェネレーターは関数のようなものであり、動作するために__init __、__ iter __、または__next__ステートメントは必要ありません。これは、これら3つのステートメントすべてを必要とするイテレータとは異なります。この動作は、イテレータを作成する場合よりも大幅に少ないコード行でジェネレータを実装できることを意味します。

さらに、ジェネレータはメモリの使用に効率的です。ジェネレーターは一度に1つのアイテムのみを生成します。結果を返す前に、メモリ内にシーケンス全体を作成することはありません。これにより、大量のデータのリストを反復処理する必要がある場合に、ジェネレーターが非常に実用的になります。

これが機能する方法は、イテレータが遅延評価方法を使用することです。それらは、そのアイテムが要求されたときにのみ、反復可能なオブジェクトの次の要素を生成します。

結論(および挑戦)

ジェネレーターを使用すると、よりPythonicのイテレーターを作成できます。

ジェネレータを使用すると、__ init __、__ iter __、または__next__ステートメントを記述しなくても、イテレータプロトコルを使用してオブジェクトを簡単に記述できます。ジェネレーターは関数として定義されます。彼らはyieldステートメントを使用してジェネレーターを停止し、通常の操作に戻る前に値をメインプログラムに戻します。

課題を探している場合は、次のアイデアがあります。

  • 文字列を反転するジェネレータを作成します。
  • 値のリストから特定の単語を含む値のみを返すジェネレーターを作成します。
  • リスト内のすべての数値に2を掛けるジェネレーターを作成します。

詳細については、Pythonイテレータの作成方法と使用方法に関するチュートリアルをご覧ください。これで、エキスパートのようにPythonでジェネレーターを操作する準備が整いました。


  1. Pythonでパターンを印刷する方法は?

    Pythonのパターンは、ネストされたforループを使用して印刷できます。外側のループは行数を反復処理するために使用され、内側のループは列数を処理するために使用されます。印刷ステートメントは、要件に応じてさまざまなパターンを形成するように変更されます。 パターンには、星型、数字型、アルファベット型があります。パターンは、さまざまな形、三角形、ピラミッドなどにすることができます。 例 これらのパターンはすべて、これらの異なるパターンを形成する変更されたprintステートメントを含むforループを使用して印刷できます。 これらのパターンの印刷の基本的な考え方は同じですが、わずかな違いが

  2. Pythonプログラムを実行する方法は?

    コードを記述したら、コードを実行して実行し、出力を取得する必要があります。プログラムを実行すると、コードが正しく記述され、目的の出力が生成されるかどうかを確認できます。 Pythonプログラムの実行は非常に簡単な作業です。 IDLEで実行 IDLEでPythonプログラムを実行するには、指定された手順に従います- Pythonコードを記述して保存します。 プログラムを実行するには、[モジュールの実行]に移動します または、F5をクリックするだけです。 コマンドラインで実行 Pythonスクリプトファイルは「.py」拡張子で保存されます。 Pythonスクリプトを保存したら