【pythonユーティリティ】-yieldジェネレータ
10135 ワード
文書ディレクトリ1、ジェネレータとは何ですか? 2、なぜジェネレータを使うのですか?何のメリットがありますか. 3、pythonではジェネレータをどのように実現しますか? 4、yieldジェネレータの動作メカニズム 5、反復生成器 にループを用いる.
この概念は理解しにくいので,以下のいくつかの問題を解くことでそれを把握することができる.このセクションでは、
1、ジェネレータとは?
ジェネレータ:
簡単な例を挙げると、100要素のリストを作成します.簡単です.変数はメモリに格納されるため、リスト長はメモリサイズに制限され、限られた である.リストは、すべての要素を一度に作成してから操作する必要があります.データが大きすぎると、メモリの使用が瞬時に上昇し、メモリ不足のリスクがあります. は、多くの場合、要素の一部しか使用できないため、メモリ領域の浪費が発生し、以上の問題を解決するために 3、pythonでジェネレータをどのように実現しますか?
一般的にpythonのジェネレータには2つの実装方法があります.は一般的にリスト生成式の の値を取ることができることを意味します. yield実装例は以下の通りであり、0~2
4、yieldジェネレータの運行メカニズム
上記の学習を通じて、ジェネレータを構築する方法を知っています.どうやって動いているのでしょうか?なぜデータを逐次取得しているのでしょうか.まず例を見てみましょう
出力:
3つのyieldが返されているが、
出力:
まとめ:
5、ループを使用してジェネレータを反復する
上記の例では、 whileサイクル forループ
ブロガーのその他のシリーズ記事:
[1]【pythonユーティリティ】-スライス
[2]【pythonユーティリティ】-反復、反復可能オブジェクト、反復器
[3]【pythonユーティリティ】-リスト生成式
[4]【pythonユーティリティ】-アクセサリー
[5]Pythonが動的Webページデータを取得する方法
[6]Python+seleniumによる自動爬取の実施例
[7]python豆弁を這い出すTop 250-改良版
[8]【Scrapy爬取例】-爬取チェーンホームネットワーク指定都市中古住宅源情報
この概念は理解しにくいので,以下のいくつかの問題を解くことでそれを把握することができる.このセクションでは、
および
の知識を使用します.まず、前の文章を見て理解することをお勧めします.【pythonユーティリティ】-反復、反復可能オブジェクト、反復器【pythonユーティリティ】-リスト生成式1、ジェネレータとは?
ジェネレータ:
、よく理解して、オブジェクトを作成する意味です.
は何ですか?器は道具の意味として理解できるので、 , , 。
2、なぜジェネレータを使うのですか.何のメリットがありますか.簡単な例を挙げると、100要素のリストを作成します.簡単です.
list(range(100))
ですが、100万、1000万の要素のリストを作成するとしたら?確かに、私たちは依然としてlist(range(10000*100)
、list(range(10000*1000)
を使用して目的を達成することができます.しかし、これはいくつかの問題をもたらします. , ——
が導入されているため、ジェネレータを使用するメリットも明らかである:(1) ,
(2) ,
一般的にpythonのジェネレータには2つの実装方法があります.
[]
を()
に変更すればよく、例は以下の通りである:g = (x for x in range(10))
print(type(g)) #type g
from typing import Iterable
print(isinstance(g,Iterable)) #
出力:<class 'generator'>
True
可視、このときのg
はジェネレータであり、反復可能なオブジェクトでもある!これは、next(g)
を使用して#
def getN(N):
n = 0
while n<N:
yield n # yield
n+=1
g = getN(3)
print(next(g))
print(next(g))
print(next(g))
出力を印刷する:0
1
2
上述のように、関数getN(N)
にyield
キーワード戻りデータを使用したので、この関数はジェネレータとなる.小結:関数にyield
を使用してデータを返すと、この関数はジェネレータです.4、yieldジェネレータの運行メカニズム
上記の学習を通じて、ジェネレータを構築する方法を知っています.どうやって動いているのでしょうか?なぜデータを逐次取得しているのでしょうか.まず例を見てみましょう
def test():
print(' :')
yield 'data1'
print(' :')
yield 'data2'
print(' :')
yield 'data3'
g = test()
print(next(g))
出力:
:
data1
3つのyieldが返されているが、
next()
関数を1回しか使用していないため、data1
、最初のyield
が返されたデータのみが印刷されている.2回呼び出すの?print(next(g))
print(next(g))
出力:
:
data1
:
data2
まとめ:
next()
関数を1回呼び出すと、ジェネレータが実行され、yield
キーワードに遭遇した後、データが返されます.その後、ジェネレータは運転を一時停止し、現在の運転状態を保存し、次のnext()
呼び出しを待つ.5、ループを使用してジェネレータを反復する
上記の例では、
next()
関数によって値を取ります.この方式はデータ量が大きくなると、面倒になります.ジェネレータも反復可能なオブジェクトなので、ループを使用して反復することができます.0~2を印刷した例は以下のように書き換えられる.
def getN(N):
n = 0
while n<N:
yield n
n+=1
g = getN(10)
while True:
try:
print(next(g),end='\t')
except StopIteration:
break #
注:while
サイクルで実現する場合は、try...except
でStopIterator
異常をキャプチャします.def getN(N):
n = 0
while n<N:
yield n
n+=1
g = getN(3)
for data in g:
print(data)
注:for
ループは、next()
関数を自動的に呼び出し、異常をキャプチャします.使用を推奨します.ブロガーのその他のシリーズ記事:
[1]【pythonユーティリティ】-スライス
[2]【pythonユーティリティ】-反復、反復可能オブジェクト、反復器
[3]【pythonユーティリティ】-リスト生成式
[4]【pythonユーティリティ】-アクセサリー
[5]Pythonが動的Webページデータを取得する方法
[6]Python+seleniumによる自動爬取の実施例
[7]python豆弁を這い出すTop 250-改良版
[8]【Scrapy爬取例】-爬取チェーンホームネットワーク指定都市中古住宅源情報