pythonfor循环实例_python让实例作用于for循环并当做list来使用

python如果想让一个类被用于for....in  循环,类型list和tuple那样,可以实现__iter__方法。

这个方法返回一个迭代对象,python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

class Fib(object):

def __init__(self):

self.a,self.b=0,1 #初始化两个计数器a,b

def __iter__(self):

return self #实例本身就是迭代对象,故返回自己

def next(self):

self.a,self.b=self.b,self.a+self.b #计算下一个值

if self.a>100000: #退出循环的条件

raise StopIteration()

return self.a

把Fib实例作用于for循环:

for n in Fib():

print n

1

1

2

3

5

...

46368

75025

Fib 实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,例如,按下标取元素

print  Fib()[5]

此时会报错:TypeError: 'Fib' object does not support indexing

要实现按下标取元素,需要实现__getitem__()方法

def __getitem__(self,n):

a,b=1,1

for x in range(n):

a,b=b,a+b

return a

按下标获取元素

f=Fib()

print f[0] #1

print f[1] #1

print f[10] #89

print f[100] #573147844013817084101

list 有个切片方法获取元素

print range(100)[5:10] #[5, 6, 7, 8, 9]

对于Fib却报错,原因是__getitem__传入的参数可能是一个int,也可能是一个切片对象slice,需要做判断

def __getitem__(self, n):

if isinstance(n, int):

a, b = 1, 1

for x in range(n):

a, b = b, a + b

return a

if isinstance(n, slice):

start = n.start

stop = n.stop

a, b = 1, 1

L = []

for x in range(stop):

if x >= start:

L.append(a)

a, b = b, a + b

return L

试试Fib的切片

f=Fib()

print f[0:5] #==>[1, 1, 2, 3, 5]

print f[:10] # ==>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值