Python基础(7)-高阶函数
1.嵌套函数
每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。
name = "老王"
def change():
name = "老王媳妇儿"
def change2():
# global name 如果声明了这句,下面的name改的是最外层的全局变层
name = "老王媳妇儿去买菜"
print("第3层打印:", name)
change2() # 调用内层函数
print("第2层打印:", name)
change()
print("最外层打印:", name)
>>>输出结果:
最外层打印:老王媳妇儿去买菜
第2层打印:老王媳妇儿
第3层打印:老王
2.匿名函数lambda
def calc(x,y): return x**y print(calc(2,5))
#换成匿名函数 calc = lambda x,y:x**y print(calc(2,5))
lambda与map搭配使用:
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
3.高阶函数
一个函数接收另一个函数作为参数,这种函数就称之为高阶函数。
只需满足以下任意一个条件,即是高阶函数
- 接受一个或多个函数作为输入
- return 返回另外一个函数
def get_abs(n): if n < 0 : n = int(str(n).strip("-")) return n
def add(x,y,f): return f(x) + f(y)
res = add(3,-6,get_abs) print(res)
4.递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
def calc(n):
n = int(n/2)
print(n)
if n > 0:
calc(n)
print(n)
calc(10)
>>>输出结果:
5
2
1
0
0
1
2
5
递归函数特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈参考文章:http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

5.闭包
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
def outer(): name = 'alex' def inner(): print("在inner里打印外层函数的变量",name) return inner # 注意这里只是返回inner的内存地址,并未执行
f = outer() # .inner at 0x1027621e0> f() # 相当于执行的是inner()
注意此时outer已经执行完毕,正常情况下outer里的内存都已经释放了,但此时由于闭包的存在,我们却还可以调用inner, 并且inner内部还调用了上一层outer里的name变量。这种粘粘糊糊的现象就是闭包。
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
6.列表生成式
>>> a = [i+1 for i in range(10)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
7.map()
b=list(map(lambda x:x+2,a)) # 用于逐一遍历
8.reduce()
from fuctools import reduce
reduce(lambda x,y:x*y,range(1,n+1)) # 用于递归计算
9.filter()
b = [i for i in range(10) if i>5 and i<8] # 用于筛选出列表中符合条件的元素,返回布尔值

浙公网安备 33010602011771号