第六章 抽象
6.1 懒惰—化繁为简,函数调用
6.3 创建函数
>>>def hello(name): #遵循块结构
return ‘Hello,’ + name + ‘!’ #可以利用元组返回一个以上的值
print hello(‘world’) #调用
注:不返回值的函数也可以认为是一种“过程”,可能返回none,return是作为结束函数体使用的
记录函数:在开头加注释,或者引入文档字符串描述函数功能,使用
function.__doc__或者help(function)调用查询,见例子
6.4 参数
参数存储在局部作用域
不可变的字符串/元组在被函数修改时,只能用新值覆盖
关键字参数:使用参数名提供的参数
关键字参数可以设置默认值,调用时不更改则返回默认值
>>>def function(x=x1,y=y1)
Return x,y
收集参数:加 * 号,收集其余的位置参数并返回元组(没有参数返回空元祖)
同样的,** 号收集参数并返回字典,没有则返回{}
反转过程:在调用函数时,用 * 代替元组,用 ** 代替字典(类似指针)
>>> params=("沈建谅很帅",6,6,6)
>>> print_params(*params)
沈建谅很帅
(6, 6, 6)
注:一般只在定义函数(允许使用不定数目的参数)或者调用(“分割”字典或者序列)时才使用。
6.5 作用域
变量-值:main中的不可见字典 E 命名空间/作用域
分为全局和局部(函数/循环等作用域)
局部和全局变量同名时 globals() 返回全局变量的值 globals()[‘变量名’]
locals() 返回局部变量的字典
vars() 返回全局变量的字典且不可修改
在函数内部定义全局变量:global x
6.6 递归—函数调用自身
阶乘计算: 幂计算:
函数式编程:map、filter 、reduce (3.0中被移到 functools 模块)
lambda:匿名函数。
map:将序列中的元素全部传递给一个函数。map(str,range(10))
filter:基于一个返回布尔值的函数对元素进行过滤。
reduce:对一个序列的每个项迭代调用函数。它会将序列的两个元素与给定的函数联合使用,并且将它们的返回 值和第3个元素继续联合使用,直到整个序列处理完毕。