函数
进行结构化的一种编程方法,是重要的代码组织和复用手段,能节省空间和保持一致性。
参数
- 位置参数(位置参数必须以在被调用函数中定义的准确顺序来传递)
- 关键字参数(关键字参数必须位于位置参数之后)
参数组(可变长度的参数)
func(*tuple_grp_nonkw_args, **dict_grp_kw_args)
- *tuple_grp_nonkw_args是以元组形式体现的非关键字参数组
- **dict_grp_kw_args是装有关键字参数的字典
返回多个值
其实只是返回了一个对象,也就是一个元组,最后该元组会被拆包到各个结果变量中
返回对象的数目 | Python实际返回的对象 |
---|---|
0 | None |
1 | object |
1 | tuple |
函数亦为对象(传入函数)
将函数作为参数传递,并在函数体内调用这些函数
#! /usr/bin/env python
def convert(func, seq):
return [func(eachNum) for eachNum in seq]
myseq = (123, 45.67)
print convert(int, myseq)
print convert(long, myseq)
pirnt convert(float, myseq)
[123, 45]
[123L, 45L]
[123.0, 45.67]
>>> sorted(sent)
[...]
>>> sorted(sent, cmp)
[...]
>>> sorted(sent, lambda x, y : cmp(len(x), len(y)))
[...]
将需要执行的所有运算做成一个列表
def remove_punctuation(value):
return re.sub('[!#?]', '', value)
clean_ops = [str.strip, remove_punctuation, str.title]
def clean_strings(strings, ops)
result = []
for value in strings:
for function in ops:
value = function(value)
result.append(value)
return result
clean_strings(strings, clean_ops)
这种多函数模式能在很高的层次上轻松修改字符串的转换方式。增强可复用性
函数式编程
匿名函数(lambda)
lambda [arg1[, arg2, ... argN]]: expression
内建函数
filter(func, seq)
: 调用一个布尔函数func来迭代遍历每个Seq中的元素,返回一个使func返回值为true的元素的序列
map(func, seq)
:将函数调用映射到每个序列的元素上,并返回一个含有所有返回值的列表。
reduce(func, seq)
:使用了一个二元函数(一个接受带两个值作为输入,进行了一些计算然后返回一个值作为输出)
reduce(func, [1,2,3])
= func(func(1,2),3)
闭包:返回函数的函数
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量
闭包也是函数,但是他们能携带一些额外的作用域
注意: 虽然可以修改任何内部状态对象(比如向字典中添加键值对),但不能绑定外层函数作用域中的变量。
解决方法: 修改字典或者列表,而不是绑定变量。
def counter():
count = [0]
def incr():
count[0] += 1
return count[0]
return incr
>>>count = counter()
>>>print count()
1
>>>print count()
2