python嵌套函数&作用域

  • 一切皆对象
  • 嵌套函数
  • 作用域



装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短。


在使用装饰器前先了解一下相关概念

函数中的参数是引用对象,把引用对象在函数里进行各种操作。

>>> def xy(n):  # n 引用lst  参数可以理解为变量或者占位符
	n.append(54)
	return n
>>> lst=[5,2,3,1]

>>> xy(lst)   # 列表追加54
[5, 2, 3, 1, 54]
>>> lst       # 引用,原列表也会变化
[5, 2, 3, 1, 54]
>>>

一切皆对象

函数也是对象。

>>> def ba():
	print("i am ok")

	
>>> def fo(f):
	f()

>>> ba   # 有内存地址 表示函数对象
<function ba at 0x00000000031B9EA0>
>>> ba()  # 加()表示执行对象
i am ok

>>> a = 3
>>> a()
Traceback (most recent call last):
  File "<pyshell#76>", line 1, in <module>
    a()
TypeError: 'int' object is not callable
>>> fo(ba)  #函数可以引用对象,则函数可以引用函数
i am ok
>>> fo(str)
>>> str()
''

如果只写名称就代表这个对象,加括号表示执行或调用。有的对象可被调用,有的不可被调用。

嵌套函数

在一个函数中定义了另外一个函数

>>> def hi():
		def fo():
			print("i am fo")
		print("i am hi")	
>>> hi()
i am hi
>>> fo()   #报错
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    fo()
NameError: name 'fo' is not defined
>>> 
'''
函数有可见范围,这就是作用域的概念
内部函数不能被外部直接使用,会抛NameError异常
'''

作用域

一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域

全局作用域(global):在整个程序运行环境中都可见

>>> a = 1 #定义变量,全局变量
>>> def a1():
	print(a+1)  #使用变量a
		
>>> a1()
2
>>> def a2():
	a = a+1    # a+1的结果附给a这个全局变量
	print(a)

	
>>> a2()   #失败了,无法使用全局变量QAQ
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    a2()
  File "<pyshell#25>", line 2, in a2
    a = a+1
UnboundLocalError: local variable 'a' referenced before assignment

>>> def a3():  
	global a   #使用global关键字声明一下 使用全局变量
	a=a+1
	print(a)
	
>>> a3()   #执行成功
2
>>> a     #全局变量a 发生改变
2

局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域

>>> def fo():
	a=1      # 变量a
	def ba():
		nonlocal a     # 声明此变量为上面的变量
		a = a+1  # 作用域不同会报错
		print(a)
	ba()

>>> fo()
2

global使用原则:

1. 外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的是为了封装,尽量与外界隔离。

2. 如果函数需要使用外部全局变量,请使用函数的形参传参解决。

总结:只作理解作用域使用,一般情况不用global