python函数进阶

  

# 函数的命名空间和作用域
# 内置命名空间
    # 存在于python解释器中,在启动python时,就自动运行内置命名空间比如print() input()即启动就可以使用的命名变量内置的名字,在启动时被加载到内存中
# 全局命名空间
    # 在程序中从上至下依次被执行的名称变量,放置了我们需要的变量名称
# 局部命名空间
    # 在程序中定义函数中所定义的名称变量,作用范围只是在该局部范围内有效,当函数结束时,将名称变量会释放
# 在全局空间中能够使用,内置名称和全局名称
# 在局部空间中能够使用,内置名称和全局名称和局部名称
# 在正常情况下,直接使用内置的名字
# 当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
# 当我自己有的时候 我就不找我的上级要了
# 如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
# 多个函数应该拥有多个独立的局部名字空间,不互相共享

# def f():
#     a = 1
#     print( a )
# print(a)
# # 在全局空间中使用,局部变量会报错
# a = []
# def f():
#     a.append('ss')
#     print(a)
# f()
# print(a)
# a = 1
# def f():
#     a +=1
# f()
# print(a)
# 在局部变量中可以使用全局变量 但是 当全局变量为不可变类型时,不能再局部空间中对其进行运算
# 可变数据类型不受影响
# 如果想要修改,得在局部空间使用global可对全局不可变类型的变量进行改变(但是不建议使用global,因为他会使代码的安全性降低)
# a = 1
# def f1():
#     a = 9
#     def f2():
#         b = 2
#         print('##',a,b)
#         def f3():
#             nonlocal a
#             a += 2
#             print(a,'===')
#         f3()
#         print('&', a)
#
#     f2()
#     print(a,'__')
# print(a,'@@')
# f1()
# # print('a!!',a)
# def func():
#     print(123)
# func1 = func
# # func1()
# # func()
# print(id(func),id(func1))
# l = [func,func1]
# for i in l:
#     i()
# #函数名是内存地址,可以进行赋值,函数名可以作为容器类型的元素
def func():
    print(123)

def wahaha(f):
    f()
    return f           #函数名可以作为函数的返回值

qqxing = wahaha(func)   # 函数名可以作为函数的参数
qqxing()