12、函数嵌套与对象等

一、args与kwargs

def index(a,b,c):
    print(a,b,c)

def wrapper(*args,**kwargs):  # args=(1,2,3)    kwargs={}
    index(*args,**kwargs)  # index(*(1,2,3) ,**{})  # index(1,2,3)

    # index(b=2,c=3,a=1)
# wrapper(1,2,3)
wrapper(b=2,c=3,a=1)

二、函数嵌套

函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数

# 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)
#     print(res3)
#
# max4(1,2,3,4)

函数的嵌套定义: 在函数内又定义了一个函数
# def f1():  # 定义在函数内部的内容有一个效果:函数外无法访问,只有在函数内才可以访问到
#     x = 111
#     print(x)
#
# f1()
# # print(x)

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


# from math import pi
#
# def circle(radius,mode=0):
#     def perimiter(radius):
#         return 2 * pi * radius
#
#
#     def area(radius):
#         return pi * (radius ** 2)
#
#     if mode == 0:
#         return perimiter(radius)
#     elif mode == 1:
#         return area(radius)
#
#
# circle(3,0)

三、函数对象

def foo():  # foo->函数的内存地址
    print('from foo')


# x = 10  # x->10的内存地址

# 1、可以被赋值
# y = x
# f = foo

# 2、可以当做参数传入
# def f1(func):
#     print('====>f1')
#     func()
#
# f1(foo)  # f1(函数的内存地址)

# 3、可以当做返回值
# def f1(func):
#     return func
#
# f = f1(foo)
# print(f)

# 4、可以当做容器类型的元素
# x = 10
# l = [x,foo,foo()]
# # print(l)
#
# l[1]()


def login():
    print('登录功能'.center(50, '*'))


def register():
    print("注册功能".center(50, '*'))


def transfer():
    print("转账功能".center(50, '*'))


def withdraw():
    print("提现功能".center(50, '*'))


func_dic = {
    "1": ['登录功能', login],
    "2": ['注册功能', register],
    "3": ['转账功能', transfer],
    "4": ['提现功能', withdraw],
}



while True:
    print("0 退出")
    for k in func_dic:
        print(k,func_dic[k][0])

    choice = input("请输入命令编号:").strip()
    if choice == "0":
        break

    # if choice == '1':
    #     login()
    # elif choice == '2':
    #     register()
    # elif choice == '3':
    #     transfer()
    # else:
    #     print("输入的指令错误")

    if choice in func_dic:
        func_dic[choice][1]()
    else:
        print("输入的指令错误")

四、名称空间与作用域

# 名称空间Namespace:存放名字与内存地址绑定关系的地方

# 内置名称空间:存放python解释器自带的名字
# print(len)
# print(input)

# 全局名称空间: 存放的是*的名字,如下x、z、f1、xxx都是
# x = 100
# def f1():
#     y = 200
#
# if 10 > 3:
#     z = 300
#
#     if True:
#         xxx = 400


# 局部名称空间:存放的是函数内定义的名字
# def f1():
#     x = 200
#
# f1()



# 重要结论1:局部Local-》外层函数Enclosing-》全局Global-》内置Builtin
#          L->E->G->B


# 例1:
# def f1():
#     # len = 200
#     print(len)
#
# len = 100
#
# f1()
#
# print('=====>',len)
#
# 例2:LEGB

# len = 100
#
# def f1():
#     # len = 200
#
#     def f2():
#         # len = 300
#         print(len)
#     len = 1111111111111111111111111111111111111111111
#     f2()
#
# f1()


# 重要结论2:名称空间的嵌套关系是在函数定义阶段、扫描语法时就确定好的,与调用位置无关
# # 例1:
# len = 100
#
# def f1():
#     # len = 200
#     def f2():
#         print(len)
#
#     return f2
#
# f = f1()
#
# # print(f)
#
# len = 6666666666666
# f()

# 例2:
# len = 100
#
# def f1():
#     def f2():
#         print(len)
#     # len = 200
#
#     return f2
#
# f = f1()
#
# def foo():
#     len = 77777
#     f()
#
# foo()

# 例3
# x = 100
#
# def f1():
#     print(x)
#     x = 200
#
#
# f1()

# 总结:
# 全局作用域:全局存活,全局有效
#           内置名字空间、全局名称空间

# 局部作用域:临时存活,局部有效
#           局部名称空间


# =============》 global关键字
# l = []
# x = 100
#
# def foo():
#     l.append(333)
#
#     global x
#     x = 200
#
# foo()
#
# print(l)
# print(x)

# =============》 nonlocal关键字

x = 111
def f1():
    # x = 222
    def f2():
        # global x
        nonlocal x
        x = 333

    f2()
    print('==========>f1肚子里的x: ',x)

# f1()

# print(x)

五、闭包函数

# 闭函数:定义在函数内部的函数
# def outter():
#     def wrapper():
#         print('====>wrapper')

# 包函数: 内部函数引用了一个来自于外层函数的变量
# def outter():
#     x = 111
#     def wrapper():
#         print('====>wrapper',x)



# 为函数体传参的两种方案
# 方案一:直接通过参数传入即可
# def wrapper(x):
#     print('====>wrapper',x)
#
# wrapper(111)
# wrapper(222)

# 方案二:闭包函数
def outter(x):
    def wrapper():
        print('====>wrapper',x)
    return wrapper  # 不要加括号

# new_wrapper1 = outter(111)
# new_wrapper1()
#
# new_wrapper2 = outter(222)
# new_wrapper2()


xxx = outter(111)

xxx()

上一篇:浮点数拓展


下一篇:Python函数基础(四)