注ジェネレータ003とPythonのジェネレータ式

注ジェネレータ003とPythonのジェネレータ式

以下は、私はすべてが共有するために、「Pythonがスムーズ」の後、今出て、私はあなたにPythonの学習を支援したいと考えて勉強個人的なメモです。

マイクロチャンネル公共番号:技術古いディンゴ、ID:TechDing、ので、しばらくお待ち最初に発表されました。

この章の知識内のデータ:

  1. Builderは、一度だけ呼び出し元に値を返すんyieldキーワードを使用して、懸濁し、その役割は次のとおりです。メモリ空間を節約するために。

  2. 発電機は、反復方法の要素の値を取得することができる、次の()関数を使用することができる、中間体も近い()は、任意の時点で使用される発電機を停止させることができます。

  3. ジェネレータ式は、特殊な発電機と考えることができ、そのコードが理解しやすく、より簡潔であり、他の機能と組み合わせて、より柔軟になります。

1.ジェネレータ

Pythonは特別なプログラム、反復ループの制御動作で生成されます。一般的な機能に関して、それは一度だけ値を返し、収率キーワード生成を使用して、すべての使い捨ての戻り値を返します。

このデザインは、大きな利点があります:関数の戻り値は非常に大きな配列の外にある場合、データ処理で、それが唯一の使用は復帰要素の値を得ながら、時にはMemoryErrorは、エラーを報告し、多くのメモリを取るだろう、状況は、メモリフットプリントを最適化することができます。

このような観点から、すべてのコールジェネレータ関数は、値の要素を返し、この機能は、発電機は、関数のように見えますが、イテレータのような役割を果たします。

def squares(x): # 计算0-x的所有数的平方
#     return [i*i for i in range(x)] # 普通写法,一次返回一个list,包含所有元素
    for i in range(x):
        yield i*i # 生成器:一次只返回一个值
print(squares(5)) # <generator object squares at 0x00000157DBD16830>
# 获取生成器中的元素值
for value in squares(5): # 行为类似于迭代器,循环获取元素值
    print('value: ',value)

発生しない戻り値が、関数発生器が自動的に(メンバーメソッド使用して次の呼び出しするまで、中断するまでの一般的な機能として__next__実現される)は、この関数の実行を継続するために戻ります。

したがって、値発生素子を得るためには、のような部材によってnext()メソッドする必要があります。

square_five=squares(5)
print(next(square_five)) # 0
print(next(square_five)) # 1
print(next(square_five)) # 4
print(next(square_five)) # 9
print(next(square_five)) # 16
print(next(square_five)) # 报错:StopIteration: 超过yield的所有元素

次の()を終了するまで機能が停止ジェネレータ機能を継続するたびに実行されます。

この機能発生器は、効果的にメモリを節約することができ、「遅延評価」または「遅延評価(遅延評価)」と呼ばれています。遅延評価は、実際にあるの共同プログラムのアイデアを具現化しています。

ポーズ - - この現象が発生するイテレータと同様であるが、両者が全く異なるが、反復子この行われていない再度実行が - 再度特性を中断、反復計算は遅延を有していない、何の連携プログラムは存在しません私は思いました。

使用遅延計算したら、大幅な読み出し動作は、発電機は、次の方法を使用することができ、大きなファイルとして、メモリを節約することができます。

## 读取大文件的生成器方法:
def load_big_file(file_path):
    BLOCK_SIZE = 1024
    with open(file_path, 'rb') as f:
        while True:
            block = f.read(BLOCK_SIZE)
            if block:
                yield block # 一次只加载一个block到内存中,避免MemoryError
            else:
                return

次の()関数で処理された提供に加えて、()は、任意の時点で閉じるを用いて発電を終了してもよいです。次のコード:

## 使用close()可以随时退出生成器
square_five=squares(5)
print(next(square_five)) # 0
print(next(square_five)) # 1
print(next(square_five)) # 4
square_five.close() # 退出生成器
print(next(square_five)) # Error: StopIteration:
print(next(square_five)) # Error: StopIteration:

2.ジェネレータ式

ビューの正式な観点から、と理解ような表現のリストを生成する、唯一の[])のリスト(に由来する式と、その差が大きい、それは組み合わせジェネレータ発現および機能リスト反復言えます解像度。

ジェネレータ式はラムダ式と正常な機能に類似特殊ファンクションジェネレータ、と考えることができます。しかし、発電機および発電式ビルダ発生器としては、オブジェクト、返り一つだけの値を返します。

# 上面的squares函数可以改写为:
# 列表推导式的写法是:
squares_list=[i*i for i in range(5)] # 一次性返回整个list
print('列表推导式:',squares_list) # 列表推导式: [0, 1, 4, 9, 16]
# 生成器表达式:
squares2=(i*i for i in range(5)) # 生成器表达式一次返回一个值
print('生成器表达式:',squares2) # 生成器表达式: <generator object ..
print(next(squares2)) # 0
print(next(squares2)) # 1
print(next(squares2)) # 4

ジェネレータ式は特別な発電機であるので、それはまた、発電機の特性を有し、ループの要素値を得るために使用することができる、自動的に実行する次の()関数を呼び出すための内部ループ。

# generator对象可以直接用for来获取所有元素值
squares2=(i*i for i in range(5)) # 生成器表达式就是一个generator对象
for i in squares2:
    print('i: ',i)

# 上面可以简写为:
[print('i: ',i) for i in (i*i for i in range(5))]

関数の引数として発電発現した場合、(オフであってもよい)を省略し、例えば、直接使用することができます。

## 如果生成器表达式整个作为某个函数的参数,可以省略掉()
max_value=max(i*i for i in range(5))  # 计算生成器的所有元素中的最大值
print(max_value) # 16

マイクロチャンネル公共番号:技術古いディンゴ、ID:TechDing、ので、しばらくお待ち最初に発表されました。

コードのすべてがにアップロードされている。この論文では、私のGitHub、ダウンロードして歓迎

参考文献:

  1. 「流暢パイソン」、ルチアーノRamalho(著)アンドラ、呉柯(翻訳)。

おすすめ

転載: www.cnblogs.com/RayDean/p/10987551.html