函数对象.函数嵌套,名称空间作用域

函数对象

函数使用方法

之前说函数类似于变量,那么有些变量的使用方法在函数上也是适用的

python中一切皆对象,我们可以对它获取内存地址或者打印类型或者其他的操作

1. 引用,赋值

def self_max(x,y):
    if x > y:
        return x
    return y

a = self_max     #此时a就是函数self_max
max_num = a(20,39)
print(max_num)
39

2. 当作函数的返回值

def f2():
    print('from f2')
def f1():
    return f2

print(f1())
f = f1()    #因为调用f1函数返回值为f2,所以f = f1() = f2
f()       #f2()
<function f2 at 0x0000025DC8949378>
from f2

3. 当作函数的参数

def f1():
    print ('from f1')
def f2(m):
    return m

f = f2(f1)      #以f1作为m进入函数f2,所以return  f1,所以f = f1
f()
from f1

4. 作为容器元素的元素

def f1():
    print('from f1')
    
l = ['str',1,f1]
l[2]()
from f1

函数的嵌套

函数的嵌套可以对比循环的嵌套来看,循环的嵌套是在一个循环之内还有循环,函数的嵌套就是一个函数内还有一个函数

def f1():
    def f2():
        代码块
    f2()
f1()

名称空间和作用域

名称空间:存放名字的空间

1. 内置名称空间

内置名称空间就是在python启动的时候,就会定义出一些函数比如len(),存放在一块内存空间里,这个内存空间就叫做内置名称空间

生命周期:python启动时产生,python关闭时结束

2. 全局名称空间

除了内置名称空间和局部名称空间,就是全局名称空间

生命周期:程序/文件运行的时候产生,运行完毕就结束

3. 局部名称空间

函数内部就叫做局部,所以局部名称空间就是函数内部定义的名称存放的空间

生命周期:函数运行的时候开始,这个函数结束就结束

执行顺序

内置名称空间--->全局名称空间--->局部名称空间

查找顺序

从当前名称空间开始查找,如果查找不到就逐步往上查找

作用域

全局作用域

适用于全局+内置,即全局可以修改内置,内置可以修改全局

局部作用域

只能适用于局部范围(函数内部),在局部定义的名字只能在局部获取

作用域关系在函数定义阶段就已经确定了

函数与函数之间可能会有相同名字的变量,但这两个变量之间毫无关系,他们的作用域不同

补充

#global:从局部修改全局
x = 100
def f1():
    global x
    x = 1
f1()
print(x)
1
#nonlocal:把局部改成外部
def f1():
    x = 1
    def f2():
        nonlocal x
        x = 3
    f2()
    print(x)
print(f'xxx:{x}')
f1()
xxx:1
3
posted @ 2019-05-30 19:08  acate  阅读(159)  评论(0编辑  收藏  举报