Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元组类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python高级编程

第二十章: Python项目实战

首页 > Python基础教程 > 第十四章: Python函数处理 > 14.3节: 函数的可变参数

14.3节: 函数的可变参数

薯条老师 2020-05-21 13:55:12 231838 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://www.chipscoco.com/?cate=6

14.3.1 理解可变参数

函数的可变参数,可以从其字面意思来进行理解。“可变”是指参数的数目是变化的,不确定的。在Python中定义函数时,给形参加上一个"*"或"**"的修饰符,那么该形参就是一个可变形参。

image.png

14.3.2 操作符*与**

(1) 使用*将实参收集为元组
在Python中定义函数时,在形参前面加一个"*"操作符,那么在执行函数调用时,Python解释器会将该参数位置处开始的实参全部收集到一个元组当中。
代码实例:
# __desc__ = 使用*操作符来定义一个可变形参
 
# 定义accumulate函数来实现累加
def accumulate(number, *numbers):
    """形参numbers是一个可变形参"""
 
    sum_of_numbers = number
 
    """
    (1) 使用*来修饰形参以后,Python会将该参数位置处开始的参数全部收集到
    一个元组当中
    (2) 元组就是使用*修饰的这个numbers形参
    """
 
    # 在循环中遍历元组中的元素,并进行累加
    for number in numbers:
        sum_of_numbers += number
 
    return sum_of_numbers
 

# 调用函数时,Python会将可变形参位置处开始的参数全部收集到一个元组中
sum_of_numbers = accumulate(1,2,3,4,5)
# Python会将实参2,3,4,5全部收集到元组numbers中
# sum_of_numbers的输出为15
可变形参的收集顺序为,从可变形参的位置处开始,从左往右进行收集
由于可变形参是从左到右进行参数的收集,所以我们在定义函数时,通常是将可变形参置于普通形参的右边。如果将可变形参置于普通形参的左边,那么,为了让普通形参产生作用,必须使用关键字参数的方式来进行函数调用。
代码实例:
# __desc__ = 使用*操作符来定义一个可变形参
 
# 定义accumulate函数来实现累加,将可变形参置于普通形参的左边
def accumulate(*numbers,number):
    """形参numbers是一个可变形参"""
 
    sum_of_numbers = number
 
    """
    (1) Python将形参numbers位置处开始的参数全部收集到
    元组当中
    (2)元组就是使用*修饰的这个numbers形参
    """
 
    # 在循环中遍历元组中的元素,并进行累加
    for number in numbers:
        sum_of_numbers += number
 
    return sum_of_numbers
 
# 在调用函数时,必须通过关键字参数的方式来调用accumulate函数
sum_of_numbers = accumulate(1,2,3,4,number = 5)
 
# 如果不通过关键字参数来调用,那么在执行时会抛出类型错误的异常
(2) 使用**将实参收集为字典
定义函数时,使用**操作符对形参进行修饰,在调用函数时以关键字参数的方式来传递参数,则Python会将该参数位置处开始的实参收集为字典类型。
代码实例
# __desc__ = 使用**操作符来定义一个可变形参
 
# 定义accumulate函数来实现累加,将可变形参置于普通形参的左边
def accumulate(**numbers):
    """形参numbers是一个可变形参"""
 
    sum_of_numbers = 0
 
    """
    (1)Python将形参numbers位置处开始的参数全部收集到字典当中
    (2)字典就是使用**修饰的这个numbers形参
    """
 

    # 在循环中遍历字典中的键名,并将键值进行累加
    for _ in numbers:
        sum_of_numbers += numbers[_]
 
    return sum_of_numbers
 
# 在调用函数时,必须通过关键字参数的方式来调用accumulate函数
sum_of_numbers = accumulate(number1 = 5, number2=3)
 
# sum_of_numbers的输出为8
(3) 混合使用"*"与"**"
混合使用*与**操作符来对形参进行修饰。
代码实例:
# __desc__ = 混合使用*与**操作符来对形参进行修饰
 
# 定义accumulate函数来实现累加
def accumulate(*numbers,**digits):
 
    sum_of_numbers = 0
    for _ in number:
        sum_of_numbers += _
 
    for _ in digits:
        sum_of_numbers += digits[_]
    
    return sum_of_numbers
(4) *args与**kwargs
*args 与 **kwargs是可变形参名称的通用写法,前者用来将实参打包成一个元组类型,后者用来将实参打包成一个字典类型。同学们在实际定义函数的过程中,可以沿用这种通用的写法,也可以自行定义可变参数的名称。
代码实例:
# __desc__ = 使用*args与**kwargs
 
# 定义accumulate函数来实现累加
def accumulate(*args,**kwargs):
 
    sum_of_numbers = 0
    for _ in args:
        sum_of_numbers += _
 
    for _ in kwargs:           
            sum_of_numbers += kwargs[_]
 
    return sum_of_numbers

14.3.3 对实参进行解包

在定义函数时使用*或**,是将实参收集到元组或字典中。而在调用函数时使用*或**来进行修饰,则是将实参进行解包。所谓的解包,就是将数据集合中的元素取出,然后赋值给对应的参数。为理解这样的用法,先看一段代码实例:
# __desc__ = 理解实参的解包
 
# 定义accumulate函数,将参数进行累加
def accumulate(number1, number2):
    return number1 + number2
 
numbers = [1,2]
 
# 调用函数时使用*操作符对列表numbers进行修饰
sum_of_numbers = accumulate(*numbers)
# sum_of_numbers的输出为3

在上文代码中,accumulate函数有两个形参,分别是number1,number2。实参numbers中一共有两个元素,将numbers进行解包后,元素值1对应的形参为number1,元素值2对应的形参为number2。那么,调用accumulate(*numbers),相当于调用accumulate(1,2)。


(1) 使用*对可迭代对象进行解包
迄今为止学过的可迭代对象有:字符串类型,列表,元组,字典,集合。在对字典,集合等类型进行解包时,解包出的元素为对应的键名。在实际开发中,通常使用**操作符对字典进行解包。
代码实例:
# __desc__ = 使用*序列结构进行解包
 
# 定义accumulate函数,将参数进行累加
def accumulate(param1, param2):
    return param1 + param2
 
 
# 1.对字符串进行解包
chars = "ab"
result = accumulate(*chars)
# result的输出为"ab"
 
 
# 2.对列表进行解包
numbers = [1,2]
result = accumulate(*numbers)
# result的输出为3
 
 
# 3.对元组进行解包
numbers = (5,5)
result = accumulate(*numbers)
# result的输出为10
 
# 4.对集合进行解包
numbers = {3,-3}
result = accumulate(*numbers)
# result的输出为0
(2) 使用**对字典进行解包
对字典进行解包时,字典中的键名与函数中的形参名一一对应,实参即该键名所对应的键值。
代码实例:
# __desc__ = 使用**字典进行解包
 
# 定义accumulate函数,将参数进行累加
def accumulate(x, y):
    return x + y
 
 
numbers = {"x": 1, "y": 99}
 
result = accumulate(**numbers)
# result的输出为100
字典中的键名必须与函数中的形参名一一对应,否则Python会抛出类型错误的异常信息。
代码实例
# __desc__ = 使用**字典进行解包
 
# 定义accumulate函数,将参数进行累加
def accumulate(small, large):
    return small + large
 
 
numbers = {"small": 1, "large": 99, "median": 33}
result = accumulate(**numbers)
在执行上文的代码时,程序抛出了类型错误的异常信息,因为字典中的键名median在accumulate函数中找不到对应的形参名。

14.3.4 知识要点

(1) 定义函数时,使用*与**操作符来定义可变参数,在调用函数时,使用*与**操作符来对参数进行解包。
(2) 使用*操作符定义可变参数时,Python会将该形参位置处开始的实参收集到元组中。
(3) 使用**操作符定义可变参数时,Python会将该形参位置处开始的实参收集到字典中。

14.3.5 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: