Python基础篇----函数(2)

本章内容

      • 名称空间

      • 名字的查找顺序和作用域

      • global和nonlocal关键字

      • 函数名的多种用法

      • 函数的嵌套

名称空间


 名称空间的定义就是用于存放变量名和变量值绑定关系的地方,就像是民政局会存储你和你对象的婚姻关系记录。

名称空间可以分为三大类,分别是内置名称空间,全局名称空间和局部名称空间。

内置名称空间

1
2
python解释器提前定义好的一些内置名称。
eg:len,print,open,input

全局名称空间

1
2
3
4
5
6
在py文件中编写定义的名称在代码运行后产生的名称都会军刀全局名称空间中。
name = 'jason'  # 变量名name存入全局名称空间
def index():  # 函数名indx存入全局名称空间
    pass
if True:
   a = 1   # 变量名a存入全局名称空间

局部名称空间

1
2
3
函数体代码运行产生的都是举报名称空间。
def index():
    name = 'jason'   # name存入局部名称空间

名称空间的存活周期

1
2
3
4
5
6
7
8
9
内置名称空间:
       python解释器运行的时候产生
       python解释器关闭的时候销毁
全局名称空间:
       py文件开始运行的时候产生
       py文件结束运行的时候销毁
局部名称空间:
       函数体代码开始运行的时候产生
       函数体代码结束运行的时候销毁

名字的查找顺序和作用域


 当我们要查找一个名字的时候也是需要按照一个顺序去找的。

查找顺序

1
2
3
4
5
6
7
8
9
如果在局部名称空间内开始查找
     局部名称空间 >>> 全局名称空间 >>> 内置名称空间
如果在全局名称空间内开始查找
     全局名称空间 >>> 内置名称空间len = '我是全局名称空间中的len'
def index():
    len = '我是局部名称空间中的len'
    print(len)
index()  # 调用函数 函数体就会执行 就会产生局部名称空间
print(len) # 我是全局名称空间中的len 在全局名称空间找,先找全局,再找内部。'''局部名称空间之间如果不是嵌套关系 那么互不干涉!!!'''

作用域

1
2
3
4
5
6
7
8
# 作用域就是名称空间能够作用的范围
内置名称空间
    程序任意阶段任意位置均可使用(全局有效)
全局名称空间
    程序任意阶段任意位置均可使用(全局有效)
局部名称空间 
    一般情况下只在各自局部名称空间中有效(局部有效)
 '''也可以通过一些手段打破规则'''

global与nonlocal关键字


 gloabl关键字:局部修改全局不可变类型。

如果想要在局部修改全局的不可变类型,需要提前加关键字global申明。
如果想要在局部修改全局的可变类型,不需要加关键字global申明。

x = 111
def index():
   # x = 222  # 在局部名称空间中创建了一个新的x
    global x  # 在局部名称空间中修改全局名称空间中的名字 那么需要使用关键字申明
    x = 666  # 修改的就是全局的x
index()
print(x)

局部名称空间嵌套的情况下 内层如果想要修改外层,
情况1数据是不可变类型,需要使用关键字nonlocal,
情况2数据是可变类型,不需要使用关键字nonlocal。

复制代码
def index():
    x = 111  # 在index的局部产生一个x=111
    l1 = [11, 22, 33]
    def f1():
        # x = 222  # 在f1的局部产生一个x=222
        # print(x)
        # 局部名称空间嵌套 内层修改外层
        # nonlocal x
        # x = 333
        l1.append(44)
    f1()
    print(x)
    print(l1)
index()
复制代码

函数名的多种用法


 用法1:函数名可以当做变量名赋值

def index():
    print('from function index')
print(index)
res = index  # 让res也指向函数体代码
print(res)
res()  # index()

 用法2:函数名还可以当成函数的实参

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

用法3:函数名还可以当做函数的返回值  

def func():
    print('from func')
    return index  # 将函数名当做返回值
def index():
    print('from index')
res = func()  # res接收函数名
print(res)  # 指向的是index函数的内存地址
res()  # index()

用法4:函数名可以作为容器类型的元素 

def index():
    print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
l1[-1]()  #  index()

 用法5:定义一个功能存放区

复制代码
func_dict = {
    '1':register,
    '2':login,
    '3':transfer,
    '4':withdraw,
    '5':check_order,
    '6':shopping,
    '7':check_account
}
while True:
    print("""
    1.注册功能
    2.登录功能
    3.转账功能
    4.提现功能
    5.查看账单
    6.购物功能
    7.查看余额
    """)
    choice = input('请输入您想要执行的功能编号>>>:').strip()
    if choice in func_dict:
        # 获取键对应的值(函数名)
        func_name = func_dict.get(choice)
        # 执行函数
        func_name()
    else:
        print('功能编号不存在')
    # 当功能比较多的是 频繁的编写elif很麻烦
    # if choice == '1':
    #     register()
    # elif choice == '2':
    #     login()
    # elif choice == '3':
    #     transfer()
    # elif choice == '4':
    #     withdraw()
    # elif choice == '5':
    #     check_order()
    # elif choice == '6':
    #     shopping()
    # else:
    #     print('请输入正确的功能编号')
View Code
复制代码

函数的嵌套


 在学习函数的时候,一定要细心,理清楚函数的概念还有函数定义和调用。

复制代码
# 函数嵌套的例子
def all_func(cmd):
    def register():
        print('注册功能')
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    if cmd == '1':
        register()
    elif cmd == '2':
        login()
    elif cmd == '3':
        transfer()
    else:
        print('哈哈哈 偷懒了  没有用刚刚的功能字典')
all_func('1')
all_func('2')
"""
函数的学习会让我们的代码逻辑更加清晰 更加便于维护
"""
复制代码

 

 

 

 

 

  

 

posted @   早安_1207  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
返回顶端
点击右上角即可分享
微信分享提示