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

Posted on   jinpan  阅读(193)  评论(0编辑  收藏  举报

函数对象(函数名本质)

复制代码
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)
复制代码

 

编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

随笔 - 17, 文章 - 0, 评论 - 0, 阅读 - 3862

Copyright © 2025 jinpan
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示