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

効率的なループのためのイテレータを作成するPython関数


ほとんどのプログラミング言語と同様に、Pythonはwhileステートメントとforステートメントを提供してループ構造を形成します。 forステートメントは、リスト、タプル、文字列などの反復可能オブジェクトをトラバースする場合に特に役立ちます。より効率的で高速な反復ツールは、Pythonの標準ライブラリのitertoolsモジュールで定義されています。これらのイテレータビルディングブロックは、HaskellやSMLなどの関数型プログラミング言語での同様のツールのPythonic実装です。

itertoolsモジュールの関数には3つのタイプがあります。

  • 無限イテレータ
  • 有限イテレータ
  • 組み合わせイテレータ

次の関数は無限のシーケンスを生成します。

count() −この関数は、開始値から等間隔の値のイテレータを返します。この関数には、この間隔で連続する値をインクリメントするオプションのステップ値を含めることができます。

>>> from itertools import count
>>> for x in count(20):
print (x)
>>> for x in count(100,10):
print (x)

最初のステートメントは20から始まる無限のシーケンスを生成し、2番目のステートメントはステップ周波数10で100から数を生成します。ループは無限であり、それ自体で終了しないことに注意してください。 Ctrl-Cを押すと終了します

cycle() −この関数は、指定されたiterableから各要素の戻りを開始し、そのコピーを保存します。要素が使い果たされると、保存されたコピーの要素が返され、無限ループが形成されます。

>>> from itertools import cycle
>>> for x in cycle("hello"):
print (x)

文字列内の文字は、キーボード割り込みCtrl-Cが発行されるまで繰り返し印刷されます。

repeat() −この関数は、オブジェクト引数を繰り返し返します。 2番目の引数「times」が指定されている場合、繰り返しが何度も発生します。

>>> from itertools import repeat
>>> for x in repeat(1):
print (x)
>>> for x in repeat('hello', 10):
print (x)

最初のループは1を際限なく出力します。 2つ目は「こんにちは」を10回印刷します。

次のカテゴリの関数は、最短の入力シーケンスで終了する有限イテレータを返します。

accumulate() −この関数には2つのパラメーターがあります。 1つ目は、反復可能(リスト、タプル、または文字列)です。デフォルトの2番目のパラメーターはoperator.add()(標準の加算演算子を実装する演算子モジュールの関数)ですが、2つの数値パラメーターを受け取る他の関数でもかまいません。

accumulate(sequence, func)

入力シーケンスの最初の2つの要素は、funcによって処理されます。プロセスの結果は、次の反復の最初のパラメーターであり、funcの2番目のパラメーターは入力シーケンスの3番目の要素です。このプロセスは、シーケンスが使い果たされるまで繰り返されます。累積関数は、連続する要素を処理した結果、各要素が累積されるイテレータを返します。

次の例では、リスト内の番号が累積的に追加されます。デフォルトの関数の引数はaddoperationであることに注意してください。

>>> from itertools import accumulate
>>> list(accumulate([1,2,3,4,5]))
[1, 3, 6, 10, 15]

Accumulate()関数の2番目のパラメーターとしてユーザー定義関数を使用できます

>>> def multiply(x,y):
return x*y
>>> list(accumulate([1,2,3,4,5], multiply))
[1, 2, 6, 24, 120]

この動作は、組み込みのreduce()関数にいくぶん似ています。 reduce()関数は累積の最終結果のみを返しますが、accumulate()はすべての中間結果のイテレーターを作成します。

chain() −この関数は、パラメーターとして複数の反復可能オブジェクトを持つことができます。最初のイテレータの各要素を結果のイテレータに生成し、イテレータパラメータがなくなるまで次の要素に進みます。

>>> from itertools import chain
>>> list(chain([10,20],'hello',range(4)))
[10, 20, 'h', 'e', 'l', 'l', 'o', 0, 1, 2, 3]

dropwhile() −この関数は、述語関数の引数がtrueを返す限り、terableから要素を削除することによってイテレータを返します。関数がfalseを返すと、残りのすべての要素がイテレータに渡されます。

>>> from itertools import dropwhile
>>> def iseven(x):
if x % 2 == 0:
return True
else:
return False
>>> list(dropwhile(iseven, [12,90,61,4,15]))
[61, 4, 15]

filterfalse() −この関数は、述語関数の結果がFalseである要素を除外することによってイテレーターを返します。

>>> from itertools import filterfalse
>>> def iseven(x):
if x % 2 == 0:
return True
else:
return False
>>> list(filterfalse(iseven, [12,90,61,4,15]))
[61, 15]

islice() −この関数は、反復可能から特定の要素を選択することによって反復子を構築します。選択基準は、開始、停止、およびステップのパラメーターによって異なります。選択は開始値から始まり、停止値まで続きます。 stopがNoneの場合、iterableの最後まで進みます。それ以外の場合、選択は指定されたインデックスで停止します。ステップパラメータはデフォルトで1です。要素の選択は、ステップパラメータごとに増加します。どのパラメータも負にすることはできません。

>>> from itertools import islice
>>> list(islice(range(10),1,5,2))
[1, 3]
>>> list(islice(range(10),0,None,3))
[0, 3, 6, 9]
>>> list(islice(range(10),5,None))
[5, 6, 7, 8, 9]
>>> list(islice(range(10),5))
[0, 1, 2, 3, 4]

次の関数は、反復可能なオブジェクトから組み合わせイテレータを生成します。

product() −この関数は、入力シーケンスの要素のデカルト積であるイテレータを生成します。これは、ネストされたforループを構築するのと同じで、1つは反復可能な各シーケンスをトラバースするためのものです。

次の例では、リスト内包法を使用して、2つのシーケンスで2つのネストされたループを実行し、デカルト積を作成します。

>>> [[x,y] for x in [1,2,3] for y in ['a','b','c']]
[[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], [2, 'b'], [2, 'c'], [3, 'a'], [3, 'b'], [3, 'c']]

product()関数は同様の結果を生成します

>>> from itertools import product
>>> list(product([1,2,3],['a','b','c']))
[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]

順列() −この関数は、入力反復可能で要素のすべての可能な順列を生成します。各順列の長さは、この関数の2番目のパラメーターとして指定できます。指定しない場合、長さは1です。

>>> list(permutations(range(1,4),2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

組み合わせ() −この関数は、入力反復可能要素のすべての可能な組み合わせを生成します。各順列の長さは、この関数の2番目のパラメーターとして指定できます。指定しない場合、長さは1です。

>>> from itertools import combinations
>>> list(combinations(range(1,4),2))
[(1, 2), (1, 3), (2, 3)]

この記事では、Pythonライブラリのitertoolsモジュールで定義されているさまざまなイテレータツールを紹介します。


  1. Pythonのissubset()関数

    この記事では、Python標準ライブラリで利用可能なissubset()関数の実装と使用法について学習します。 issubset()メソッドは、セットのすべての要素が別のセットに存在する場合(引数として渡される場合)はブール値のTrueを返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/

  2. Intersection()関数Python

    この記事では、任意のセットで実行できるintersection()関数について学習します。数学によると、共通部分とは、2つのセットから共通の要素を見つけることを意味します。 構文 <set name>.intersection(<set a1> <set a2> ……..) 戻り値 引数として渡されるセット内の共通要素。 例 set_1 = {'t','u','t','o','r','i','a','l&