在这一篇,我们来聊一下函数嵌套和匿名函数。
5.4.3 函数嵌套
函数嵌套:函数内定义的函数
作用:装饰器(以后学习)
- 作用域:
- python中,一个函数是一个作用域。(JAVA中代码块是作用域,比如if内部)
-
作用域中查找数据的规则:优先在自己的作用域找,如果没有就在"父级作用域"找 -> 直到全局。全局没有就报错。
func1()
```python
v = 10
def func1():
v = 9 # 函数内的变量和函数外的同名变量是完全独立的个体。
print(v) # 打印 9
def func2():
v = 999 # 在自己的作用域创建一个变量,不会影响父作用域的同名变量。想影响可以用global,nonlocal
print(v) # 打印自身函数中的变量v
func2() # 打印 999
print(v) # 打印 9
``` -
子作用域只能读取父作用域的同名变量的值,默认不能重新赋值(注意这里是'赋值'不是'修改')父作用域的变量(因为子作用域的同名变量是独立的新个体)。
但是可以对可变类型的数据进行修改
python list1 = [1,2,3] def func1(): list1.append(999) # list1 = 1 # 如果这里声明局部变量list1,python解释器就会把这个作用域中的list1.append(999)当做是对局部变量list1操作,会报错 func1() print(list1)
- 用 global 关键字可以在子作用域中重新赋值全局变量。(不推荐使用,影响可读性)
python name = 'global name' def func1(): name = 'nonlocal name' def inner(): global name # 全局变量 list1 name = 'new name' inner() print(name) func1() print(name)
用 nonlocal 关键字,可以在子作用域中重新赋值父级作用域的变量。(不推荐使用,影响可读性)
name = 'global name' def func1(): name = 'nonlocal name' def inner(): nonlocal name # func1()里的 name name = 'new name' inner() print(name) func1() print(name)
变量命名:全局变量用纯大写,局部变量用小写(程序猿的常识)
5.5 匿名函数(lambda)
匿名函数:顾名思义,就是没有名字的函数(lambda)
适用范围:最复杂的也就是写个三元运算(因为只能写一行)
匿名函数定义:
# def func1(x,y):
# return x**y
c = lambda x,y:x**y # 匿名函数定义。效果等同于func1,这里犹豫要调用,所以把匿名函数赋值给c
print(c(2,4)) # 调用c的时候需要加()
- 匿名函数作用:
- 减少不必要的函数命名
- 匿名函数和其他函数搭配使用
res = map(lambda x:x*2, [1,2,3,4,5]) # 将列表的值依次交给左边的函数运算res = map(lambda x:x*2, [1,2,3,4,5]) print(res) # 返回的是object,可以用for循环来输出,或者用list()转换成列表 for i in res: print(i)
- 匿名函数的三元运算:
res = map(lambda x:x**2 if x>4 else x**3, [1,2,3,4,5,6])
for i in res: # 返回的是object,可以用for循环来输出,或者用list()转换成列表
print(i)
以上就是这篇的内容。