ホームページ  >  記事  >  バックエンド開発  >  Pythonイテレーターとitertoolsモジュール

Pythonイテレーターとitertoolsモジュール

高洛峰
高洛峰オリジナル
2017-02-22 10:28:401628ブラウズ

イテレーター Python では、イテレーター プロトコルはオブジェクトの __iter() メソッドと next() メソッドを実装します。前者はオブジェクト自体を返し、後者はコンテナーの次の要素を返します。これら 2 つのメソッドを実装するオブジェクトは反復可能オブジェクトです。イテレータは遅延的であり、使用されたときにのみ生成されるため、すべてのデータを一度にメモリに書き込むのとは異なり、大量のデータを処理する場合に利点があります。以下では、自分でイテレータを作成しました。for ループを使用して、イテレータ プロトコルを実装するオブジェクトの場合、for ループと同様のイテレータ ツールを使用できることがわかります。しかし、以下の出力を見ると、2 番目の出力が空になっているのはなぜでしょうか。リストを使用すると、同じオブジェクトを複数回出力できます。これと、独自のイテレータ プロトコルを実装するオブジェクトとの違いは何ですか?

class it(object):

def __init__(self, n):

self.a = 0
self.n = n

def __iter__(self):
<br/>
def next(self):
if self a
print ' '
print '------'
for j in i:
print j
# 1 2 3 4 5
# ------
勉強した後、リストや他の種類のイテレータはiterator オブジェクト自体は返されません。次に、テスト用に次のコードを作成しました。印刷結果からわかるように、TestIt のようなオブジェクトは繰り返し使用できます。そこで、別の質問があります。 next() メソッドを実装していないオブジェクトもイテレータ オブジェクトなのでしょうか。これは、it クラスを使用する場合、イテレーター オブジェクトが返され、it イテレーターを使用してイテレーター関数が実装されるためです。これは、イテレーター プロトコルの実装と同等です。イテレータ プロトコルは Python では非常に便利です。Python にはイテレータについての itertools モジュールがあります。ここで itertools モジュールについて学び、そこにどんな驚きがあるかを見てみましょう。
class TestIt(object):
def __init__(self, a):
self.a = a 
def __iter__(self):
return it(self.a)


itertools



無限反復子



1 count()、2つのパラメータを受け入れます、1つ目は開始番号、2つ目はストライド、デフォルトは0から始まり、使用法は次のとおりです

import itertools as it

c = it.count(10, 2)
for i in c:
    if i > 20:
        break
    print i,
# 10 12 14 16 18 20

2cycle()はイテレータオブジェクト(リスト、文字列など)である1つのパラメータを受け取り、ループしてイテレータ内の要素を生成します

c = it.cycle([1, 2, 3])
i = 1
for j in c:
    if i > 7:
        break
    print j,
    i += 1

3repeat()は2つのパラメータを受け入れます、 use 最初のパラメータを n 回生成するには

for j in it.repeat([1, 2, 3], 4):
print j

限定イテレータ、よく使うと思うものを選択してください

1chain()、複数のイテレータオブジェクトをパラメータとして受け取り、それらを接続しますchain(' abc', [ 1, 2, 3])

2 compress(data, selectors)、後のパラメータに従って前のパラメータをフィルタリングします。両方のパラメータはイテレータオブジェクトである必要があります

3 dropwhile

(

pre, preパラメーターは機能であり、pre(i)がtrueの場合、このアイテムとすべての次の項目を返します。

iterable

[,

keyfunc

])、ここで iterable は反復可能なオブジェクト、 keyfunc はグループ化関数であり、 iterable の連続する項目をグループ化するために使用されます。指定されていない場合、イテラブル内の連続する同一の項目はデフォルトでグループ化され、 のイテレータが返されます。

ifilter(function or None, sequence),将 iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 True 的项

6 tee(iterable [,n]),tee 用于从 iterable 创建 n 个独立的迭代器,以元组的形式返回,n 的默认值是 2。


 for j in it.tee(&#39;abc&#39;, 4):
     print list(j)


组合生成器

permutations(iterable[, r]),用于生成一个排列,r是生成排列的元素长度,不指定则为默认长度


  list(it.permutations(  list(it.permutations(, 2


combinations(iterable, r), 求序列的组合,其中,r 指定生成组合的元素的长度,是必需的参数

3 combinations_with_replacement(iterable, r),生成的组合包含自身元素 

 print list(it.combinations_with_replacement(&#39;abc&#39;, 2))
 # [(&#39;a&#39;, &#39;a&#39;), (&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;), (&#39;b&#39;, &#39;b&#39;), (&#39;b&#39;, &#39;c&#39;), (&#39;c&#39;, &#39;c&#39;)]

更多python迭代器以及itertools模块相关文章请关注PHP中文网!

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