Overview
Iterator is a way to access the elements of a collection. The iterator object starts accessing from the first element of the collection until all elements have been accessed. Iterators can only go forward and not backward.
Lazy evaluation or lazy evaluation
Iterators do not require you to prepare all the elements in the entire iteration process in advance. An element is only evaluated when iterating to it, and before or after that element may not exist or be destroyed. This feature makes it particularly suitable for traversing some huge or infinite collections.
Today I created an entity class, roughly as follows:
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 # 返还金额
Then create an entity list:
accounts = [Account("张三", "年费用户", 450.00, 50), Account("李四", "月结用户", 100.00), Account("杨不悔", "月结用户", 190.00, 25), Account("任我行", "月结用户", 70.00, 10), Account("凌未风", "年费用户", 400.00, 40)]
I want to execute the next()
function, that is, "next" when needed to get the list the next element.
Test it directly:
It turns out that List does not support the next()
feature. At this time, List is just an iterable, not an iterator.
The difference between iterable and iterator is as follows:
iterable - only implements the object of __iter__;
iterator - an object that implements both __iter__ and __next__ methods.
Among them, __iter__
returns the iterator object, and __next__
returns the next element of the iteration process.
1. Make the list an iterator
To make the previous accounts List an iterator, just use a simple iter()
function :
accounts_iterator = iter(accounts) (next(accounts_iterator)).account_name
The result is as shown below:
It is estimated that there are still many functions for such a simple function Many Python developers don’t know this?
2. Custom iterator object
In terms of expansion, how to define your own iterator object? In fact, it is to implement the __iter__
and __next__
methods according to the above definition.
We next define an AccountIterator class:
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]
The running result is as follows:
After this tossing, the next() function was realized. Python has many unexpected functions that are still waiting for us to continue to explore. Perhaps this is the charm and geekiness of Python.
For more related articles on methods and examples of implementing iterators in python, please pay attention to the PHP Chinese website!