• 0920 函数参数与定义域


    1.可变长参数

    *+形参

    调用函数时,有多少个位置实参,就接收多少个参数。

    • *args(约定俗成的),用元组接受多余的位置实参。
    def f1(*args):
        print(args)
    f1()			#空元组
    f1(1)			# (1,)
    f1(1,2)			# (1,2)
    f1(1,2,3,4,5,6,4,7,5,2)		#(1,2,3,4,5,6,4,7,5,2)	
    

    ** + 形参

    ** kwargs 用字典接受多余的关键字实参

    def f1(**kwargs):
        print(kwargs)
    
    f1(x=1)  # 空字典
    

    仅做了解

    *+实参

    打散列表,然后以位置实参传给位置形参

    def f1(a, b, c, e, d, f, g):
        print(a, b, c, e, d, f, g)
    
    
    lt = [1, 2, 3, 4, 5, 6, 7]
    # f1(lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6])
    f1(*lt)  # *lt把列表中的元素打散成位置实参依次传给位置形参
    

    **+实参

    打散字典,然后以关键字实参传给位置形参

    def f1(z, b):
        print(z, b)
    
    
    dic = {'z': 1, 'b': 2}  # a=1,b=2
    f1(**dic)  # **dic把字典打散成关键字实参然后传给函数f1
    

    2.函数对象

    python中一切皆对象

    s = 10
    print(s)
    #  10 
    

    1.引用

    s1 = s
    # 10
    

    2.容器元素

    lt = [s]
    

    3.作为函数的实参

    def f1(ssadfsadf):
        print(ssadfsadf)
        
    f1(s)
    

    4.作为函数的返回值

    def f1(s):
        return s
    
    s2 = f1(s)
    
    

    字典/列表/元组/集合/布尔值,所有对象都可以做以上四件事情

    函数对象 == 函数名

    函数名+()实在调用函数。

    def f1():
        print('from f1')
    
    

    1.引用

    func = f1
    print('f1:', f1)
    print('func:', func)
    
    func()
    #  可以直接调用函数
    
    

    2.容器元素

    lt = [f1, 1, 2, 3]
    
    print('lt[0]', lt[0])
    print('f1', f1)
    
    lt[0]()
    #  此时 lt[0] 既是 f1函数
    
    

    3.作为函数的实参

    def f1():
        print('from f1')
    
    def f2(s):
        print('s',s)
        s()
        # s就是f1 函数 所以可以直接调用
    f2(f1)
    # f1 做了f2的实参
    
    print('f1', f1)
    
    

    4.作为函数的返回值

    def f1():
        print('from f1')
        
    def f2(f2_f1):
        return f2_f1
    
    res = f2(f1)
    
    
    print('res', res)
    print('f1', f1)
    res()
    
    

    3.函数嵌套

    函数里面有函数

    函数内部定义的函数,外部不能用。

    def f1():
        print('from f1')
    
        def f2():
            print('from f2')
            
        return f2
    
    res = f1()
    print(res)
    res()
    '''
    from f1
    <function f1.<locals>.f2 at 0x000002451C9BCBF8>
    from f2
    '''
    
    

    4.名称空间与定义域

    名称空间

    存储了内置方法的名称

    python解释器自带内置方法(print/len/list/str/dict

    局部名称空间

    函数内部定义的都叫局部

    def f1():
        x = 10
    #  x 就是局部
    
    

    全局名称空间

    除了内置和局部都叫全局

    def f1():
        x = 10
        def f2():
            z = 20
    y = 10
    lt = [1, 2, 3]
    # f1  y  lt 都是全局
    
    

    名称空间的执行顺序

    1.内置名称空间:python解释器启动时就有了

    2.全局名称空间:执行文件代码的时候才会有全局

    3.局部名称空间:函数调用的时候才会有局部

    搜索顺序

    先从当前所在位置寻找 ,找不到再按照 局部 =》全局=》内置 =》

    作用域

    全局作用域

    内置名称空间 + 全局名称空间 ==》全局作用域

    #  全局作用域的变量与局部作用域的变量没有任何关系
    def f1():
        y = 2
        print(1, y)   # 1 2
    
    y = 10
    f1()
    print(2, y)		#  2 10
    
    print(y)		# 10
    '''
    '''
    
    

    局部作用域

    局部作用域1的x和局部作用域2 的x没有任何关系
    即使局部作用域1和局部作用域2再同一个局部作用域下

    def f1():
        def f2():
            def f3():
                x = 1
                print(x)
            x = 2
            f3()
            
        f2()
    f1()
    
    # 结果为1
    
    

    仅做了解

    global

    可以修改全局作用域中的变量,让global以下的局部的x变成全局的x

    x = 10
    
    def f1():
        global x  # 让global以下的局部的x变成全局的x
        x = 20
    
    f1()
    print(x)
    #  20
    
    

    nonlocal

    nonlocal让x成为顶层函数的局部,不是让他成为全局

    压根没有应用情景,尽量不要嵌套函数

    x = 10
    
    def f1():
        def f2():
            def f3():
                nonlocal x  # nonlocal让x成为顶层函数的局部,不是让他成为全局  # 压根没有应用情景,尽量不要嵌套函数
                x = 1
            x = 2
            f3()
            print(1, x)      # 1  1
            
    	f2()
    def f0():
        x  = 3  # f1的nonlocal无法修改
        f1()
    f1()
    print(2, x)			# 2  10
    
    

    可变数据类型均可打破以上规则

    lt = [10,11]
    def f1():
        lt[0] = 22
    f1()
    print(lt)
    #  输出结果为 [22, 11]
    
    
  • 相关阅读:
    drf中APIView源码分析
    将orm中模型类对象转化为字典,简单粗暴的方法
    python中uuid的使用
    每日作业 7/3
    传输文件到docker容器
    mysql 常用选项
    mysql基本语句
    mysql数据库的基本操作增删改查
    docker service的常用操作
    centos7主机重命名
  • 原文地址:https://www.cnblogs.com/fwzzz/p/11563122.html
Copyright © 2020-2023  润新知