局部变量与全局变量
局部变量:
定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
局部变量只能在函数内部使用
局部变量在函数调用时才能被创建,在函数调用结束后会自动销毁
全局变量:
定义在函数外部,模块内部的变量成为全局变量
所有函数都可以直接访问全局变量,但函数内部不能直接通过赋值语句来改变全局变量
(函数名其实就是一个全局变量)
局部变量说明:
1.在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改局部变量的绑定关系
2.在函数内部的赋值语句不会对全局变量造成影响
3.局部变量只能在被声明的函数内部访问,而全局变量可以在整个模块内访问
globals()函数和locals()函数
globals() 返回当前全局作用域内变量的字典
locals() 返回局部作用域内变量的字典
函数变量
函数名是变量,它在创建时绑定一个函数
示例:
>>> def f1():
... print("hello f1")
>>> def f2():
... print("hello f2")
>>> fx=f1
>>> fx()
hello f1
>>> f1()
hello f1
>>> f1=f2
>>> f1()
hello f2
一个函数可以作为另一个函数实参传递
>>> def f1():
... print("f1被调用")
>>> def f2():
... print("f2被调用")
>>> def fx(fn):
... print("fn绑定的是",fn)
... fn()
>>> fx(f1)
fn绑定的是 f1
f1被调用
函数作为另一个函数的返回值
def get_op():
s=input("请输入操作:")
if s == '求最大':
return max
elif s == '求最小':
return min
elif s== '求和':
return sum
L=[1,2,3,4]
fx=get_op()
print(fx(L))
函数的嵌套定义
函数嵌套定义是指一个函数里用def语句来创建其他函数的情况
示例:
def fun_outer():
print("fun_outer被调用...")
def fun_inner():
print("fun_inner被调用...")
fun_inner()
fun_inner()
print("fun_outer调用结束")
return fun_inner #返回一个函数名,注意没有加括号
f=fun_outer() #调用函数,变量f绑定返回的函数名fun_inner
f() #调用fun_outer里创建的fun_inner()
#fun_inner –----> #调用失败,局部变量不能直接调用
函数的作用域
作用域也叫名字空间,是访问变量时查找变量名的范围空间
python的四个作用域 LEGB
作用域 英文解释 英文简写
局部作用域(函数内) local(function) L
外部嵌套函数作用域 Enclosing function locals E
函数定义所在模块的作用域 Globals(module) G
python内置模块作用域 Builtin(python) B
变量名的查找规则:
1.在访问变量时先查找本地变量,然后是包裹此函数外部的函数内部的变量,
之后是全局变量,最后是内置变量 L--→ E--→ G --→ B
2.在默认情况下,变量名赋值会创建或者改变本地作用域内的变量
global语句:
作用:
1.告诉解释器,global语句声明的一个或多个变量,这些变量的作用域
为模块级的作用域(也称全局变量)
2.全局声明(global)
将赋值的变量映射到模块文件内部的作用域
语法:
global 变量1, 变量2,…
示例:
# global v, a, b, c
v=100
def fn():
global v
v=200
fn()
print('v=',v) # v=200
global说明
1.全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
2.全局变量在函数内不经过声明就可以直接访问
3.不能先创建局部变量,再用global声明为全局变量,此做法不符规则
4.global变量列表里的变量名不能出现在此作用域形参列表里
nonlocal语句
作用:
告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数
内的变量
语法:
nonlocal 变量1,变量2,…
说明:
1.nonlocal语句只能在被嵌套的函数内部进行使用
2.访问nonlocal变量将对外部嵌套函数作用域的变量进行操作
3.当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
4.nonlocal语句的变量列表里的变量名,不能出现在此函数形参列表中
lambda表达式(又称匿名函数)
作用:
创建一个匿名函数对象,同def类似,但不提供函数名
语法格式:
lambda [形参1,形参2,…] : 表达式
注:[]中的内容可以没有
示例:
myadd = lambda a,b : a+b
print(“10+20=”,myadd(10,20))
说明:
1.当lambda只是一个表达式,它用来创建一个函数对象
2.当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用
3.lambda表达式创建的函数只能包含一条表达式,lambda比函数简单且可以随时创建和销毁,
有利于减少程序的耦合度