python函数微讲解(二)

python函数微讲解(二)

名称空间

1.什么是名称空间?

就是存放变量名和变量值绑定的地方。

2.名称空间的分类

(1).内置名称空间

python解释器提前给我们定义好的,比如:len(),open()......等等。

(2).全局名称空间

在py文件中编写的代码运行之后产生的名字都会存入全局名称空间。

age = 21  # age存入全局名称空间

def index():  # index存入全局名称空间
    pass
if True:
    a = 11  # a存入全局名称空间
for i in range(100):  # i存入全局名称空间
    print(i)
while True:
    c = 11  # c存入全局名称空间

(3).局部名称空间

函数体代码运行产生的名字都会存入局部名称空间。

def index():
    age = 18  # age存入局部名称空间

3.存活周期

(1).内置名称空间

python解释器运行就会产生,解释器停止就会销毁。

(2).全局名称空间

py文件运行就会产生,停止运行就会销毁。

(3).局部名称空间

函数调用就会产生,不调用就不会产生,函数调用运行结束后就会销毁。

名字的查找顺序

1.如果是从局部名称空间开始查找名字的,那么查找的顺序就是:局部名称空间--->全局名称空间--->内置名称空间

2.如果是从全局名称空间开始查找名字的,那么查找的顺序就是:全局名称空间--->内置名称空间

切记:只能局部然后全局然后内置,顺序不能颠倒!!!

# 因为内置空间里有“len”这个名字,所以我们就用“len”来演示一下
# len = '我是全局名称空间的'
#
# def index():
#     len = '我是局部名称空间的'
#     print(len)

# print(len)  # 我是全局名称空间的
#
# index()  # 我是局部名称空间的

print(len)  # 如果把上面的全注释掉,返回的就是内置名称空间的

这里来讲一道小题目:

l = 1  # 第1步
def index():  # 第2部,定义函数并检查语法
    l = 2  # 第4.1步,执行函数体代码
    def index1():  # 第4.2步,定义函数并检查语法
        l = 3  # 第6.1步执行函数体代码
        def index3():  # 第6.2步定义函数并检查语法
            l = 4   # 第8.1步执行函数体代码
            print(l)  # 4
        index3()  # 第7步调用函数
    index1()  # 第5步调用函数
index()  # 第3步,调用函数

 

 3.如果局部名称空间之间不是嵌套关系,那么就互不干涉!!!

def index():
    name = 'jason'
def index1():
    age = 12
    print(name)  # 直接报错

index()
index1()

作用域

1.内置名称空间

在程序的任何阶段任何时间都可以使用。

2.全局名称空间

在程序的任何阶段任何时间都可以使用。

 3.局部名称空间

一般情况下只能在各自的局部名称空间下使用。

global与nonlocal关键字

1.global关键字:在局部名称空间修改全局名称空间的值,修改的是不可类型,可变类型不用关键字也可以修改。

l = 100
l1 = [1, 2, 3]
def index():
    # l = 111  # 产生一个新的值
    global l  # 修改值,并不是产生新的值
    l = 111
    l1.pop(0)  # 列表是可变类型,直接修改

index()
print(l)  # 111
print(l1)  # [2, 3]

2.nonlocal关键字:在局部名称空间嵌套的时候,想要在内存修改外层的值,修改的是不可类型,可变类型不用关键字也可以修改。

def index():
    l = 111
    l1 = [1, 2, 3]
    def index1():
        # l = 222  # 产生一个新的值
        nonlocal l  # 修改值,并不是产生新的值
        l = 222
        l1.pop(2)  # 列表是可变类型,直接修改

    index1()
    print(l)  # 222
    print(l1)  # [1, 2]
index()

函数名的多种用法

1.函数名可以当作变量名赋值

def index():
    print('你好')
l = index
l()  # 相当于index()

2.函数名还可以当作函数的实参

def index(a):
    a()

def f():
    print('你好')

index(f)  # 把函数名当作实参传递给形参

3.函数名还可以当作函数的返回值

def index():
    print('不好')
    return f

def f():
    print('你好')

l = index()  # 把函数的返回值赋值给l,函数的返回值是函数名f

l()  # 相当于f()

4.函数名还可以当作容器类型的元素

容器类型就是:列表、元组、字典等等。

def index():
    print('你好')

l = [1, 2, 3, index]

l[-1]()  # 你好

函数的嵌套

这个看似很简单,跟之前的循环嵌套一样,但是函数嵌套要难一点,所以一定要死咬概念,尤其是函数的定义与调用,一定要先定义,在调用,不然就会报错,函数体代码在函数不被调用的时候时候是不会执行的,在函数定义阶段只会检查语法,不会执行函数体代码。

def max1(x,z):
    if x > z:
        return x
    return z

def max(a,b,c,d):
    res = max1(a,b)
    res1 = max1(res,c)
    res2 = max1(res1,d)
    return res2

print(max(12, 45, 1, 10))  # 返回最大值 45

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

 

posted @ 2022-03-17 16:28  陆禄绯  阅读(78)  评论(0)    收藏  举报