在上一章节我们知道了函数,并学会了定义函数,以及一些python的自带函数。这一节,我们学习函数的作用域与匿名函数。
函数的作用域:
在函数内部可以定义变量,但是当函数外部与函数内部的自定义变量相同(名字相同),他们之间会互相影响吗。带着这个问题,我们来看下面的函数。
#函数1
a = 'hello'
def test():
b = a + 'world'
return b
print(test())
输出:helloworld
#函数2
a = 'hello'
def test():
a = 'how are you'
return a
print(test())
输出:how are you
可以看出,函数内部可以调用函数外部的变量,但是函数内部却无法去修改函数外部的变量。这也就是函数的作用域在起作用。举一个很简单的例子。在一个学校里有两个名字都为小明的同学,分别在 a , b 班级,那么,在 a 班的小明,和在 b 班的小明是同一个人吗,答案是显而易见的。在 a 班的小明,去到 b 班,那么 b 班的同学是不认识他的,这就是他只能在一个指定的区域内,出了这个区域,那就不一定有人认识了。函数的作用域也是同样的道理,a 变量在函数内部有赋值,函数外部同样有一个变量 a 赋值,这两个变量是不同的,函数内部的变量,可以调用外部的变量,但是不能改变外部的变量。函数外部的变量是不能去使用调用函数内部变量的。这就是函数的作用域,他只在自己定义的区域起作用,函数内部或者函数外部。那么有没有方法可以使用函数内部的变量去修改函数外部的变量呢。毕竟,对变量来说,都是可以修改的。这里我们引入全局变量 global ,使用 global 就可以将函数内部的变量定义为全局变量,将函数内部的局部变量改变为全局变量,这样,函数外部的变量就可以被函数内部的变量修改了。
#函数1
a = 'hello'
def test():
a = a + 'how are you'
return a
print(test())
#报错,无输出内容
#函数2
a = 'hello'
def test():
global a
a = a + 'how are you'
return a
print(test())
输出:hello how are you
可以看出,只用将函数内部的变量定义为全局变量,才可以去修改变量的值。
局部变量
下面我们看一个函数
def outt():
x = 123
def inn():
x += 1
return x
return inn()
print(outt())
#输出:UnboundLocalError: local variable 'x' referenced before assignment 报错
def outt():
x = 123
def inn():
nonlocal x
x += 1
return x
return inn()
print(outt())
#输出:124
这个函数我们看出,当内层函数想要调用外层函数变量,并修改时,会报错,这时候在内层函数设置局部变量 nonlocal 就可以调用,并修改。上面的两个变量就叫全局变量与局部变量,全局变量作用与函数的外部变量与内部变量之间的修改,局部变量作用与内部函数与外部函数之间的变量修改。函数作用域针对函数的,函数内部变量只能作用于函数内部,想要对函数外部的变量修改,就必须使用 global 。函数内部是不能直接修改函数外部的变量的。
匿名函数
前面的章节我们学习过三目函数:
print(a) if x > 5 else print(b)#三目运算
匿名函数和三目运算的目的是相同的,都是要达到代码简单易读的目的。
lambda x :x*10 #这就是一个匿名函数,简单易读,代码量少。lambda 参数:表达式
匿名函数的使用:
filter(lambda x:x>5,[3,4,7,6])#可以过滤除大于5的数字
map(lambda x:x*10,[3,4,8,7,9])#对列表中的数字每个都乘于10
这样的方法还有很多,他最大的好处就是,可以简化代码,可以不需要 def 就建立一个函数,这样就可以减少代码量。
网友评论