1.1 函数的全局变量
- 在python中不要求变量定义和函数定义之前,但是要求变量定义在函数执行之前
def add(a,b):
local_sum = a+b
print("函数访问全局变量global_sum", global_sum)
return local_sum
a = 1
b = 2
global_sum = a + b + a + b
print("输出函数返回:", add(a+b))
- 函数内修改不会改变全局变量, 除非显示声明
虽然在函数内可以访问全局变量,但试图改变这个变量时Python会创建一个同名局部变量代替,改变全局变量将只在函数内有效,对函数外无影响。除非用关键词 global 在函数内声明. - 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
def TryTest(a,b):
a = 11 # 对a的改动仅函数内有效
b = [3,2,1] # 对b的改动函数外有效
global_num = 100 # 该做法不会报错, 但改变不会作用到函数外
print("函数内输出global_num = 100")
return
a = 1
b = [1,2,3]
global_num = 50
print("函数执行前输出global_num = 50")
TryTest()
print("函数执行后输出global_num 还会是= 50")
def TryTest():
global global_num # 显示声明后,在函数内改变的全局变量,将会影响到函数外
global_num = 100
print("函数内输出global_num = 100")
return
global_num = 50
print("函数执行前输出global_num = 50")
TryTest()
print("函数执行后输出global_num = 100")
1.2 内嵌函数
Python允许在函数fun1()内再定义一个函数fun2(), 同样内嵌函数的有效范围只在函数内, 即无法再函数外用关键词fun2()
直接访问fun2().
def fun1():
print("fun1正在被调用...");
def fun2():
print("fun2()正在被调用...");
fun2(); # 调用内部函数
1.3 闭包(closure)
如果一个内嵌函数里,只对外部作用域(不包括对全局作用域)的变量进行引用,这个内嵌函数就被认为是闭包。
在闭包中,外部函数的局部变量对于内嵌函数的局部变量,相当于全局函数与局部变量的对应关系。在内部函数中,只能对外部函数的局部变量进行访问,但不能进行修改。否则外部函数的呃变量就会被屏蔽起来。
def funX(x):
def funY(y):
# x = x + 5 # 是非法的,当试图改变x,则x被认为是局部变量,等号右边的x就是未初始化的非法值
return x*y
return funY
num =funX(5)
print( num(8) ) # 输出结果为40, 也可以写作 funX(5)(8)
1.4 lambda表达式
Python允许使用lambda关键字来创建匿名函数。
>>> lambda x : 2*x+5 # 会返回一个函数对象
<function <lambda> at 0x000000>
>>> G = lambda x : 2*x +1
>>> G(5) # 返回 11