python(22): apply、map及函数工具、list的再..
时间:2006-03-05 来源:newsim
首先来复习python中函数的定义。在python中,有两种方式可以用来定义一个函数。用def可以定义有名字的函数。用lambda可以定义匿名函数。由于在实际调用一个函数时,实参的个数可能是一个也可能是两个,还可能是多个。因此在形参前面加上*或**来处理这个情况。比如:
1
2
这种形式的。很自然的,可能会想到应该用一个for循环:
总之,定义函数时在形式参数面前加上*或**是为了,在调用这个函数的时候可以灵活地提供实参的个数。而apply则是为了可以用不定个数的实际参数来调用函数。有点晕。(我也想不到一个更好的表达方式,或更好的例子。书中说,在后面会看到应用apply强大能力的例子)
其实还可以更简单,连apply都不用,直接写成:
(其实我不知道为什么会在python中出现这种古怪的东西,看这本书的前面几章时,觉得python太棒了,真的是很简洁。不过越往后看,觉得python越来越背离了它“简单”的宗旨)
map函数在前面介绍过了,基本的形式是:
再来看reduce函数:
从上面介绍可以看出,map、filter或者reduce实际都是对序列类型数据的成员进行操作。由于这种操作在python是非常普遍的,因此在python 2.0后提供了一种叫"list的再构造"(英文名叫list comprehansions,不知道怎么翻合适)的语法形式来进行类似的操作。假设L = [1,2,3,4],那么:map((lambda x: x**2), L)就可以写成:[x**2 for x in L]。这就是所谓的"list的再构造"。认真来看看这个:
- def test(*x):
- if len(x)>0:
- for c in x:
- print c
- else:
- print None
- test(userInput)
1
2
这种形式的。很自然的,可能会想到应该用一个for循环:
- for c in userInput:
- test(c)
- apply(test, userInput)
总之,定义函数时在形式参数面前加上*或**是为了,在调用这个函数的时候可以灵活地提供实参的个数。而apply则是为了可以用不定个数的实际参数来调用函数。有点晕。(我也想不到一个更好的表达方式,或更好的例子。书中说,在后面会看到应用apply强大能力的例子)
其实还可以更简单,连apply都不用,直接写成:
- test(*userInput)
(其实我不知道为什么会在python中出现这种古怪的东西,看这本书的前面几章时,觉得python太棒了,真的是很简洁。不过越往后看,觉得python越来越背离了它“简单”的宗旨)
map函数在前面介绍过了,基本的形式是:
- map(function, seq1,seq2...)
- filter(func or None,seq)
- res = list()
- for x in seq:
- if func(x):
- res.append(x)
- res
再来看reduce函数:
- reduce(function, sequence[, initial])
- L = [1,2,3,4,5]
- reduce((lambda x,y: x*y),L) ===> 120
- import operator
- L = range(6)[1:]
- reduce(operator.mul, L)
从上面介绍可以看出,map、filter或者reduce实际都是对序列类型数据的成员进行操作。由于这种操作在python是非常普遍的,因此在python 2.0后提供了一种叫"list的再构造"(英文名叫list comprehansions,不知道怎么翻合适)的语法形式来进行类似的操作。假设L = [1,2,3,4],那么:map((lambda x: x**2), L)就可以写成:[x**2 for x in L]。这就是所谓的"list的再构造"。认真来看看这个:
- [x**2 for x in L] ===> [1,4,9,16]
- [(x**2,x**3) for x in L] ===> [(1, 1), (4, 8), (9, 27), (16, 64)]
- [x**2 for x in L if x%2==0] ===>[4,16]
- [x*y for x in L for y in L] ===> [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]
- res = []
- for x in L:
- for y in L:
- res.append(x*y)
- res
- [x*y for x in L if x%2==0 for y in L if y%2 != 0] ===>[2, 6, 4, 12]
相关阅读 更多 +