Pythonでイテレータを実装する方法の例

高洛峰
リリース: 2017-02-23 15:47:22
オリジナル
1873 人が閲覧しました

概要

イテレータは、コレクションの要素にアクセスする方法です。イテレータ オブジェクトは、コレクションの最初の要素からアクセスを開始し、すべての要素がアクセスされるまでアクセスします。イテレータは前進のみ可能であり、後進はできません。

遅延評価または遅延評価

イテレーターでは、反復プロセス全体のすべての要素を事前に準備する必要はありません。要素は反復処理時にのみ評価され、その前後で要素が存在しないか、破棄される可能性があります。この機能は、巨大または無限のコレクションを走査するのに特に適しています。

今日は、大まかに次のようにエンティティクラスを作成しました:

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()</code を実行したい> 関数、つまりリスト内の次の要素を取得するために必要な場合の「next」。 <code>next()功能,也就是需要的时候“next”一下,得到List中的下一个元素。

直接测试一下:

Pythonでイテレータを実装する方法の例

结果发现List不支持next()特性。这时候,List只是一个iterable,而不是iterator。

iterable和iterator的区别如下:

  1. iterable —— 只实现了__iter__的对象;

  2. iterator —— 同时实现了__iter__和__next__方法的对象。

其中, __iter__返回iterator对象, __next__则返回迭代过程的下一个元素。

1. 让列表成为iterator

要让前面的accounts List成为iterator只需简单的一个iter()函数:

accounts_iterator = iter(accounts)
(next(accounts_iterator)).account_name
ログイン後にコピー

结果如下图所示:

Pythonでイテレータを実装する方法の例

这么简单的函数,估计还是有不少Python开发者不知道吧?

2. 自定义iterator对象

扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter____next__

直接テストします:

Python でイテレータを実装する方法の例

List は next() 特性をサポートしていないことがわかりました。現時点では、List はイテレータではなく、単なるイテラブルです。

iterable と iterator の違いは次のとおりです:

  1. Pythonでイテレータを実装する方法の例iterable - __iter__ オブジェクトのみを実装します

  2. iterator —— __iter__ メソッドと __next__ メソッドの両方を実装するオブジェクト。

このうち、__iter__ は反復子オブジェクトを返し、__next__ は反復処理の次の要素を返します。

🎜🎜1. リストをイテレータにします🎜🎜🎜🎜前のアカウントのリストをイテレータにするには、単純な 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でイテレータを実装する方法の例🎜🎜こんな簡単な関数ですが、Python 開発者でも知らない人はまだまだ多いのではないでしょうか? 🎜🎜🎜2. カスタム反復子オブジェクト🎜🎜🎜🎜 拡張の観点から、独自の反復子オブジェクトを定義するにはどうすればよいでしょうか?実際には、上記の定義に従って __iter__ メソッドと __next__ メソッドを実装することを意味します。 🎜🎜次に AccountIterator クラスを定義します: 🎜🎜🎜rrreee🎜🎜🎜🎜 実行結果は次のとおりです: 🎜🎜🎜🎜🎜🎜 このトスの後、next() 関数が実装されます。 Python には、私たちが探索し続けることを待っている予期せぬ機能がたくさんあります。それが Python の魅力であり、マニアックさなのかもしれません。 🎜🎜Python でイテレーターを実装する方法のその他の例については、PHP 中国語 Web サイトに注目してください。 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート