15 函数专题(二)

本章主要讨论一下一些有用“器”,例如生成器、解析器等。

15. 1 过滤器filter函数

filter函数顾名思义,过滤函数,满足条件的留下,组成新的序列。

filter的语法格式

新生成序列 = filter(用于过滤的函数,序列)
s = "hello python"
ret = filter(lambda x : x > "l", s)
print ret

程序执行结果:

opyton

15.2 函数生成器

xrange函数就是一个典型的函数生成器,这里需要对比range函数,range可以产生一个列表,需要开辟相应的内存空间,对于数据量较大的情况下不乐观,而xrange返回的是一个像使用range函数具有同范围数据序列的对象,大量节省了内存。可以通过迭代、索引获取每个数据的值。

li = xrange(100)
print type(li), li[3]
li = range(100)
print type(li), li[3]
for x in range(100):
    print x
for x in xrange(100):
    print x

执行结果如下:

<type 'xrange'> 3
<type 'list'> 3

15.3 yield生成器

带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代。yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。下一次迭代时,从上一次迭代遇到的yield下面的代码(下一行)开始执行直至下一个yield,并返回其后的(表达式的)值。

def g():
    print "before the 0'th yield"
    yield [1,3,4]
    yield [3, 5, 9]
    print "between 1'th ~ 2'th yield"
    yield "hello"
t = g()
print "call g()", type(t)
i = 0
for x in t:
    print "iter", i,"\bth got:", x
    i += 1

程序执行结果:

call g() <type 'generator'>
before the 0'th yield
iter 0th got: [1, 3, 4]
iter 1th got: [3, 5, 9]
between 1'th ~ 2'th yield
iter 2th got: hello

15.4 enumerate生成器

enumerate可以基于序列产生一个索引和值组成二元的元组。

s = "python"
t = enumerate(s)
for x in t:
    print t

程序的执行结果如下:

(0, 'p')
(1, 'y')
(2, 't')
(3, 'h')
(4, 'o')
(5, 'n')

从结果可以看出t的每一项,就是索引和对应位置上的值组成的二元元组。

s = xrange(1, 10, 2)
t = enumerate(s)
for x in t:
    print x

结果:

(0, 1)
(1, 3)
(2, 5)
(3, 7)
(4, 9)

15.5 列表解析List comprehension

列表解析式是将一个列表(实际上适用于任何可迭代对象(iterable))转换成另一个列表的操作方法。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。列表解析通常会伴随for结构的出现。例如:要把一个列表的每个元素加十就可以用列表解析来完成。

s = xrange(1, 10, 2)
t = [x + 10 for x in s]
print t

执行结果:

[11, 13, 15, 17, 19]

语法格式:

[转换表达式 for 迭代变量 in 迭代列表名 if 条件表达式]
s = xrange(1, 10)
t = [x ** 2 for x in s if x % 2 == 0]
print t

执行结果:

[4, 16, 36, 64]

除了列表解析以往还有字典、set、元组解析,手段和道理都一样只是换成相应的括号即可。

do = dict(a = 12, b = 13, c = 14)
print do
dn = {v : k for k,v in do.items()}
print dn

字典解析的结果如下:

{'a': 12, 'c': 14, 'b': 13}
{12: 'a', 13: 'b', 14: 'c'}

15.6 生成器表达式

生成器表达式,即表达式的计算结果是生成器,语法格式上它和列表解析很相像,仅将方括号换成了圆括号,其数据需通过迭代取出。两者的语法非常相似,但生成器表达式返回的不是一个列表类型对象,而是一个生成器对象。

t = xrange(10)
print type(t)
s = (x + 10 for x in t)
print type(s)
for x in s:
    print x

本程序执行结果:

<type 'xrange'>
<type 'generator'>
10
11
.....
18
19