概述
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
延迟计算或惰性求值 (Lazy evaluation)
迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
今天创建了一个实体类,大致如下:
1
2
3
4
5
6
7
8
9
10
|
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 # 返还金额
|
然后创建一个实体列表:
1
2
3
4
5
|
accounts = [Account( "张三" , "年费用户" , 450.00 , 50 ),
Account( "李四" , "月结用户" , 100.00 ),
Account( "杨不悔" , "月结用户" , 190.00 , 25 ),
Account( "任我行" , "月结用户" , 70.00 , 10 ),
Account( "凌未风" , "年费用户" , 400.00 , 40 )]
|
我想要执行next()
功能,也就是需要的时候“next”一下,得到List中的下一个元素。
直接测试一下:
结果发现List不支持next()
特性。这时候,List只是一个iterable,而不是iterator。
iterable和iterator的区别如下:
- iterable —— 只实现了__iter__的对象;
- iterator —— 同时实现了__iter__和__next__方法的对象。
其中, __iter__
返回iterator对象, __next__
则返回迭代过程的下一个元素。
1. 让列表成为iterator
要让前面的accounts List成为iterator只需简单的一个iter()
函数:
1
2
|
accounts_iterator = iter (accounts)
( next (accounts_iterator)).account_name
|
结果如下图所示:
这么简单的函数,估计还是有不少Python开发者不知道吧?
2. 自定义iterator对象
扩展开来讲,如何定义自己的iterator对象呢?其实也就是按照上面的定义,实现__iter__
和__next__
方法。
我们接下来定义一个AccountIterator类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 ]
|
运行结果如:
通过这一阵折腾,next()功能就实现了。Python有不少意外的功能,还等着我们不断去探究,也许这就是Python的魅力及极客之处。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。
原文链接:http://www.2gua.info/post/64