python迭代

可迭代对象: 

可迭代对象是指如:

list1 = [1,2,3,4]

str1 = "abcde"

等可以通过循环来遍历全部内容的对象。


迭代器对象:

通过iter(iterable item) 去创建一个对象,

比如利用上面的list1, 创建一个迭代器对象 我们可以这么做:

t = iter(list1)

接下来我们去可以用t.next() #python2.x中

next(t) #python3.x中

去迭代每一个对象

当迭代结束的时候就会返回一个异常。


--------------------------------------------------------------------------------------------------------------------------

接下来使用继承Iterable 和 Iterator的方式来使用迭代:

from collectionsimport Iterator, Iterable
class StudentIterator(Iterator):
def __init__(self,students):
self.students = students
self.index =0

def getStudent(self,student):
return ('xx university student ' + student)

def __next__(self):
if self.index == len(self.students):
raise StopIteration
student = self.students[self.index]
self.index +=1
return self.getStudent(student)

class StudentIterable(Iterable):
def __init__(self,students):
self.students = students

def __iter__(self):
return StudentIterator(self.students)

for x in StudentIterable(['Dodo','Jack','Bob','Rush']):
print (x)

这种方法最后迭代的时候最后返回的东西是getStudent 方法中所定义的形式。

在可迭代对象中 都有内部包含一个方法__iter__()方法, 所以我们需要在可迭代对象中调用这个方法,在for循环中 调用的机制是通过调用__next__()方法。

我们可以通过使用dir(list1)查看这个列表的接口 可以看到有__iter__()方法。

切记从collections 这个包中导入这两个类

--------------------------------------------------------------------------------------------------------------------------

使用生成器函数实现可迭代对象:

用生成器对象实现可迭代对象实际上就是利用了yield 来实现这个功能。 

yield 在执行完一次后会停留在这 等待信号进行下一次的运行。这就是用yield这个生成函数进行迭代的机制

yield在迭代对象中通常放在__iter__()函数下使用。


比如我们接下来要求一个范围内所有的素数:

class getPrimeNumber:
def __init__(self,start,end):
self.start = start
self.end = end
def isPrimeNumber(self,k):
if k <2:
return False
else:
for iinrange(2, k):
if k % i ==0:
return False
return True

def __iter__(self):
for i inrange(self.start,self.end +1):
if self.isPrimeNumber(i):
yield i

for m in getPrimeNumber(1, 50):
print (m)

在这通过利用了yield 每次迭代后等待的状态来实现了生成器函数的迭代。


--------------------------------------------------------------------------------------------------------------------------

反向迭代:

我们在反向迭代一个列表的时候, 我们会采用reversed

比如说:

list1 = [1,2,3,4]

for i in reversed(list1):

print i

就可以实现了 

其中reversed(list1)是一个反向的迭代器对象(类似于iter(l))

也可以用next一一输出


class Test:
def __init__( self, start, end, step):
self.start = start
self.end = end
self.step = step

def __iter__( self):
temp = self.start
while temp <= self.end:
yield temp
temp += self.step

def __reversed__( self):
temp = self.end
while temp >= self.start:
yield temp
temp -= self.step

for i in Test( 1, 5, 0.5):
print (i)

for i in reversed(Test( 1, 5, 0.5)):
print (i)

在这我们使用正反两个迭代进行对比。


--------------------------------------------------------------------------------------------------------------------------

迭代器的切片:

在使用迭代器的切片时,我们可以导入 itertools.islice函数

但是在使用的时候我们应该注意 每次使用应该重新去获取一个生成器对象

比如

l = [1,2,3,4,5,6,7,8,9,10]

t = iter(l)

在使用 islice(t,5,8)后

我们会只剩下9,10

所以我们接着

for i in t:

print (t)

只能得到结果9,10.


--------------------------------------------------------------------------------------------------------------------------


在一个for中迭代多个可迭代对象:

并行的情况下我们可以采用zip的方法。

在串行的情况下,我们可以采用itertools包下的chain方法。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值