(15)python函数进阶
一、递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
例:
def recursion(n):
print(n)
if int(n/2)>0:
return recursion(int(n/2))
print('----->',n)
recursion(10)
返回结果:
10 5 2 1 -----> 1
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
二、匿名函数
#这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10))
匿名函数和其他函数搭配使用的例子:
res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i)
输出
1 25 49 16 64
三、嵌套函数与闭包
1. 嵌套函数
嵌套函数是指在函数内部定义一个函数,这些函数都遵循各自的作用域和生命周期规则。
例1:
def outer(): level = 1 print('outer', level) def inner(): print('inner', level) inner() outer()
输出:
outer 1
inner 1
例2:
def outer(): level = 1 print('outer', level) def inner(): level = 2 print('inner', level) inner() outer()
输出:
outer 1
inner 2
嵌套函数查找变量的顺序是:先查找自己函数体内部是否包含该变量,如果包含则直接应用,如果不包含则查找外层函数体内是否包含该函数,依次向外。
2. 闭包
首先要说明一个问题:函数名其实也是一个变量,我们通过def定义一个函数时,实际上就是在定义一个变量,函数名就是变量名称,函数体就是该变量的值。我们知道,变量是可以赋值给其他变量的,因此函数也是可以被当做返回值返回的,并且可以赋值给其他变量。
闭包定义:如果在一个内部函数中,引用了外部非全局作用域中的变量,那么这个内部函数就被认为是闭包(closure)。
例:
def outer(x): def inner(y): print(x+y) return inner f1 = outer(10) f2 = outer(20) f1(100) f2(100)
输出:
110 120
四、高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
我们来自定义一个高阶函数,这个函数用于求两个数的和,同时接收一个函数用于在求和之前对两个数值参数做一些额外的处理(如:取绝对值、求平方或其他任意操作)
例1:
def nb_add(x, y, f): return f(x) + f(y) result = nb_add(10, -20, abs) print(result)
例2:
def pow2(x): return pow(x, 2) result = nb_add(10, -20, pow2) print(result)
abs/pow2皆为python内置函数
五、内置函数
Python解释器有许多内置的函数和类型,有一些之前已经用到过,比如:
- 数学函数:abs()、max()、min()、pow()、sum()
- 类型转换函数:int()、float()、str()、bool()、list()、tuple()、dict()、set()
- 进制转换函数:bin()、oct()、hex()
- 高阶函数:map()、filter()、sorted()
- 打开文件用的函数:的open()
- 输入与输出函数:input()、raw_input()、print()
- 获取对象内存地址的函数:id()
这些函数我们在之前的文章中基本都演示了,不在此赘述。关于他们的详细说明以及其它内置函数的使用可以参考下面给出的列表及官方文档连接地址。
Python 3相对于Python 2的内置函数有些变动:
- 新增了一些内置方法,如:ascii()、bytes()、exec()
- 删除了一些内置方法, 如:cmp()、execfile()
- 移动了一些内置方法,如:reduce()被移动到了functools模块下
- 修改了一些内置方法,如:sorted()函数在Python 3.5的文档中么有再提到cmp参数了(貌似用不到这个参数)
Python 3中的高阶函数还有一个比较大的改变,如map()和filter()在Python 2中是直接返回一个列表(list),而在Python 3中是返回一个迭代器(Iterator)。