函数进阶5.1函数参数高级用法


一、缺省参数

1. 是什么

缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据

示例

image-20200902145748782

2. 做什么

当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数

例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么“xxx学校”就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则让人弄混了

来个demo试试看

def print_info(name, class_name, grade, department_name, school_name="通俗易懂"):
    print("老师好:我是来自 %s学校 %s系 %s年级 %s班级 的学生,我叫%s" % (
        school_name,
        department_name,
        grade,
        class_name,
        name
    ))


print_info("dong", "超牛", "二", "软件工程")
print_info("dong", "超牛", "二", "软件工程", "codetutor.top")
 

运行结果

老师好:我是来自 通俗易懂学校 软件工程系 二年级 超牛班级 的学生,我叫dong
老师好:我是来自 codetutor.top学校 软件工程系 二年级 超牛班级 的学生,我叫dong
 

3. 注意点

  • 缺省参数只能在形参的最后(即最后侧)

  • 缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)

>>> def printinfo(name, age=35, sex):
...     print name
...
File "", line 1
SyntaxError: non-default argument follows default argument
 

二、命名参数

1. 是什么

命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数

示例

image-20200902152007236

2. 做什么

命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据

3. 注意点

  • 命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做num,而形参中没有变量num

  • 如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数

def test(a, b, c=100, d=200):
    print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))


# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)

# 下面的方式都失败
test(c=1, d=2)  # 缺少a、b的值
test(c=1, d=2, 11, 22)  # 11, 22应该在左侧
 

三、不定长参数

1. 是什么

不定长参数:定义函数的时候形参可以不确定到底多少个,这样的参数就叫做不定长参数

不定长参数有2种方式表示

  • *args :表示调用函数时多余的未命名参数都会以元组的方式存储到args
  • **kwargs:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs

注意:

  • ***是必须要写的,否则就变成了普通的形参了
  • 当我们说不定长参数的时候,就是指*args**kwargs

示例

image-20200902153628034

2. 做什么

通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求

例如

def test(a, b, *args, **kwargs):
    print("-------------------------------")
    print(a, type(a))
    print(b, type(b))
    print(args, type(args))
    print(kwargs, type(args))


test(11, 22)
test(11, 22, 33, 44, 55, 66)
test(11, 22, 33, 44, 55, 66, name="wanglaoshi", web_site="http://www.codetutor.top")
 

运行结果:

-------------------------------
11 
22 
() 
{} 
-------------------------------
11 
22 
(33, 44, 55, 66) 
{} 
-------------------------------
11 
22 
(33, 44, 55, 66) 
{'name': 'wanglaoshi', 'web_site': 'http://www.codetutor.top'} 
 

说明:

image-20200902154142271

3. 注意点

  • 加了星号*的变量args会存放所有未命名的变量参数,args为元组
  • 而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典
  • 一般情况下*args**kwargs会在形参的最右侧
  • argskwargs的名字可以变,例如叫*aa**bb都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改

4. 特殊情况

缺省参数在*args后面

def sum_nums_3(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)


sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
 

说明:

  • *args后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
  • 如果有**kwargs的话,**kwargs必须是最后的