不定长参数

在Python语言中,函数可以定义不定长参数,也叫可变参数。假设:给定一组数字a,b,c……,请计算a+b+c+ ……。要定义出这个函数,必须确定输入的参数。我们可以把a,b,c……作为一个list或tuple传进来。

示例:

def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n
    return sum


print(calc([1, 2, 3])) # 结果是6
print(calc([1, 2, 3,4])) # 结果是10

示例中:调用的时候,需要先组装出一个list或tuple;在Python语言中,可以在函数参数前面添加“*”号把该参数定义为不定长参数;可以看出,不定长参数的使用使得calc()函数定义和调用都变得简洁。

示例:

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n
    return sum


print(calc(1, 2, 3, 4))
print(calc())
num = [1, 2, 3]
print(calc(*num))

输出结果:

10
0
6

关键字参数

知识要点:

1.关键字实参是传递参数时使用“名称–值”对的方式,在实参中将名称和值关联起来。
2.关键字实参让开发者无需考虑函数调用中的实参顺序,清楚地指出了函数调用中各个值的用途。
3.关键字参数有扩展函数的功能。

命名关键字参数

当我们需要限制关键字参数的名字,可以用命名关键字参数。和关键字参数**kw不同,如果没有可变参数,命名关键字参数就必须加一个“”号作为特殊分隔符。如果缺少“”,Python语言解释器将无法识别位置参数和命名关键字参数。

示例:若只接收age和city作为关键字参数,可以使用一下的方式。

def enroll(name, gender, *, age, city):
    print(name, gender, age, city)


enroll('Jack', 'M', age='18', city='Beijing')

输出结果:

Jack M 18 Beijing
def enroll(name, gender, *grade, age, city):
    print(name, gender, age, city)


enroll('Jack', 'M', '18', 'Beijing')

报错结果:

Traceback (most recent call last):
  File "D:/python_spider/python_demo/demo_2.py", line 119, in <module>
    enroll('Jack', 'M', '18', 'Beijing')
TypeError: enroll() missing 2 required keyword-only arguments: 'age' and 'city'
def enroll(name, gender, *, age='18', city):
    print(name, gender, age, city)


enroll('Jack', 'M', city='Beijing') # 结果是:Jack M 18 Beijing

注意事项:
1.*表示不定长参数。
2.**表示不定长的关键字参数。

参数组合

在Python语言中定义函数,开发者可以组合使用这些参数(必选参数、默认参数、可变参数、关键字参数和命名关键字参数)。注意参数定义是有顺序的。定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

示例:定义一个函数,包含上述若干种参数。

def func(a, b, c=0, *args, **kw):
    print('a=', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)


print(func(1, 2))  
# 输出结果:a= 1 b= 2 c= 0 args= () kw= {}
print(func(1, 2, c=3))  
# 输出结果:a= 1 b= 2 c= 3 args= () kw= {}
print(func(1, 2, 3, 'a', 'b'))  
# 输出结果:a= 1 b= 2 c= 3 args= ('a', 'b') kw= {}
print(func(1, 2, 3, 'a', 'b', x=4))  
# 输出结果:a= 1 b= 2 c= 3 args= ('a', 'b') kw= {'x': 4}
args = (1, 2, 3, 4)
kw = {'x': 5}
print(func(*args, **kw))  
# 输出结果:a= 1 b= 2 c= 3 args= (4,) kw= {'x': 5}