在python中使用内置函数_python内置函数的使用(一)

迭代器(iterator)和可迭代对象(iterable)

在python中,要实现要个对象可以进行遍历,也就是实现for循环,那么他必须是一个可迭代对象,例如string,tuple,list,dict,set都是可迭代对象(iterable),实现的方法是写入了__iter__()函数,前面我们说过鸭子模型,只要实现了这个方法,那么自定义类就可以看成是 一个可迭代对象。如果我们想要实现一个迭代器,那么我们就要实现写入__next__()方法,举个例子要把list迭代对象转变成迭代器,我们有两种方法让他转变为迭代器,一种就是直接用内置函数iter(),或者自定义类,重写__next__()方法。

自定义实现类实现for循环功能:

class A:

pass

a = A()

for i in a:

print(i) #打印结果:'A' object is not iterable 报错,说明他不是可迭代对象

首先我们要让他是一个可迭代对象:

class A:

def __iter__(self):

pass

a = A()

for i in a:

print(i) #打印结果:还是报错

我们为什么实现了__iter__()把对象变成可迭代对象,怎么还不能使用for循环,我们需要知道,我们执行for循环的时候,他会去找__next__()方法,我们自定义的方法中没有实现__next__(),那么我们实现一下

class A:

def __iter__(self):

self.a = 1

return self #这里必须返回自身的实例

def __next__(self):

a = self.a

if a < 10:

self.a += 1

else:

self.a = 1 #重新赋值并结束循环

raise StopIteration

return a

a = A()

for i in a:

print(a) # 打印结果:1 2 3 4 5 6 7 8 9

这样我们便实现了自定义类实现for循环功能,同时由于他实现了__next__()方法,他本身就是一个迭代器。

用iter()转化为迭代器

l = [1,2]

for i in l:

print(i)

l = iter(l)

print(l) #打印结果: 我们发现然是一个新的对象,不再是list了,同时他也成为了一个迭代器

print(next(l)) # 打印结果:1

print(next(l)) # 打印结果:2

print(next(l)) #打印结果:报错

我们可以看到迭代器我们可以用next(l)只会一步一步去找下一个,那么我们什么时候能用到迭代器呢?我们执行for循环会把所有的结果都查找到并使用,那么会造成内存浪费。我们发现当我们不知道确定的对象数量的时候,迭代器就很好使用了,也能使用next()找下一个数。我们实现的for循环必须有一个界限值,不然电脑会奔溃。

总结:内置iterable对象可以使用for循环,iterator对象可以使用next()方法,自定义类__iter__()和__next__()必须都实现才能使用for循环,那么自定义类本身就是一个迭代器了

生成器的使用

def B():

for i in range(3):

yield i

b = B()

print(b) #一个生成器

for i in b:

print(i) #打印结果:0,1,2

for i in b:

print(i) # 打印结果: 空的

为什么第二次for循环后不打印任何东西了?生成器在执行完后不会从新给定值,它只生产出之后就完成了自己的使命,我们可以说生成器就是一种特殊的迭代器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值