python开发学习day13 (函数嵌套;名称空间与作用域;闭包函数)

2020-06-17                           目录:

一、函数嵌套

1.1  定义

1.2  函数嵌套的调用

二、名称空间与作用域

2.1  名称空间

2.1.1  内置名称空间

2.1.2  全局名称空间

2.1.3  局部名称空间

2.2  名称空间的查找顺序

2.3  作用域

2.4  函数的参数传递

三、闭包函数

3.1  介绍

3.2  函数体代码传参的方式

一、函数嵌套

1.1  定义

在一个函数内又定义了另一个函数
如:
def f1():
    def f2():
        print('from f2')

    f2()
 f1()

1.2  函数嵌套的调用

在调用一个函数的过称中又调用了另一个函数
如取四个值的中的最大值:
def max2(x, y):
    if x > y:
        return x
    else:
        return y


def max4(a, b, c, d):
    res1 = max2(a, b)
    res2 = max2(res1, c)
    res3 = max2(res2, d)
    return res3


print(max4(1, 2, 3, 4))      

二、名称空间与作用域

2.1  名称空间

名称空间:即内存中存放名字的地方

2.1.1  内置名称空间

存放的是python解释器自带的名字,如:print、int、input等
生命周期:自解释器打开就创建直到关闭,期间一直存在,解释器关闭就清除

2.1.2  全局名称空间

除内置和函数内的名字之外,所有的存放于全局名称空间
生命周期:运行顶级代码(主流水线)则创建,顶级代码(主流水线)结束则清除

2.1.3  局部名称空间

存放函数内定义的名字
生命周期:函数调用时创建,函数调用完毕就立即清除

2.2  名称空间的查找顺序

基于现在的位置向上找。
具体的:局部—>外层套的局部—>外层套的局部—>...—>全局—>内置

示范① :站在全局进行查找

input = 333
def f1():
    input = 4444

f1()
print(input)  # >>>333

示范② :站在局部进行查找

def f1():
    input = 444
    print(input)

input = 333

f1()  # >>>444

示范③:

def f1():
    print(input)

def f2():
    input = 555
    print(input)

input = 333

f1()  # >>>333   (f1函数调用前的全局名称都要查找)
f2()  # >>>555   (优先查找当前局部位置)

示范④:

def f1():
    input = 444  # 查找优先级第二
    def inner():
        input = 555  # 查找优先级第一
        print(input)
    inner()
input = 333  # 查找优先级第三
f1()         # >>>555

ps:名称空间的嵌套关系是函数定义阶段(检测语法的时候)就已经确定好的,与调用无关

示范⑤ :

x = 111

def f1():
    print(x)  

def f2():
    x = 222
    f1()

f2()  # >>>111

2.3  作用域

① 全局作用域:内置名称空间、全局名称空间
      特点:全局存活、全局有效
② 局部作用域:局部名称空间
特点:临时存活,局部有效

2.4  函数的参数传递

① 对全局定义的不可变类型,不可以在函数内直接修改
x = 10

def func(a):  # a=10的内存地址
    a = 123   # 123的存地址绑定给a

func(x)   # x=10的内存地址
print(x)  # >>>10

② 对全局定义的可变类型,可以在函数内直接修改
x = []

def func(a):  # a=列表的内存地址
    a.append(1111)

func(x)   # x=列表的内存地址
print(x)  #>>>[1111]

③ 在函数中修改全局的不可变类型
x = 10

def func():
    global x
    x = 666
    
func()
print(x)  #>>> 666

④ nonlocal(了解)
x = 10

def f1():
    x = 11

    def f2():
        nonlocal x
        x = 666

    f2()
    print(x)


f1()      # >>>666
print(x)  # >>>10

三、闭包函数

3.1  介绍

闭包函数=》函数对象+函数嵌套定义+名称空间与作用域
闭:是指定义函数内的函数
包:是指内函数引用了外函数的变量
作用:可以将内部的函数打破层级的限制,返回到全局来使用

def outter():
    x = 1111

    def inner():
        print(x)

    return inner   # 不要加括号


f = outter()  # f=inner
print(f)      # >>> <function outter.<locals>.inner at 0x0000019A2114A4C0>

def f3():
    x = 222222
    f()

f3()          # >>>1111

3.2  函数体代码传参的方式

方式一:直接通过参数的方式传入

def func(x):
    print(x)

func(1)
func(2)

方式二:用闭包函数

def outter(x):

    def func():
        print(x)

    return func  # 一定不要加括号

f1 = outter(111)
f2 = outter(222)
f3 = outter(333)

f1()  # >>>111
f2()  # >>>222
f3()  # >>>333
原文地址:https://www.cnblogs.com/cui-cheng/p/13154800.html