首页 > 编程知识 正文

python中迭代器的基本方法,python字符串倒序

时间:2023-05-03 09:39:55 阅读:148808 作者:3291

一、实现可重复对象和可重复对象的方法

1 .从可重复对象中获得迭代器对象

例如,l是可重复对象,而ITER(L )是迭代器对象

in [1] : l=[ 1,2,3,4 ]

In [2]: l.__iter__

Out[2]:

in[3]:t=ITER(L ) )

In [4]: t.next (

Out[4]: 1

In [5]: t.next (

Out[5]: 2

In [6]: t.next (

Out[6]: 3

In [7]: t.next (

Out[7]: 4

In [8]: t.next (

请参见----------------------------------------- -

静态跟踪(mostrecentcalllast ) )。

输入() )。

---- 1 t.next () )。

停止身份:

for x in l :

print x

for循环的工作流是首先ITER(L )得到一个t,然后调用一个接一个的t.nex ),捕获StopIteration并结束迭代

#直接调用以下函数的方法在数据量多的情况下网络IO要求变高,所以也可以采用迭代器的方法

defGetweather(city ) :

r=requests.get (u ' http://wthr cdn.etouch.cn/weather _ mini? city=' city )

data=r.json () (data ) ) (forecast ) )0) ) ) )。

return '%s:%s,%s'%(city,data['low'],data['high'] ) ) ) ) ) ) ) )。)

打印网关(u '北京) )。

返回值:

北京:低温13、高温28

实现迭代器对象的weather迭代器,next方法每次返回城市气温

实现可重复的对象WeatherIterable,iter方法返回迭代器对象

#-* -编码: utf-8-* -

导入请求

from collections import Iterable,Iterator

classweatheriterator (迭代器) :

def __init__(self,cities ) :

self.cities=cities

self.index=0

defGetweather(self,city ) :

r=requests.get (u ' http://wthr cdn.etouch.cn/weather _ mini? city=' city )

data=r.json () (data ) ) (forecast ) )0) ) ) )。

return '%s:%s,%s'%(city,data['low'],data['high'] ) ) ) ) ) ) ) )。)

defnext(self ) :

ifself.index==Len(self.cities ) :

raise StopIteration

city=self.cities[self.index]

self.index =1

return self.getWeather(city )

classweatheriterable(iterable ) :

def __init__(self,cities ) :

self.cities=cities

def __iter__(self ) :

returnweatheriterator (self.cities )。

forxinweatheriterable([u '北京',u '上海',u '广州',u '深圳' ) :

printx.encode(utf-8 ) )。

输出:

北京:低温13、高温28

上海:低温14、高温22

广州:低温17,高温23

深圳:低温18,高温24

二、使用生成器函数实现可重复对象

1 .实现可以重复给定范围内所有素数的可重复对象的类

质数定义为,大于1的自然数中,不再有1和其本身以外的因数的数称为质数。

具有yield的函数是generator,与普通函数不同,generator看起来像函数调用,但在正确之前不会执行函数代码

其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

class PrimeNumbers:

def __init__(self, start, end):

self.start = start

self.end = end

def isPrimeNum(self, k):

if k < 2:

return False

for i in xrange(2, k):

if k % i == 0:

return False

return True

def __iter__(self):

for k in xrange(self.start, self.end + 1):

if self.isPrimeNum(k):

yield k

for x in PrimeNumbers(1, 10):

print x

输出:

2

3

5

7

三、实现反向迭代

1.反向进行迭代

例如: 实现一个浮点数发生器FloatRange(和xrange类似),根据给定范围(start, end)和步径值(step)产生一系列连续浮点数,如迭代FloatRange(3.0,4.0,0.2)可产生序列:

正向: 3.0 -> 3.2 -> 3.4 -> 3.6 -> 3.8 -> 4.0

反向: 4.0 -> 3.8 -> 3.6 -> 3.4 -> 3.2 -> 3.0

class FloatRange:

def __init__(self, start, end, step=0.1):

self.start = start

self.end = end

self.step = step

def __iter__(self):

t = self.start

while round(t,14) <= round(self.end, 14):

yield t

t = t + self.step

def __reversed__(self):

t = self.end

while round(t, 14) >= round(self.start, 14):

yield t

t = t - self.step

for x in reversed(FloatRange(3.0, 4.0, 0.2)):

print x

输出:

4.0

3.8

3.6

3.4

3.2

3.0

for x in FloatRange(3.0, 4.0, 0.2):

print x

输出:

3.0

3.2

3.4

3.6

3.8

4.0

上面代码采用round函数是因为浮点数比较会有精度问题,所以需要进行四舍五入

2.对迭代器进行切片操作

例如: 有某个文本文件,想读取其中某范围的内容,如100-300行之间的内容,python中文本文件是可迭代对象,是否可以使用类似列表切片的方式得到一个100-300行文件内容的生成器

使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器

f = open('/var/log/dmesg')

from itertools import islice

# 对文件内容100到300行之间进行切片,返回的是个生成器对象,默认歩径是1

islice(f, 100, 300)

# 前500行内容

islice(f, 500)

# 100行到末尾结束内容

islice(f, 100, None)

ps: 每次使用islice要重新申请对象,它会消耗原来的迭代对象

四、 迭代多个对象

1. 在一个for语句中迭代多个可迭代对象

1、某班学生考试成绩语文、数学、英语分别存储在3个列表中,同时迭代三个列表,计算三个学生的总分(并行)

2、某年级四个班,某次考试每班英语成绩分别存储在4个列表中,依次迭代每个列表,统计全学年英语成绩高于90分人数(串行)

解决方案:

并行: 使用内置函数zip,它能将多个可迭代对象合并,每次迭代返回一个元组

from random import randint

chinese = [randint(60,100) for _ in xrange(40)]

math = [randint(60,100) for _ in xrange(40)]

english = [randint(60,100) for _ in xrange(40)]

total = []

for c,m,e in zip(chinese, math,english):

total.append(c+m+e)

print total

输出:

[204, 227, 238, 201, 227, 205, 251, 274, 210, 242, 220, 239, 237, 207, 230, 267, 263, 240, 247, 249, 255, 268, 209, 270, 259, 251, 245, 262, 234, 221, 236, 250, 251, 249, 242, 255, 232, 272, 237, 253]

串行: 使用标准库中的itertools.chain,它能将多个可迭代对象连接

from random import randint

from itertools import chain

class1 = [randint(60,100) for _ in xrange(40)]

class2 = [randint(60,100) for _ in xrange(42)]

class3 = [randint(60,100) for _ in xrange(39)]

class4 = [randint(60,100) for _ in xrange(43)]

count = 0

for s in chain(class1, class2, class3, class4):

if s > 90:

count = count + 1

print count

输出:

38

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。