摘要
闭包中内函数修改外函数局部变量:
在基本的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]
装饰器
装饰器的存在主要是为了不修改原函数的代码,也不修改其他调用这个函数的代码,就能实现功能的拓展。