python3迭代器与生成器

可迭代对象(iterable)、迭代器(iterator)、生成器(generator)是python中非常重要、也是非常有用的特性。

凡是可返回一个迭代器的对象都可称之为可迭代对象,包括:常见的多容器,打开状态的files,sockets等等。

迭代器

迭代器是一个可以记住遍历位置的对象,从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退

两个基本的访问迭代器的方法:iter()和next();

实现了__iter__和__next__()方法的对象都是迭代器

__iter__:返回迭代器自身;

__next__:返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常

一个斐波那契迭代器示例:

class IterFib:

def __init__(self):

self.prev = 0

self.curr = 1

def __iter__(self):

return self

def __next__(self):

value = self.curr

self.curr += self.prev

self.prev = value

return value

fb=IterFib()

print(list(islice(fb, 10)))

生成器

生成器是一种特殊的迭代器,为一个使用yield返回值的函数。

一个斐波那契生成器示例:

def GenFib():

prev, curr = 0, 1

while True:

yield curr

prev, curr = curr, curr + prev

gf=GenFib()

print(list(islice(gf, 0, 10)))

生成器表达式与列表解析

生成器表达式与列表解析(推导)非常像,除使用括号与返回类型外其他都相似(在处理大量数据时生成器表达式在内存使用使用上占明显优势,会小很多):

(fun(x) for x in lst):生成器表达式;使用括号(作为参数时可省略括号),返回迭代器

[fun(x) for x in lst]:列表解析;使用方括号,返回list

列表解析基本语法:

[expression for it-value in itertable]

[expression for it-value initertableif cond-expr]

获取10以内偶数的平方

[a**2 for a in range(10) if a%2==0] #[0, 4, 16, 36, 64]

itertools模块

itertools模块可方便高效地辅助处理迭代器,对常用功能简要说下:

chain(*iterables):连接列表,返回iterable对象;

compress(data, selectors):返回数据对象data中对应规则selector中对应位置为true的元素

count(start=0,step=1):返回start开始步长为step的无限迭代器;

cycle(iterable):无限重复地返回迭代对象对象中的元素副本(每次返回迭代器中的一个元素);

dropwhile(predicate, iterable):从列表开始处丢弃predicate为True的元素,直到一个为False,返回从此元素开始的所有元素(不论后续元素是否满足predicate,若第一个元素就判断为False则返回整个迭代序列)

filterfalse(predicate, iterable) :返回predicate为False的元素组成的序列;

islice(iterable, stop)/islice(iterable, start, stop[,step]) :返回start开始(默认0),至stop步长为step(默认为1)的序列;

repeat(object[, times]):默认无限次,按指定次数重复返回迭代对象(每次返回一个迭代对象);

takewhile(predicate, iterable):返回predicate为Trure的元素,直到有False的为止。

lst=[1,4,8]

nCount=0

for it in itertools.cycle(lst):

print(it) # 输出1,4,8,1,4,8

nCount+=1

if(nCount>5): break

for it in itertools.repeat(lst, 2):

print(it) #输出[1,4,8]两次

lst = itertools.chain(lst, it)

print(list(lst)) #[1,4,8,1,4,8,1,4,8]

dp=itertools.dropwhile(lambda x:x

print(list(dp)) #[5, 8, 2]

tk=itertools.takewhile(lambda x:x

print(list(tk)) #[1,3]

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180415G0QTOS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券