• python之函数参数


    函数参数:

    1、形参变量
    只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。
    函数调用结束返回主调用函数后则不能再使用该形参变量;

    2、实参变量
    可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,
    以便把这些值传送给形参。因此应预先用赋值、输入等办法使参数获得确定值。

    例如:
    #函数调用时,使用形参

    def calc(x,y):
        res=x**y
        return res

    #实参,下面的a,b都是实参
      a=3
      b=4
      c=calc(a,b)
      print(c)

    位置参数:
      在调用函数,传递参数的时候,每个实参与形参需要一一对应的关系;
      在这期间实参就是位置参数;
      此时并没有具体指定哪个实参要传递给哪个形参;
      此时实参与形参之间是一一对应的关系;

    例如:

    def test(x,y,z) #x=1,y=2,z=3
        ...
        
    c=test(1,2,3)

    关键字参数:

      当调用函数时,具体指定了哪个形参接收具体的参数时,此时叫做关键字参数
      关键字参数时位置不是一一对应;

    例如:

    def test(x,y,z)  #x=4,y=9,z=2
        ...             
        
    c=test(z=2,x=4,y=9)

    #位置参数与关键字参数的混搭使用:
    注意:
      要混搭使用时,位置参数必须要在关键字参数的左边
    例如:

    def test(x,y,z):
        print(x)
        print(y)
        print(z)
        
    c=test(1,3,z=2)

    默认参数:
      形参可以设置默认参数,不必等待实参传递进来值;
      如果已有默认参数时,实参仍旧传递参数给形参,则已有的默认值被覆盖

    例如:

    def handle(x,y='mysql'):
        print(x)
        print(y)
        
    handle(x=9)
    返回结果:
    9
    mysql
    
    def handle(x,y='mysql'):
        print(x)
        print(y)
        
    handle(x=9,y='sqlite')
    返回结果:
    9
    sqlite

    非固定长度参数:
      形参接收变量时,可以一次接收许多参数;
      这些参数可以使用非固定长度参数来接收;
      使用:*args
      不一定非得使用*args,可以定义别的;
      但是,规定最好使用*args

    例如:
      注意:之前提到过,**字典、*列表
      args会被当作一个列表处理,*args就是去遍历这个列表

    def test(x,*args):
        print(x)
        print(args)
        print(args[0])
    
    test(1,2,3,4,5,6)
    返回结果:
    1
    (2, 3, 4, 5, 6)
    2

    例如:传递了字典

    def test(x,*args):
        print(x)
        print(args)
    
    test(1,{'name':'alex','age':19})
    返回结果:
    1
    ({'age': 19, 'name': 'alex'},)

    例如:传递了元组

    def test(x,*args):
        print(x)
        print(args)
    
    test(1,(1,2,3,))
    返回结果:
    1
    ((1, 2, 3),)

    例如:传递列表

    def test(x,*args):
        print(x)
        print(args)
    
    test(1,[1,2,3,4])
    返回结果:
    1
    ([1, 2, 3, 4],)

    例如:传递列表,可以用args从列表中取值

    def test(x,*args):
        print(x)
        print(args)
        print(args[0][0])
    
    test(1,[1,2,3,4])
    返回结果:
    1
    ([1, 2, 3, 4],)
    1

    例如:想从args中单独把每个列表的元素取出来
      那就需要在列表前面加*

    def test(x,*args):
        print(x)
        print(args)
        print(args[0])
    
    test(1,*['x','y','z'])
    返回结果:
    1
    ('x', 'y', 'z')
    x

    结论:如果不加*则表示把参数当作整体传给args
    args会把参数作为一个整体当作元组的第一部分

    **kwargs
      用于接收传递进来的类似字典形式的参数
      字典形式的参数并非如:key:value样式

    例如:

    def test(x,**kwargs):
        print(x)
        print(kwargs)
    
    test(1,y=2,z=3)
    返回结果:
    1
    {'z': 3, 'y': 2}

    综合使用:*args **kwargs

    def test(x,*args,**kwargs):
        print(x)
        print(args)
        print(kwargs)
        
    test(1,2,3,4,5,6,7,y=3,z=9)
    返回结果:
    1
    (2, 3, 4, 5, 6, 7)
    {'y': 3, 'z': 9}

    例如:可以做任何处理

    def test(x,*args,**kwargs):
        print(x)
        print(args)
        print(args[-1])
        print(kwargs)
        print(kwargs['y'])
        
    test(1,2,3,4,5,6,7,y=3,z=9)
    返回结果:
    1
    (2, 3, 4, 5, 6, 7)
    7
    {'y': 3, 'z': 9}
    3

    例如:传递列表及字典

    def test(x,*args,**kwargs):
        print(x)
        print(args)
        print(args[-1])
        print(kwargs)
        print(kwargs["k1"])
    
    test(1,*[1,2,3],**{"k1":"v1"})
    返回结果:
    1
    (1, 2, 3)
    3
    {'k1': 'v1'}
    v1
  • 相关阅读:
    数据结构(2)-链表
    数据结构(1)-数组
    SpringMVC学习总结(一)--Hello World入门
    基本数据类型对象的包装类
    关于String的相关常见方法
    常见的集合容器应当避免的坑
    再一次生产 CPU 高负载排查实践
    分表后需要注意的二三事
    线程池没你想的那么简单(续)
    线程池没你想的那么简单
  • 原文地址:https://www.cnblogs.com/Kumanon/p/10389535.html
Copyright © 2020-2023  润新知