目录
递归函数、函数属性和注释、lambda表达式,如map和filter这样的函数式编程工具都是本文叙述的内容。
谈到设计函数,必须要提到函数的耦合性和聚合性。关于如何避免耦合性,需要记住以下几点:1)对于输入使用参数,并且输出使用return语句,2)只有在真正必要的情况下使用全局变量,3)不要改变可变类型的参数,除非调用者希望这样做,4)避免直接改变在另一个模块文件中的变量。所谓聚合,要求每一个函数应该有一个单一的、统一的目标。python代码以简单明了著称,一个过长或者有着深层嵌套的函数往往就成为设计缺陷的征兆。
通常要使函数和其他编程组件中的外部依赖性最小化,函数的自包含性越好,它越容易被理解、复用和修改。
1 递归函数VS循环
递归是一种有用的技术,因为它允许程序遍历拥有任意的,不可预知的形状的结构。
下面是用递归的方式求和,过于技巧,直接使用循环即可,循环不需要在调用堆栈时针对每次迭代都有一个本地作用域的副本,还可以避免与函数调用相关的速度成本。
>>> def mysum(L):
... if not L:
... return 0
... else:
... return L[0] + mysum(L[1:])
...
>>> mysum([1,2,3,4,5])
15
# 循环
>>> L = [1,2,3,4,5]
>>> sum = 0
>>> while L:
... sum += L[0]
... L = L[1:]
...
>>> sum
15
递归的优势:处理任意结构
>>> def sumtree(L):
... tot = 0
... for x in L:
... if not isinstance(x,list):
... tot += x
... else:
... tot += sumtree(x)
... return tot
...
>>> L = [1,[2,[3,4],5],6,[7,8]]
>>> print(sumtree(L))
36
2 函数对象:属性和注解
函数可以跨程序自由地传递和间接调用,也支持与调用根本无关的操作——属性存储和注解
1)间接函数调用总结
函数对象可以赋值给其他的名字,传递给其他函数,嵌入到数据结构,从一个函数返回给另一个函数等等
# 函数名直接是一个函数对象的引用
>>> def echo(message):
... p