变量作用域
- Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的
- Python作用于一共有四种
- L(local)局部作用域,在函数,类等内部可见
- E(enclosing)闭包函数外的函数中
- G(global)全局作用域,在整个程序运行环境中都可见
- B(built-in)内建作用域
- 以L—E—G—B的规则查找
嵌套函数
- 在一个函数中定义了另外一个函数
x = int(2.9) #内建作用域
g_count = 0 #全局作用域
def outer():
o_count = 1 #闭包函数外的函数中
def inner():
i_count = 2 #局部作用域
- Python中只有模块(module),类(class)以及函数(def、lambda)才会引进新的作用域
a = 1000 #全局变量
def func():
a = 500 #局部变量
a += 100
print(a)
func()
print(a) #600
1000
- 外部不能访问内部变量,函数内部能访问外部变量,变量不声明函数里面改不了外部变量
global
- 在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,此时用global语句就能修改全局变量
案例1:
a = 1000
def func():
a = 200
print(a)
func()
print(a) #200
1000
案例2:
a = 1000
def func():
global a #声明变量
a = 200 #此后a已修改为200
print(a)
func()
print(a) #200
200
nonlocal
- nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
案例1:
a = 1000
def func1():
a = 100
def func2():
a = 300
print(a)
func2()
print(a)
func1() #300
100
案例2:
a = 1000
def func1():
a = 100
def func2():
nonlocal a
a = 300
print(a)
func2()
print(a)
func1() #300
300
闭包
- 函数里面嵌套一个函数,这个函数用到外面函数中的变量,这些统称闭包
- 函数里面再定义一个函数,并且外层函数返回了内层函数体
- 里层函数用到了外层函数的变量
- 闭包是概念,不是某种函数类型,和递归的概念类似,就是一种特殊的函数调用
- 闭包可以得到外层函数的局部变量 ,是函数内部和函数外部沟通的桥梁
def func1(a):
def func2(b):
print("这是func2函数")
return a + b
return func2
a = func1(20)
print(a(30))
递归函数
- 递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件
- 使用递归时,常常可以让代码更加简洁,但会占用比较多的内存,当递归次数比较多时,性能就会降低,因此不建议多使用递归
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1) #n*(n-1)*n(n-2)......
res = factorial(1)
print(res) #n! n*(n-1)*(n-2)......