来源:python中国网 时间:2019-09-07

  可变参数,又称不定长参数,即传入函数中的参数可以是任意多个。或者说一个函数能处理比当初声明时更多的参数。听起来很神奇,如何实现呢?

  主要有2 种形式:形参前添加一个 * 或者形参前添加两个 *,形参名不是固定的,但是人类习惯用args和kwargs。

  1形参前添加一个 *,形参本身被当做元祖处理,该元组可接受任意个非关键字实参。

# -*- coding: utf-8 -*-


def test_arg(name, *args) :
    print(name,args) # args被当做元组
    for person in args:
        print(person,'嘿嘿')

test_arg('隔壁老王', '妇女1','妇女2','妇女3')
D:python3installpython.exe D:/pyscript/py3script/python66/python66.py
隔壁老王 ('妇女1', '妇女2', '妇女3')
妇女1 嘿嘿
妇女2 嘿嘿
妇女3 嘿嘿

Process finished with exit code 0



  易错点:上面的函数如果*agrs和name调换顺序,name必须以关键字实参的形式传参,否则报错。

# -*- coding: utf-8 -*-


def test_arg(*args,name) :
    print(name,args) # args被当做元组
    for person in args:
        print(person,'嘿嘿')

test_arg('妇女1','妇女2','妇女3',name='隔壁老王')

print('=================================')
def test_arg(*args,name) :
    print(name,args) # args被当做元组
    for person in args:
        print(person,'嘿嘿')

test_arg('妇女1','妇女2','妇女3','隔壁老王')
D:python3installpython.exe D:/pyscript/py3script/python66/python66.py
隔壁老王 ('妇女1', '妇女2', '妇女3')
Traceback (most recent call last):
妇女1 嘿嘿
妇女2 嘿嘿
妇女3 嘿嘿
=================================
  File "D:/pyscript/py3script/python66/python66.py", line 17, in 
    test_arg('妇女1','妇女2','妇女3','隔壁老王')
TypeError: test_arg() missing 1 required keyword-only argument: 'name'

Process finished with exit code 1



  2 形参前添加两个*,形参本身被当做字典,该字典可以接收任意个对关键字参数赋值的实参(key=value)。

# -*- coding: utf-8 -*-


def test_karg(name,**kargs) :
    print(name,kargs) # kargs被当做字典
    for person,age in kargs.items():
        print(person,age)

test_karg('王老五',小妾1=18,小妾2=28)


D:python3installpython.exe D:/pyscript/py3script/python66/python66.py
王老五 {'小妾1': 18, '小妾2': 28}
小妾1 18
小妾2 28

Process finished with exit code 0



 *args、*kargs混合使用,你可能会出错。

# -*- coding: utf-8 -*-

def test(a, b, c=3, *args, **kargs) :
    print(a, b, c)
    print(args)
    print(kargs)
test(1, 2, "www.python66.com" , "我是args", p1='隔壁老王', p2='隔壁老张')

D:python3installpython.exe D:/pyscript/py3script/python66/python66.py
1 2 www.python66.com
('我是args',)
{'p1': '隔壁老王', 'p2': '隔壁老张'}

Process finished with exit code 0