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
原文地址:https://www.cnblogs.com/Kumanon/p/10389535.html