概要
イテレータは、コレクションの要素にアクセスする方法です。イテレータ オブジェクトは、コレクションの最初の要素からアクセスを開始し、すべての要素がアクセスされるまでアクセスします。イテレータは前進のみ可能であり、後進はできません。
遅延評価または遅延評価
イテレーターでは、反復プロセス全体のすべての要素を事前に準備する必要はありません。要素は反復処理時にのみ評価され、その前後で要素が存在しないか、破棄される可能性があります。この機能は、巨大または無限のコレクションを走査するのに特に適しています。
今日は、大まかに次のようにエンティティクラスを作成しました:
class Account(): def __init__(self, account_name, account_type, account_cost, return_amount=0): self.account_name = account_name # 账户名 self.account_type = account_type # 账户类型 self.account_cost = account_cost # 月结费用 self.return_amount = return_amount # 返还金额
次に、エンティティリストを作成します:
accounts = [Account("张三", "年费用户", 450.00, 50), Account("李四", "月结用户", 100.00), Account("杨不悔", "月结用户", 190.00, 25), Account("任我行", "月结用户", 70.00, 10), Account("凌未风", "年费用户", 400.00, 40)]
next()
を実行したい> 関数、つまりリスト内の次の要素を取得するために必要な場合の「next」。 next()
功能,也就是需要的时候“next”一下,得到List中的下一个元素。
直接测试一下:
结果发现List不支持next()
特性。这时候,List只是一个iterable,而不是iterator。
iterable和iterator的区别如下:
iterable —— 只实现了__iter__的对象;
iterator —— 同时实现了__iter__和__next__方法的对象。
其中, __iter__
返回iterator对象, __next__
则返回迭代过程的下一个元素。
1. 让列表成为iterator
要让前面的accounts List成为iterator只需简单的一个iter()
函数:
accounts_iterator = iter(accounts) (next(accounts_iterator)).account_name
结果如下图所示:
这么简单的函数,估计还是有不少Python开发者不知道吧?
2. 自定义iterator对象
扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter__
和__next__
直接テストします:
List はnext()
特性をサポートしていないことがわかりました。現時点では、List はイテレータではなく、単なるイテラブルです。 iterable と iterator の違いは次のとおりです:
iterator —— __iter__ メソッドと __next__ メソッドの両方を実装するオブジェクト。
このうち、__iter__
は反復子オブジェクトを返し、__next__
は反復処理の次の要素を返します。
iter()
関数を使用するだけです: 🎜🎜🎜class AccountIterator(): def __init__(self, accounts): self.accounts = accounts # 账户集合 self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.accounts): raise StopIteration("到头了...") else: self.index += 1 return self.accounts[self.index-1]🎜🎜🎜結果は次のようになります。以下:🎜🎜🎜🎜こんな簡単な関数ですが、Python 開発者でも知らない人はまだまだ多いのではないでしょうか? 🎜🎜🎜2. カスタム反復子オブジェクト🎜🎜🎜🎜 拡張の観点から、独自の反復子オブジェクトを定義するにはどうすればよいでしょうか?実際には、上記の定義に従って
__iter__
メソッドと __next__
メソッドを実装することを意味します。 🎜🎜次に AccountIterator クラスを定義します: 🎜🎜🎜rrreee🎜🎜🎜🎜 実行結果は次のとおりです: 🎜🎜🎜🎜🎜🎜 このトスの後、next() 関数が実装されます。 Python には、私たちが探索し続けることを待っている予期せぬ機能がたくさんあります。それが Python の魅力であり、マニアックさなのかもしれません。 🎜🎜Python でイテレーターを実装する方法のその他の例については、PHP 中国語 Web サイトに注目してください。 🎜