2.1.8 Python中的迭代器

迭代器其实已经用过很多次了。
__iter__就是对象的一个特殊方法,它是迭代规则(iteratorpotocol)的基础。如果对象没有它,就不能返回迭代器,就没有 next()方法,就不能迭代。
1,__iter__()
dir(list)、dir(tuple)、dir(file)、dir(dict)来查看不同类型对象的属性,会发现它们都有__iter__
类型是list、tuple、file、dict的对象有__iter__()方法,标志着它们能够迭代。
#! /usr/bin/env python
# coding=utf-8

class MyFirst(object):
def __init__(self,n):
self.i = 0
self.n = n
def __iter__ (self):
return self
def next(self):
if self.i < self.n:
i = self.i
self.i += 1
return i
else:
raise StopIteration()

if __name__ == "__main__":
x = MyFirst(5)
print "x.next():",x.next()
print "x:",x
for i in x:
print i
代码运行之后:
>>>
x.next(): 0
x: <__main__.MyFirst object at 0x030B4F30>
1
2
3
4
(1) __iter__()是类中的核心,它返回了迭代器本身,实现了 __iter__()方法的对象,即意味着其可迭代。
(2)含有 next()的对象就是迭代器,并且在这个方法中,在没有元素的时候要发起StopIteration()异常。
斐波那契数列:
#! /usr/bin/env python
# coding=utf-8

class MyFirst(object):
def __init__(self,max):
self.max = max
self.a = 0
self.b = 1
def __iter__(self):
return self
def next(self):
c = self.a
if c > self.max:
raise StopIteration
self.a,self.b = self.b,self.a + self.b
return c
if __name__ == "__main__":
x = MyFirst(5)
print list(x)
运行结果:
>>>
[0, 1, 1, 2, 3, 5]
2,range()和xrange()
列表和迭代器之间的区别,有2个典型的函数: range()xrange()
help(range),help(xrange)查看:
range()的帮助文档和方法中可以看出,它的结果是一个列表。
xrange()返回的是 对象,类似range(),但 不是列表。它跟range()相比,稍快并具有更高的内存效率
dir(xrange):可以看到__iter__,说明返回结果是 可迭代的。
这样我们就可以总结出: range()得到的 列表会一次性被读入内存,而 xrange()返回的对象,则需要一个数值才返回一个数值。
迭代器不是外能的,它只能向前,不能回退,它也不适合在多线程中对可变集合进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值