函数补(递归,闭包,嵌套)

变量作用域

- 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)......

猜你喜欢

转载自blog.csdn.net/xiaogeldx/article/details/84032415