一.函数对象

  函数是第一类对象,第一等公民,函数对象即函数可以被当作变量去用。

具体分为四个方面:

1.可以被赋值

def func():
    print('from func')
f = func
print(f is func)
f()

2.可以当作参数传给另一个函数

def func():
    print('from func')

def foo(a):
    print(a)
    a()

foo(func)

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

def func():
    print('from func')

def foo(f):
    return  f
res = foo(func)
print(res)
res()

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

def func():
    print('from func')

list = [1,2,func]
print(list)
list[2]()
#用法例子2

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 in func_dic:
        func_dic[choice][1]()
    else:
        print("输入命令错误")

二.函数嵌套

1.函数的嵌套定义

 

#例1
# def f1():
#     x = 111
#     def f2():
#         print('from f2')
#     # print(x)
#     # print(f2)
#     f2()
#
# f1()
 
#例2
# 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,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
 
res = max4(1,2,3,4)
print(res)

 

三.名称空间与作用域

(一).名称空间(Namespaces):存放名字与其对应的内存地址的地方

名称空间分为三大类:

1.内置名称空间:存放的是Python解释器自带的名字

  生命周期:解释器启动则产生,解释器关闭则销毁

 

print(len)
print(input)

 

2.全局名称空间:存放的是顶级的名字,不是函数内定义,也不是内置的

  生命周期:Py程序刚开始运行则立即产生。Py程序结束销毁

# x = 10

# if True:
#     y = 2

# def foo():
#     z = 3

3.局部名称空间 :存放的是函数内的名字

  生命周期:函数调用则产生,函数调用结束则销毁

# def foo():
#     len = 222
#     # print(len)
#
# foo()

###总结:

    1.名字的访问优先级:基于自己当期所在的位置向外一层一层查找,L-》E-》G-》B

    2.名称空间的‘嵌套’关系是函数定义阶段、扫描语法时生成的,与调用位置无关

x = 0

def f1():
    def f2():
        # x = 2222
        def f3():
            # x = 3333
            print(x)
        f3()
    x = 1111
    f2()

f1()

 

# # 案例1:
# x = 666
# def f1():
#     print(x)        #赋值前引用报错
#     x=111
#
# f1()             
 
# 案例2:
x = 666
 
def f1():
    x = 1111
    def f2():
        print('f2===>',x)
    return f2
 
f = f1()
 
def foo():
    x=77777777777777777
    f()
 
foo()                     #结果: 1111

(二).作用域  

1.全局作用域:内置名称空间、全局名称空间

    特点:全局存活,全局有效

2.局部作用域:局部名称空间

    特点:临时存活,局部有效

#global:用来在局部修改全局的不可变类型的值

# x = 100
#
# def login():
#     global x
#     x = 200
# login()
# print(x)

  

#nonlocal:可以将名字声明为来自外部嵌套函数定义的作用域(非全局)

#nonlocal x 会从当前函数的外层函数一层层去查找名字x,若是一直到最外层函数都找不到,则抛出异常

 

# def f1():
#     x = 100
#     def f2():
#         # global x
#         nonlocal  x
#         x = 200
#     f2()
#     print(x)
# f1()

  

 

posted on 2021-03-29 15:02  lzl_121  阅读(35)  评论(0编辑  收藏  举报