函数对象,名称空间,作用域,闭包函数

"""
函数嵌套:
嵌套是一个物体里套着另一个物体,函数嵌套就是一个函数中还有另一个函数
嵌套调用
指的是,在函数的执行过程中调用了另一个函数
其好处是,可以简化外层大函数的代码,使得结构更清晰,
可以将一个大的复杂的功能拆分为多个简单的小功能

嵌套定义
指的是,在函数的函数体中定义了另一个函数
需要注意的是:内部定义的函数,只能在内部使用,外界无法直接访问
唯一的使用场景就是闭包函数,除此之外不要这么写

名称空间
名称空间就是存放名称的内存空间,namespace
名称空间的分类
内置名称空间:存的是解释器内置的名称空间,例如len,print等,在解释器启动的时候,就启动了。
特点:在解释器启动就一直有效。
生命周期:解释器启动就有效,解释器关闭无效。
全局名称空间:存的是文件里顶端的名称,顶端就是没有缩进的名称,例如定义x=10之类的,
要注意的是,如果if,while,with前面没有缩进的话,那么它们里的也是全局名称。
特点:在文件运行时一直有效
生命周期:文件程序运行时开始生效,结束时无效。
局部名称空间:存放的是函数内定义的名称。
特点:仅在调用函数时生效
生命周期:调用函数时生效,调用结束后失效。
名称空间的加载顺序:内置-->全局-->局部
名字的查找顺序:局部-->全局-->内置/全局-->内置

作用域
域是范围,区域,作用域就是作用的范围,区域。就是名字的有效范围.
作用域分为两种:
全局作用域:
在内置名称空间与全局名称空间内的名字,能被所有位置访问,根据访问位置就称之为全局作用域。
全局作用域包含内置名称空间与全局名称空间
局部作用域:
局部名称空间的名字只能在当前的函数中访问,所以它单独划到一个范围中,
这个范围称之为局部作用范围即局部作用域

global(全局) 与 nonlocal(不使用本地) 关键字
global是将局部作用域的名字定义更改到全局中
nonlocal是将当前层函数的名字定义到上一层函数体中去,不能定义到全局。

函数对象
没有新技术点
目的是为了让你知道 函数都可以怎么来使用

函数是第一类对象:
1.可以被调用
2.可以当成容器类的元素使用
3.可以当函数的参数
4.可以当函数的返回值
函数名除了可以调用之外与一个变量名,没有本质区别,变量能怎么用函数名就能怎么用

闭包函数:
闭包函数就是将一个函数关闭,包装起来。一个函数被另一个函数包裹
闭包函数也是一种函数。
特点:
1.该函数是定义在另一个函数的中的
2.该函数包含了对外层函数中名字的引用,无论在任何位置使用这个函数,其都包含了外部名字引用
满足以上两条 就称之为闭包函数

需要注意的是:名字所在的作用域 在函数定义阶段就已经固定了,与调用位置无关

现阶段 可以将闭包理解为 另一种为函数体传值的方式
之前只能通过参数给函数传值
现在可以通过闭包的方式

"""

#函数嵌套的代码使用:
def f1():
def f2():
pass
f1()
f2()#会报错,不能直接访问到嵌套的函数,需要通过返回值来访问

#名称空间
print(len)#内置名称空间
x=10#全局名称空间
def f1():
x=10#局部名称空间


#作用域 global(全局) 与 nonlocal(不使用本地) 关键字
a=100
def func():
global a
a=10
func()
print(a) # a=10

a=100
def func():
a=500
def func1():
nonlocal a
a=250
func1()
print(a) #a=250
func()
print(a) #a=100



#闭包函数
def func():
def func1():
print(1+1)
return func1
res=func()
print(res) #<function func.<locals>.func1 at 0x000001C68CA928C8>
res() #2
posted @ 2019-01-14 18:02  XSHUshu  阅读(129)  评论(0编辑  收藏  举报