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
感谢Klang(金浪)智能数据看板klang.org.cn鼎力支持!