Python知识点-lambda、闭包、函数式编程、作用域

摘要

闭包中内函数修改外函数局部变量:

在基本的python语法当中,一个函数可以随意读取全局数据,但是要修改全局数据的时候有两种方法:

1 global 声明全局变量

2 全局变量是可变类型数据的时候可以修改

在闭包内函数也是类似的情况。在内函数中想修改闭包变量(外函数绑定给内函数的局部变量)的时候:

1 在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。

2 在python2中,没有nonlocal这个关键字,我们可以把闭包变量改成可变类型数据进行修改,比如列表。

作用域

python引用变量的顺序:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量

1、没有块级作用域:代码块里的变量,外部可以调用

2、局部作用域:例如函数内部作用域

3、作用域链:变量会由内到外,先去自己作用域去找,没有的话再去上级,直到找不到报错

4、记住在函数未执行之前,作用域已经形成了,作用域链也生成了

5、声明全局变量global,如果在局部要对全局变量修改,需要在局部声明该全局变量:

6、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。

name = "lzl"
 
def f1():
    print(name)
 
def f2():
    name = "eric"
    f1()
 
f2()
#输出:lzl

lambda

lambda作为一个表达式,定义了一个匿名函数。一般用来创建短小的匿名函数

lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

lambda 形式可以从外部作用域引用变量

lambda简化了函数定义的书写形式,使代码更为简洁。对于不熟悉的人降低了代码的可读性

匿名函数:没有名称的函数,由编译器指定名称并分配空间,通常直接作为参数传递

例子

>>> g = lambda x:x+1

>>> g(1)

2

#上例的代码x为入口参数,x+1为函数体

面试题:

#新浪lambada 面试题
 
li = [lambda :x for x in range(10)]
 
res = li[0]()
print(res)
 
#输出:9

对比上例

>>> x = [(lambda x=x: x) for x in range(3)]
>>> x[0]()
0

闭包

“An object is data with functions. A closure is a function with data.” — John D. Cook

⭐️深入理解python中闭包,闭包的实质

https://www.cnblogs.com/Lin-Yi/p/7305364.html

到底什么是闭包

https://zhuanlan.zhihu.com/p/21346046

>>> def counter():
    count = 0
    def inner():
        nonlocal count
        count += 1 
        return count
    return inner

>>> demo = counter()
>>> demo()
1
>>> demo()
2

函数式编程

函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”。 至于函数式

python函数式编程

https://www.cnblogs.com/fnng/p/3699893.html

匿名函数:lambda x: x + 1

>>> list(map(lambda x: x + 1, [1, 2, 3]))
[2, 3, 4]

装饰器

深入理解python中的闭包和装饰器

装饰器的存在主要是为了不修改原函数的代码,也不修改其他调用这个函数的代码,就能实现功能的拓展。