Python-函数对象、函数嵌套、名称空间与作用域

一、函数对象
函数是第一类对象:指的是函数的内存地址可以像一个变量值去使用
1.变量值可以被引用

def foo():
	print('from foo')

f=foo
print(f)    #<function foo at 0x00000000022A8AE8>  →函数的内存地址
f()         #from foo

2.变量值可以当做参数传给另外一个函数

def foo():
    print('from foo')

def bar(x):
    print(x)

bar(foo)     #<function foo at 0x00000000001F1E18>
foo()        # from foo

3.变量值可以当做参数的返回值

def foo():
	print('from foo')

def func(x):
	return x

f=func(foo)
print(f)

4.变量值可以当做容器类型的元素

def foo():
	print('from foo')

list1=[foo]
print[list1]  
list[0]()     #from foo

二、函数的嵌套


from math import pi

def circle(radius,action):
    def cal_perimeter():
        return 2 * pi * radius

    def cal_area():
        return pi * (radius ** 2)

    if action == 1:
        res=cal_perimeter()
    elif action == 2:
        res=cal_area()
    return res

res=circle(10,1)
print(res)

三、名称空间

  1. 名称空间Namespaces:指的就是存放名字与值内存地址绑定关系的地方(内存空间)

  2. 名称空间分为三大类
    内置名称空间: 存放的是python解释器自带的名字
    产生:python解释器的启动则产生
    销毁:python解释器关闭则销毁

    全局名称空间: 在顶级定义的名字
    产生:执行python程序时产生
    销毁:python程序执行完毕后则销毁

    局部名称空间: 在函数内定义的名字
    产生: 在函数调用时临时产生
    销毁: 在函数调用完毕后则销毁

三种名称空间的产生的先后顺序: 内置->全局->局部
查找名字的顺序:从当前位置往外一层一层查找
如果当前在局部名称空间: 局部->全局->内置
如果当前在全局名称空间: 全局->内置

len=111
def foo():
	len=222
    print(len)
    
foo()   #222
x=0
def f1():
    x=1
    def f2():
        x=2
        def f3():
            x=3
            print(x)
        f3()
    f2()
f1()    #3

3.二 作用域:指的是作用范围
全局作用域:包含内置与全局名称空间的名字
特点:全局存活,全局有效
局部作用域:包含局部名称空间的名字
特点:临时存活,局部有效

!!!作用域关系是在函数定义阶段就已经固定死了,与调用位置无关
示范一:
def f1():
    print(xxx)
xxx=111

def f2():
    xxx=222
    f1()

f2()   #111

示范二:
xxx=111
def f1():
    print(xxx)
    yyy=222
	print(yyy)

f1()   #111  222

猜你喜欢

转载自blog.csdn.net/weixin_40432363/article/details/82857582