ホームページ バックエンド開発 Python チュートリアル Python ジェネレーター (Generator) についての深い理解

Python ジェネレーター (Generator) についての深い理解

Nov 07, 2016 am 11:04 AM
python

リスト生成を通じて簡単かつ直接リストを作成できますが、メモリの制約により、リストの容量は確実に制限されます。さらに、100 万個の要素を含むリストを作成すると、多くの記憶領域が必要になるだけでなく、最初の数要素にアクセスするだけで済む場合、後続の要素のほとんどが占有する領域が無駄になります。

では、リストの要素が特定のアルゴリズムに従って計算できれば、ループ中に後続の要素を継続的に計算できるでしょうか?これにより、完全なリストを作成する必要がなくなり、スペースが大幅に節約されます。 Python では、ループと計算を同時に行うこの仕組みをジェネレーターと呼びます。

ジェネレーターを作成するには、さまざまな方法があります。最初の方法は非常に簡単で、リスト生成式の [] を () に変更してジェネレーターを作成します。

>>> mylist = [ x for x in range(1, 10)]
>>> mylist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> gen = (x for x in range(1,10))
>>> gen
<generator object <genexpr> at 0x7f1d7fd0f5a0>
ログイン後にコピー

mylist と gen の作成の唯一の違いは、Mylist がリストであることです。 gen はジェネレーターです。

リストの各要素を直接出力できますが、ジェネレーターの各要素を出力するにはどうすればよいでしょうか?

それらを 1 つずつ出力したい場合は、ジェネレーターの next() メソッドを使用できます。

>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
3
...
>>> gen.next()
9
>>> gen.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
ログイン後にコピー

前述したように、ジェネレーターは next() が呼び出されるたびにアルゴリズムを保存します。最後の要素が最後の要素で、それ以上要素が存在しない場合は、StopIteration エラーがスローされます。

実際、 next() メソッドの代わりに for ループを使用できます。これは効率的なプログラミングのアイデアにより一致しています:

>>> gen = ( x for x in range(1, 10))
>>> for num in gen:
...     print num
... 
1
2
3
4
5
6
7
8
9
ログイン後にコピー

generator は非常に強力です。計算アルゴリズムが比較的複雑で、リスト生成のような for ループを使用して実装できない場合は、関数を使用して実装することもできます。

たとえば、有名なフィボナッチ数列では、最初と 2 番目の数値を除き、最初の 2 つの数値を加算することで任意の数値を得ることができます:

1, 1, 2, 3, 5 , 8, 13, 21, 34 , ...

フィボナッチ数列はリスト生成を使用して記述することはできませんが、関数を使用して簡単に出力できます:

def fib(max):
    n = 0 
    a, b = 0, 1
    while n < max:
        print b
        a, b = b, a + b
        n = n + 1
ログイン後にコピー

上記の関数はフィボナッチを出力できますフィボナッチ数列の最初の N 個の数値:

>>> fib(6)
ログイン後にコピー

Ifよく見ると、fib 関数が実際にフィボナッチ数列の計算ルールを定義していることがわかります。このロジックは実際にはジェネレーターと非常によく似ています。

言い換えれば、上記の関数はジェネレーターまであと 1 ステップです。 fib 関数をジェネレーターに変えるには、print b を yield b に変更するだけです:

def fib(max):
    n = 0 
    a, b = 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
ログイン後にコピー

これはジェネレーターを定義する別の方法です。関数定義に yield キーワードが含まれている場合、その関数はもはや通常の関数ではなくジェネレーターです:

>>> fib(6)
ログイン後にコピー

ここで、最も理解しにくいのは、ジェネレーターと関数の実行プロセスが異なることです。関数は順番に実行され、return ステートメントまたは関数ステートメントの最後の行に到達すると戻ります。ジェネレーターとなる関数は next() が呼び出されるたびに実行され、yield ステートメントに遭遇するとリターンし、再度実行されると最後に返された yield ステートメントから実行を継続します。

簡単な例として、数値 1、3、5 を順番に返すジェネレーターを定義します。

>>> def odd():
...     print &#39;step 1&#39;
...     yield 1
...     print &#39;step 2&#39;
...     yield 3
...     print &#39;step 3&#39;
...     yield 5
...
>>> o = odd()
>>> o.next()
step 1
1
>>> o.next()
step 2
3
>>> o.next()
step 3
5
>>> o.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
ログイン後にコピー

odd は通常の関数ではなく、実行中に発生すると割り込みを行うジェネレーターであることがわかります。次回は実行を続けます。 yield を 3 回実行すると、それ以上実行する yield がなくなるため、next() が 4 回目に呼び出されたときにエラーが報告されます。

fib の例に戻ると、ループ中に yield を呼び出し続けると、中断され続けます。もちろん、ループを終了するにはループの条件を設定する必要があります。そうしないと、無限の数がリストされます。

同様に、関数をジェネレーターに変更した後、基本的に next() を使用して呼び出すことはありませんが、for ループを直接使用して繰り返します。

>>> for n in fib(6):
...     print n
...
ログイン後にコピー

ジェネレーターは、Python では非常に強力なツールであり、リストを変更するだけで済みます。ジェネレーターに生成することも、関数を使用して複雑なロジック ジェネレーターを実装することもできます。

ジェネレーターの動作原理を理解するために、ジェネレーターは for ループ中に次の要素を継続的に計算し、適切な条件下で for ループを終了します。関数から変更されたジェネレーターの場合、return ステートメントに遭遇するか、関数本体の最後の行が実行されると、それがジェネレーターを終了する命令となり、それに応じて for ループが終了します。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

XML形式を開く方法 XML形式を開く方法 Apr 02, 2025 pm 09:00 PM

ほとんどのテキストエディターを使用して、XMLファイルを開きます。より直感的なツリーディスプレイが必要な場合は、酸素XMLエディターやXMLSPYなどのXMLエディターを使用できます。プログラムでXMLデータを処理する場合、プログラミング言語(Pythonなど)やXMLライブラリ(XML.ETREE.ELEMENTTREEなど)を使用して解析する必要があります。

XMLをPDFに変換できるモバイルアプリはありますか? XMLをPDFに変換できるモバイルアプリはありますか? Apr 02, 2025 pm 08:54 PM

XMLをPDFに直接変換するアプリケーションは、2つの根本的に異なる形式であるため、見つかりません。 XMLはデータの保存に使用され、PDFはドキュメントを表示するために使用されます。変換を完了するには、PythonやReportLabなどのプログラミング言語とライブラリを使用して、XMLデータを解析してPDFドキュメントを生成できます。

携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? 携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? Apr 02, 2025 pm 10:09 PM

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

XMLのコメントコンテンツを変更する方法 XMLのコメントコンテンツを変更する方法 Apr 02, 2025 pm 06:15 PM

小さなXMLファイルの場合、注釈コンテンツをテキストエディターに直接置き換えることができます。大きなファイルの場合、XMLパーサーを使用してそれを変更して、効率と精度を確保することをお勧めします。 XMLコメントを削除するときは注意してください。コメントを維持すると、通常、コードの理解とメンテナンスが役立ちます。高度なヒントは、XMLパーサーを使用してコメントを変更するためのPythonサンプルコードを提供しますが、特定の実装を使用するXMLライブラリに従って調整する必要があります。 XMLファイルを変更する際のエンコード問題に注意してください。 UTF-8エンコードを使用して、エンコード形式を指定することをお勧めします。

推奨されるXMLフォーマットツール 推奨されるXMLフォーマットツール Apr 02, 2025 pm 09:03 PM

XMLフォーマットツールは、読みやすさと理解を向上させるために、ルールに従ってコードを入力できます。ツールを選択するときは、カスタマイズ機能、特別な状況の処理、パフォーマンス、使いやすさに注意してください。一般的に使用されるツールタイプには、オンラインツール、IDEプラグイン、コマンドラインツールが含まれます。

携帯電話用の無料のXMLからPDFツールはありますか? 携帯電話用の無料のXMLからPDFツールはありますか? Apr 02, 2025 pm 09:12 PM

モバイルには、単純で直接無料のXMLからPDFツールはありません。必要なデータ視覚化プロセスには、複雑なデータの理解とレンダリングが含まれ、市場のいわゆる「無料」ツールのほとんどは経験がありません。コンピューター側のツールを使用したり、クラウドサービスを使用したり、アプリを開発してより信頼性の高い変換効果を取得することをお勧めします。

携帯電話でXMLを高品質でPDFに変換するにはどうすればよいですか? 携帯電話でXMLを高品質でPDFに変換するにはどうすればよいですか? Apr 02, 2025 pm 09:48 PM

携帯電話の高品質でXMLをPDFに変換する必要があります。クラウドでXMLを解析し、サーバーレスコンピューティングプラットフォームを使用してPDFを生成します。効率的なXMLパーサーとPDF生成ライブラリを選択します。エラーを正しく処理します。携帯電話の重いタスクを避けるために、クラウドコンピューティングの能力を最大限に活用してください。複雑なXML構造の処理、マルチページPDFの生成、画像の追加など、要件に応じて複雑さを調整します。デバッグを支援するログ情報を印刷します。パフォーマンスを最適化し、効率的なパーサーとPDFライブラリを選択し、非同期プログラミングまたは前処理XMLデータを使用する場合があります。優れたコードの品質と保守性を確保します。

携帯電話のXMLファイルをPDFに変換する方法は? 携帯電話のXMLファイルをPDFに変換する方法は? Apr 02, 2025 pm 10:12 PM

単一のアプリケーションで携帯電話でXMLからPDF変換を直接完了することは不可能です。クラウドサービスを使用する必要があります。クラウドサービスは、2つのステップで達成できます。1。XMLをクラウド内のPDFに変換し、2。携帯電話の変換されたPDFファイルにアクセスまたはダウンロードします。

See all articles