Python ジェネレーターの紹介と使用
Pythonのジェネレーターはアルゴリズムを保存し、値が本当に必要な場合にのみ値が計算されます。ゆるい評価です。
ジェネレーターを作成するには 2 つの方法があります。
最初の方法: リスト生成の [] を () に変更してジェネレーターを作成します:
>>> L = [x * x for x in range(10)] >>> ; L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]>>> g = (x * x for x in range(10)) # [ を変更した後] を () に変換すると、タプルを生成する代わりに、ジェネレーター>>> g
2 番目の方法: yield キーワードを使用すると、関数は次のようになります。発電機。
関数内に yield があると、yield に達すると実行が停止され、さらなる計算が必要な場合にのみ計算が続行されます。したがって、ジェネレーター関数に無限ループがあっても問題はなく、カウントする必要があるだけ計算され、必要がなければそれ以上カウントしません。
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
f = fib()
print f, next(f), next (f), next(f)
#
上記の例のように、最初に f が出力されるときはジェネレーターであり、次は毎回実行すると、実行されて が生成されます。
もちろん、next() が使用されることはほとんどありません。実際、for ループの内部実装では、継続的に next() を呼び出します。
ジェネレーターは不必要な計算を回避し、パフォーマンスを向上させることができます。また、スペースを節約し、無限ループ (無限) データ構造を実装することもできます。
ジェネレーター構文
ジェネレーター式: リスト解析構文を使用します。リスト解析の [] を () に置き換えるだけです
ジェネレーター式でできることは、基本的にはリスト解析で処理できますが、必要に応じて処理されるシーケンスが比較的大きい場合、リストの解析はより多くのメモリを消費します。
ジェネレーター関数: 関数内に yield キーワードが出現する場合、その関数は通常の関数ではなく、ジェネレーター関数になります。
Python では、yield がそのようなジェネレーターです。
yieldジェネレーターの動作メカニズム:
ジェネレーターに数値を要求すると、ジェネレーターはyieldステートメントが表示されるまで実行され、ジェネレーターはyieldのパラメーターを提供しますが、その後ジェネレーターは何もしません。走り続けてください。次の番号を尋ねると、最後の状態から始めます。 yield ステートメントが表示されるまで実行を開始し、パラメーターを指定してから停止します。これは関数が終了するまで繰り返されます。
yield の使用法:
Python では、関数を定義して yield キーワードを使用すると、その関数の実行は他の通常の関数とは大きく異なります。関数は return ステートメントの代わりにオブジェクトを返します。通常使用する場合は、結果の値を取得できます。値を取得したい場合は、 next() 関数を呼び出す必要があります
フィボナッチを例にとります:
#coding:utf8 def fib(max): #10 n, a, b = 0, 0, 1 while n < max: #n<10 #print(b) yield b a, b = b, a + b n += 1 return f = fib(10) for i in f: print f
上記の動作メカニズムの説明から、次のことがわかります。プログラムは、yield まで実行されます。 この行が実行されると、実行は続行されません。代わりに、現在の関数のすべてのパラメーターの状態を含む反復子オブジェクトを返します。目的は、値を再割り当てするのではなく、関数が 2 回目に呼び出されたときに、関数のすべてのパラメーター値にアクセスできるようにすることです。
プログラムが初めて呼び出されるとき:def fib(max): #10 n, a, b = 0, 0, 1 while n < max: #n<10 #print(b) yield b #这时a,b值分别为0,1,当然,程序也在执行到这时,返回 a, b = b, a + b
程序第二次调用时:
从前面可知,第一次调用时,a,b=0,0,那么,我们第二次调用时(其实就是调用第一次返回的iterator对象的next()方法),程序跳到yield语句处,
执行a,b = b, a+b语句,此时值变为:a,b = 0, (0+1) => a,b = 0, 1
程序继续while循环,当然,再一次碰到了yield a 语句,也是像第一次那样,保存函数所有参数的状态,返回一个包含这些参数状态的iterator对象。
等待第三次的调用....
通过上面的分析,可以一次类推的展示了yield的详细运行过程了!
通过使用生成器的语法,可以免去写迭代器类的繁琐代码,如,上面的例子使用迭代类来实现,代码如下:
#coding:UTF8 class Fib: def __init__(self, max): self.max = max print self.max def __iter__(self): self.a = 0 self.b = 1 self.n = 0 return self def next(self): fib = self.n if fib >= self.max: raise StopIteration self.a, self.b = self.b, self.a + self.b self.n += 1 return self.a f = Fib(10) for i in f: print i
yield 与 return
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。
如果在return后返回一个值,会直接报错,生成器没有办法使用return来返回值。
生成器支持的方法(借鉴别人的例子,感觉蛮好的)
close(...) | close() -> raise GeneratorExit inside generator. | | next(...) | x.next() -> the next value, or raise StopIteration | | send(...) | send(arg) -> send 'arg' into generator, | return next yielded value or raise StopIteration. | | throw(...) | throw(typ[,val[,tb]]) -> raise exception in generator, | return next yielded value or raise StopIteration.
close()
手动关闭生成器函数,后面的调用会直接返回StopIteration异常。
#coding:UTF8 def fib(): yield 1 yield 2 yield 3 f = fib() print f.next() f.close() print f.next()
send()
生成器函数最大的特点是可以接受外部传入的一个变量,并根据变量内容计算结果后返回。
这是生成器函数最难理解的地方,也是最重要的地方,
def gen(): value=0 while True: receive=yield value if receive=='e': break value = 'got: %s' % receive g=gen() print(g.send(None)) print(g.send('aaa')) print(g.send(3)) print(g.send('e'))
执行流程:
通过g.send(None)或者next(g)可以启动生成器函数,并执行到第一个yield语句结束的位置。此时,执行完了yield语句,但是没有给receive赋值。yield value会输出初始值0注意:在启动生成器函数时只能send(None),如果试图输入其它的值都会得到错误提示信息。
通过g.send(‘aaa’),会传入aaa,并赋值给receive,然后计算出value的值,并回到while头部,执行yield value语句有停止。此时yield value会输出”got: aaa”,然后挂起。
通过g.send(3),会重复第2步,最后输出结果为”got: 3″
当我们g.send(‘e’)时,程序会执行break然后推出循环,最后整个函数执行完毕,所以会得到StopIteration异常。
最后的执行结果如下:
0 got: aaa got: 3 Traceback (most recent call last): File "1.py", line 15, in <module> print(g.send('e')) StopIteration
throw()
用来向生成器函数送入一个异常,可以结束系统定义的异常,或者自定义的异常。
throw()后直接跑出异常并结束程序,或者消耗掉一个yield,或者在没有下一个yield的时候直接进行到程序的结尾。
def gen(): while True: try: yield 'normal value' yield 'normal value 2' print('here') except ValueError: print('we got ValueError here') except TypeError: break g=gen() print(next(g)) print(g.throw(ValueError)) print(next(g)) print(g.throw(TypeError))
执行流程:
print(next(g)):会输出normal value,并停留在yield ‘normal value 2’之前。
由于执行了g.throw(ValueError),所以会跳过所有后续的try语句,也就是说yield ‘normal value 2’不会被执行,然后进入到except语句,打印出we got ValueError here。然后再次进入到while语句部分,消耗一个yield,所以会输出normal value。
print(next(g)),会执行yield ‘normal value 2’语句,并停留在执行完该语句后的位置。
g.throw(TypeError):会跳出try语句,从而print(‘here’)不会被执行,然后执行break语句,跳出while循环,然后到达程序结尾,所以跑出StopIteration异常。
以上がPython ジェネレーターの紹介と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。
