day11-函数对象、名称空间和作用域

函数对象

在Python中,一切皆对象,函数也是一类对象。即函数也具有以下特性

1.可以被引用,赋值:将函数赋值给a

# 定义一个self_max函数
def self_max(x, y):
    if x > y:
        return x
    return y
a = self_max

2.可以当做函数的返回值:将函数f2当做函数f1的返回值

def f2():
    print('from f2')
def f1():
    return f2
f = f1()
print(f)        # 打印结果<function f2 at 0x00000176C99FF1E0>
print(f2)       # 打印结果<function f2 at 0x00000176C99FF1E0>

3.可以当作函数参数传递

def f1():
    print('from f1')
def f2(m):
    return m
f = f2(f1)
f()         # 执行了f1(),打印出'from f1'

4.可以当作容器类型的元素

def f1():
    print('from f1')
s_list = ['str',1,f1]
s_list[2]()         # 执行了f1(),打印出'from f1'

函数的嵌套

函数的嵌套就是在函数体中再定义函数

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

举个例子:根据输入的指令求圆的周长和面积

from math import pi
def circle(r, action):
    if action == 'a':
        
        # 在函数里定义求圆面积的函数
        def area():         
            return pi * r **2
        res = area()
        return res

    elif action == 'p':
        # 在函数里定义求圆周长的函数
        def perimeter():
            return pi * r *2
        res = perimeter()
        return res

    else:
        return "error"
    
r = int(input('请输入半径》》》').strip())
action_choice = input("请输入选择的功能,a表示求面积,p表示求周长》》》").strip()
res = circle(r, action=action_choice)
print(res)

名称空间和作用域

就是用来存放名字的地方。分成内置名称空间、局部名称空间和全局名称空间

内置名称空间

我们所学的内置方法如len(),其实就是一个个函数。python在启动的时候就会定义这些函数,并把这些函数丢入到内存空间,这个内存空间就叫做内置名称空间。

生命周期:从python启动的时候就生效,直到python关闭

全局名称空间

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

生命周期:程序文件运行的时候生效,直到程序运行结束

局部名称空间

函数内部的都叫局部名称空间,也就是函数内部定义的名字都放入了局部名称空间中了

生命周期:函数运行的时候生效,直到函数运行结束

小结:

名称空间的执行顺序:内置名称空间 ---> 全局名称空间 ---> 局部名称空间

名称空间的查找顺序:局部名称空间 ---> 全局名称空间 ---> 内置名称空间。从当前名称空间开始查找,然后逐步往上

作用域

作用域就是作用的区域,分为全局作用域和局部作用域

全局作用域

全局有效,全局存活,包含内置名称空间和全局名称空间。即全局可以修改内置的,内置可以修改全局的

x = 1
def f1():
    def f2():
        print(x)
    return f2()
f1()                # 打印出 1

局部作用域

只能使用于局部范围,在局部定义的名字只能在局部获取

def f1():
    def f2(): 
        print(x)
    x = 2
    return f2()
f1()        # 打印出2

注意点:1. 作用域关系在函数的定义阶段就固定死了,与函数的调用无关

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

x= 1000
def f1():
    x = 1
    def f2():
        print(x)        # 打印 1,在定义阶段 x=1,与函数调用无关
    return f2
f2 = f1()
x = 10
def f3():
    x = 15
    f2()
f3()

globals和locals

global:在局部修改全局变量,声明是全局变量

x = 1
def f1():
    global x        # 声明x是全局变量
    x = 2
f1()
print(x)            # 运行函数后,修改了x的值,打印结果为2

nolocal:把局部改成外部

def f1():
    x= 1
    def f2():
        nonlocal x  # 声明x是外部,嵌套函数的内部的外部,不能修改全局的
        x = 3
    f2()
    print(x)
f1()

猜你喜欢

转载自www.cnblogs.com/863652104kai/p/10951839.html