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