首页 > 其他 > 详细

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

时间:2019-07-10 17:34:39      阅读:116      评论:0      收藏: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)

 

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

原文:https://www.cnblogs.com/jinpan/p/11165160.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!