09 匿名函数、函数作用域、闭包、递归

匿名函数(lambda)

语法规则:

lambda 参数:表达式

filter(lambdax: x>10, li)

匿名函数:可以赋给一个变量,重复使用。

fun1 = lambda x: x * 10
print(fun1(10))
打印结果: 100

fun = (lambda x: x * 10)(5)
print(fun)
打印结果: 50

函数作用域

01外部不能访问函数内部变量:

def fun1():
x = 1
print(x)

02函数内部能够访问函数外部变量:


x = 123
def fun2():
print(x)

03函数里面不能修改外部变量:


x = 123
def fun3():
x = x + 1
print(x)

04函数里面和函数外部变量名相同:


x = 123
print(x,id(x))
def fun1():
  x = 456
  return x,id(x)
a = fun1()
print(a)

函数内部:函数内部的变量,作用域只在函数内部,函数内部不可以直接更改函数外部的变量

global: 函数内部如果需要改变全局变量,就需要使用global修饰变量

实例:

x = 123
def fun1():
    global x
    x +=1
    return x
b = fun1()
print(b)

nonlocal: 在函数嵌套函数的情况下,同样也有函数作用域的问题,但是python3中提供了方便,只需要使用nonlocal就可以在里层函数内部修改外部函数变量。多层函数嵌套,nonlocal只修改上一层函数嵌套的值。

实例:

def fun2():
    x = 123
    def fun3():
        nonlocal x
        x +=1
        return x
    return fun3()
a = fun2()
print(a)

闭包

内嵌函数:

def fun1():
    print('fun1()在被调用')
​
    def fun2():
        print('fun2()在被调用')
​
    fun2()
​
​
fun1()
​

闭包:

def func1():
    print('外层函数')
​
    def func2():
        print('内层函数')
        return 1 + 1return func2()
​
​
result = func1()
print(result)
​
打印结果:
外层函数
内层函数
2

闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包

闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用

闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁

递归函数

递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件

递归实例:

def fun1():
    print('金钱 == 爱情')
    return fun1()
    
    
fun1()

阶乘:

def func(a):
    if a == 1:
        return a
    else:
        return func(a - 1) * a
        # result func(a - 1) + a    实现累加


result = func(5)
print(result)

打印结果:120

 

posted @ 2018-05-17 00:32  开心每一天q  阅读(133)  评论(0编辑  收藏  举报