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]    # 用于筛选出列表中符合条件的元素,返回布尔值

  

  

 

 

posted @ 2018-09-24 01:16  麦小秋  阅读(203)  评论(0)    收藏  举报