函数名本质、函数命名空间和作用域链

函数对象(函数名本质)

1.函数名传递,可以被引用
# def name():
#     print('what is u name')
# jinpan = name
# jinpan()


2.可以被当作容器类型的元素
# def name():
#     print('my name is jinpan')
#
#
# def my_name():
#     str = 'my name is jinpan'
#     return str
#
#
# list_clutter = [True,(1,),{'teacher':'jason'},name,my_name,name(),my_name()]
# print(list_clutter)


3.函数名作为参数传入并调用
# def jinpan():
#     print('my name is jinpan ')
#
# def name(jipan):
#     print('what is u name')
#     jinpan()
#     print(jinpan)
#     print(id(jipan))
#
#
# res = jinpan
# name(res)


4.函数名作为返回值返回
# 返回自己例子
# def name():
#     print('what is u name')
#     return name
#
# res = name()
# res()

# 返回其他函数例子
# def jinpan():
#     print('hello my name is jinpan')
#
#
# def name():
#     print('what is u name')
#     return jinpan
#
# res = name()
# res()

函数的嵌套

# 在函数内部调用其他函数
# 可以将复杂的逻辑简单化
# def index():
#     func()
#     print('index')
#
# def func():
#     # index()
#     print('func')
# index()


# def my_max(x,y):
#     if x > y:
#         return x
#     return y
#
# def my_max4(a,b,c,d):
#     res1 = my_max(a,b)
#     res2 = my_max(res1,c)
#     res3 = my_max(res2,d)
#     return res3
# print(my_max4(1,2,10,4))


# def outer():
# x = 1
# print('outer')
# def inner():
# print('inner')
# # print(inner)
# return inner
#
# res = outer()
# # print(res)
# res()

命名空间和调用介绍

命名空间一共分为三种:

  全局命名空间

  局部命名空间

  内置命名空间

内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
全局名称空间:文件级别的代码
局部名称空间:函数体内创建的名字都属于局部名称空间

加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)


取值:

在局部调用:局部命名空间->全局命名空间->内置命名空间

在全局调用:全局命名空间->内置命名空间


命名空间的生命周期: 内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁 全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁 局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

命名名称空间的查找原则

函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间

函数的作用域

# 全局作用域
# 全局有效: 内置名称空间  全局名称空间


# 局部作用域
# 局部有效   局部作用域

 global nonlocal
"""
1.在局部修改全局的变量
"""



# global 在局部修改全局的不可变数据类型
# x = []  # 因为列表是可变类型
x = 1  # 不可变类型
username = 'jason'
def func():
    # x.append('嘿嘿嘿')
    global x,username  # 修改全局变量 而不是创建局部名称空间
    x = 999
    username = 'egon'
func()
print(x)
print(username)



# nonlocal  局部修改局部
def func():
    x = 1
    def index():
        nonlocal x
        x = 2
    index()
    print(x)
func()


"""
global:局部修改全局 如果想修改多个 逗号隔开
nonlocal:局部修局部 如果想修改多个 逗号隔开

"""

实例+个人理解

# 函数内定义函数应用场景
"""
写一个函数
该函数用户可以通过传参的不同控制函数执行不同的功能
"""

def all_func(type):
    def register():
        print('register...')
    def login():
        print('login....')
    def shopping():
        print('shopping...')
    if type == '1':
        register()
    elif type == '2':
        login()
    elif type == '3':
        shopping()
    else:
        print('type value error')
while True:
    choose = input('input 1~3 : int >>>>:')
    all_func(choose)
原文地址:https://www.cnblogs.com/jinpan/p/11165160.html