Python入门教程+项目实战-14.3节-函数的可变参数

news2024/10/6 20:32:43

目录

14.3.1 理解可变参数

14.3.2 操作符*与**

14.3.3 对实参进行解包

14.3.4 知识要点

14.3.5 系统学习python


14.3.1 理解可变参数

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

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

 薯条老师简介:资深技术专家,技术作家,著有《Python零基础入门指南》,《Java零基础入门指南》等技术教程。薯条老师的博客:http://www.chipscoco.com, 系统学习后端,爬虫,数据分析,机器学习、量化投资。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/694930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

feign与springcloud版本不匹配报错,查看springcloud组件与springcloud的匹配版本的方法

问题描述 springboot版本号是2.0.0.M3,springcloud的版本号是Finchley.M2 2023-06-27 00:40:02.158 ERROR 26304 --- [ restartedMain] o.s.boot.SpringApplication : Application startup failedjava.lang.IllegalStateException: Error processi…

基于c#和xml存储数据的员工管理系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 项目介绍 本系统是人事管理系统,它主要实现管理员如何对普通用户进行授权,如何插入、删除一个员工的信息,用户如何浏览员工的所有信息,以及用户如何查询自己想要…

服务器数据库中了locked勒索病毒怎么办及正确的解密恢复流程是什么

在当今数字化时代,服务器数据库是企业重要的信息资产之一。然而,网络安全威胁也日益增加,其中之一便是勒索病毒。最近很多企业被.locked后缀勒索病毒攻击,导致系统的重要数据被加密,此次locked勒索病毒非常猖狂&#x…

运动耳机哪个好、超级适合运动的耳机推荐

无论你喜欢跑步、健身、骑行还是瑜伽等等,一款好的运动耳机都能够让你在运动过程中享受音乐的陪伴,让运动不再枯燥。运动耳机成为了运动伴侣中不可或缺的装备。今天,我将为大家介绍几款非常适合运动的耳机,并对这几款耳机进行全方…

在WSL2中安装IntelliJ IDEA开发工具

一、wsl支持图形 windows安装xming https://sourceforge.net/projects/xming/ 添加白名单 查看服务器ip ifconfig 编辑配置文件(结合自己的安装目录) ‪D:\ProgramFiles\Xming\X0.hosts 启动Xlaunh wsl 配置并验证 #b编辑配置文件 vi ~/.bashrc #末尾增加配置 export DI…

Clion开发STM32之W5500系列(三)

前言 编写w5500的驱动测试驱动 驱动编写 相关宏定义 #define sys_force_static_inline __attribute__((always_inline)) static inline寄存器驱动头文件 #ifndef STM32_VET6_W5500_REG_H #define STM32_VET6_W5500_REG_H#include "sys_core.h"#define MR (…

Java发送邮件-工具类-基于springboot

那么&#xff0c;废话少说&#xff0c;直接上代码。 1. 目录结构 重点是那几个带mail的&#xff0c;其他文件不用管。 2. pom <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schema…

【Java-14】3万字深入理解HashMap集合(高级)

1.HashMap集合简介 ​ HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在&#xff0c;即主要用来存放键值对。HashMap 的实现不是同步的&#xff0c;这意味着它不是线程安全的。它的key、value都可以为null。此外&#xff0c;HashMap中的映射不是有序的。…

chatgpt赋能python:Python跑步轨迹生成:如何利用Python生成跑步轨迹

Python跑步轨迹生成&#xff1a;如何利用Python生成跑步轨迹 如果你经常跑步&#xff0c;你可能会想知道你每次跑步的轨迹&#xff0c;而不仅仅是跑步的距离和时间。这时&#xff0c;Python可以帮助你生成跑步轨迹&#xff0c;并且还可以将轨迹可视化。在本文中&#xff0c;我…

软考高级系统架构设计师(五) 系统性能评价

目录 概要 性能指标 性能调整 ​阿姆达尔 性能评价 概要 性能指标 参考&#xff1a;【软考-系统架构设计师】知识要点-8 - 知乎 响应时间&#xff1a; 0.1秒&#xff1a;用户感觉不到任何延迟&#xff1b;1.0秒&#xff1a;用户愿意接受的系统立即响应的时间极限&#x…

Liunx 安装MySQL 8 社区版

1.下载MySQL版本 在官网可直接找见对应版本 wget https://dev.mysql.com/get/mysql80-community-release-el8-5.noarch.rpmrpm -ivh mysql80-community-release-el8-5.noarch.rpm2. 使用命令 ls /etc/yum.repos.d/ | grep mysql 查看是否存在以下两个repo文件 3.更新yum资源 …

云原生改造- istio (二)

目录 1 VirtualService 文件 2 DestinationRule 文件 3 演示结果 前提 基于内容的灰度发布&#xff0c;保证在chrome下可以访问V2版本&#xff0c;其他浏览器可以访问v1. 1 VirtualService 文件 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:n…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)二:登录界面及对应功能实现

一、本章内容 本章介绍系统登录界面、登录流程、登录接口等相关内容的开发,实现包括账号密码登录、短信验证登录等不同的登录方式,使用svg-capter生成图形验证码,使用expressjwt实现登录token的生成及验证。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预…

CNAS软件测评实验室内审流程与技巧

软件检测实验室通过内部审核活动&#xff0c;可以验证内部体系的运行是否符合管理体系的要求&#xff0c;在内审时&#xff0c;需要审核宜检查管理体系是否满足 ISO/IEC17025 或 ISO/IEC17020、或其他相关准则文件的要求&#xff0c;即符合性检查。 还要检查组织的质量手册及相…

npm install 报错 gyp 解决方案

问题&#xff1a; 接手别人的项目&#xff0c;在安装项目依赖npm install时&#xff0c;一直提示 gyp相关的错误。 问题原因&#xff1a; 项目中依赖项"node-sass": "^4.14.1",与当前node.js版本不符合。 解决问题&#xff1a; 通过百度踩坑&#xff0c;…

nslookup提示-bash: nslookup: command not found

nslookup使用时&#xff0c;提示-bash: nslookup: command not found的错误。 yum install -y nslookup提示No package nslookup available.。 yum provides nslookup查看一下那个安装包提供nslookup命令。 yum install -y bind-utils安装bind-utils。 nslookup,然后输…

为什么同样是手机,你拍的照片没别人好看?避开4个常见摄影坑,秒变摄影师!

你有没有过这样的疑惑&#xff1a;为什么同一个场景&#xff0c;有的人可以用手机拍出大片感、电影感、史诗感&#xff0c;而你拍出来的照片却平平无奇&#xff0c;甚至有些毁人毁景&#xff1f; 如果说出片效果的差别是因为器材、手机参数一样导致的&#xff0c;那多少还可以…

数据结构--单链表的查找

数据结构–单链表的查找 均以带头结点链表为例 目标&#xff1a; GetElem(Li):按位查找操作。获取表L中第i个位置的元素的值。 LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。 按位查找 按位查找,返回第i 个元素&#xff08;带头结点) 代码实现 typ…

【算法题】动态规划基础阶段之斐波那契数列、青蛙跳台阶问题、连续子数组的最大和

动态规划基础阶段 前言一、斐波那契数列1.2、思路1.2、代码实现 二、青蛙跳台阶问题2.2、思路2.2、代码实现 三、连续子数组的最大和3.1、思路3.2、代码实现 总结 前言 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种解决多阶段决策过程最优化…

Unity编辑器开发——特性(常用特性、自定义特性)

特性在Unity开发中是非常好用的。 常用特性&#xff1a; 下面记录下我常用的C#预置的特性&#xff1a; 一、程序集级别 二、脚本级别 三、脚本成员级别 1.字段 (1)Int/Float (2)string (3)Enum (4)List (5)Range(滑动条&#xff0c;其实也是对Int/Float&#xff09; …