• 函数的嵌套,名称空间以及作用域


    引入函数相关的了解部分

    命名关键字参数:

    在函数定义阶段 写在*与**可变长参数之间的形参
    在给命名关键字参数传值的时候 只能用关键字为其传值
    在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错
    其实z和m都是命名关键字参数 不是默认值参数和位置参数

    def func(x,y=1,*args,z=3,m,**kwargs):
    print(x,y)
    print(args)
    print(z,m)
    print(kwargs)
    func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)

    函数对象:

    函数是第一类对象:函数名指向的值可以被当中参数传递

    1.函数名可以被传递

    name = 'jason'
    x = name
    print(x)
    print(id(x))
    def func():
    print('from func')
    # print(func)
    print(id(func))
    f = func
    func()
    print(f)
    f() # 其实指向的也是函数func指向函数体代码的内存地址


    2.函数名可以被当做参数传递给其他函数

    def func():
    print('from func')
    
    def index(args):
    print(args)
    args()
    print('from index')
    # index(1)
    index(func)

    3.函数名可以被当做函数的返回值

    def index():
    print('index')
    
    def func():
    print('func')
    return index
    res = func()
    print(res)
    res()


    4.函数名可以被当做容器类型的参数

    def func():
    print('func')
    print(func())
    l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None]

    相关小问题

    循环打印项目功能提示信息 供用户选择 用户选择谁就执行谁

    msg = """
    1 注册
    2 登陆
    3 转账
    4 购物
    5 支付
    """
    func_dict = {
        '1':register,
        '2':login,
        '3':transfer,
        '4':shopping,
        '5':pay,
    }
    while True:
        print(msg)
        choice = input('请现在你想要执行的功能>>>:').strip()
        if choice in func_dict:
            func_dict.get(choice)()  # 函数名()
    
        # if choice == '1':
        #     register()
        # elif choice == '2':
        #     login()
        # elif choice == '3':
        #     transfer()
        # elif choice == '4':
        #     shopping()
        # elif choice == '5':
        #     pay()
        else:
            print('你输入的功能暂时没有')

    函数的嵌套调用

    在函数内部调用其他函数
    可以将复杂的逻辑简单化

    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))

    名称空间

    就是放名字的地方
    详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
    要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

    x = 1
    
    if 1 ==1 :
        y = 2
    
    # print(y)
    # while True:
    #     z = 3
    for i in [1,2,3]:
        print(i)
    print(i)
    
    def func():
        username = 'jason'
    print(x)
    func()

    名称空间的分类
    1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
    len
    max
    min

    2.全局名称空间:文件级别的代码

    x = 1
    if 1 ==1 :
    y = 2
    print(y)
    while True:
    z = 3


    x,y,z都会放到全局名称空间
    if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的
    3.局部名称空间:函数体内创建的名字都属于局部名称空间
    username



    生命周期:

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

    名称空间的查找顺序

    名字的查找 (******)
    1.需要先确定你当前在哪(大前提)
    1.站在全局: 全局 >>> 内置
    2.站在局部: 局部 >>> 全局 >>> 内置

    函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)

    作用域

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


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

    global nonlocal


    在局部修改全局的变量

    #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:局部修局部 如果想修改多个 逗号隔开

  • 相关阅读:
    python web自动化测试框架搭建(功能&接口)——通用模块
    Python web自动化测试框架搭建(功能&接口)——unittest介绍
    什么是Referrer-Policy
    git pull 问题
    [坑]sed命令替换指定字符后不固定字符串,文本信息的替换删除
    修改Mysql procedure,function and view definer
    遵循PEP8风格指南
    Mysql create constraint foreign key faild.trouble shooting method share
    Spring JDBC FOUND_ROWS 安全吗?
    邮件安全产品方案
  • 原文地址:https://www.cnblogs.com/wkq0220/p/11164928.html
Copyright © 2020-2023  润新知