Python一个return还你仨结果_打包拆包全靠星号

发布时间:2026/9/2 21:21:53
Python一个return还你仨结果_打包拆包全靠星号 学函数之际, 你是否始终觉得后面仅仅能跟一个值呢? 并非如此。它极为慷慨, 一回能够还给你好些个结果。不仅是这样, 它还配备了一对星号兄弟, 专门用以负责「打包」以及「拆包」, 使得你传递参数接收参数仿若拆快递那般畅快。今儿个就把多返回值, 以及*args, 还有**的打包解包一次性讲解透彻, 看完之后你就能够弄明白: 原来星号才是其中的隐形魔法开关。一、 一次能返回多个值那就先去瞧一瞧最为基础的多返回值情况。来撰写一个函数, 此函数要接收 x 以及 y, 将它们二者的和、差一同进行返回。def calculate(x, y): res1 x y res2 x - y return res1, res2 result calculate(30, 10) print(result) # (40, 20)关注瞧, 随后借助逗号将两组数值连接起来便可。所呈现的运行结果究竟是什么呢? 打印出来呈现为 (40, 20) , 此乃一个元组。详细来讲, 你尽管书写了两个返回的值, 那么其具体的操作方式是, 将这两个事物暗暗隐匿地包纳进一个元组之中, 之后把整个元组传递交付给你。这同样也阐释说明了为何使用一个变量便能够承接住——因为你所接到的实际上是那单独的一个元组。抓关键: 无论, 跟几个数值, 两个、三个、四个、五个, 统统给你组合成一个元组。写得越多, 组合得越全, 却始终是一个整体。二、自己包元组也行但可能挨警告会有同学提出这样的疑问: 那么我可不可以依靠自身的力量, 预先进行包裹好之后再呈现返回的状态呢就如同自己去书写一个括号一样:def calculate(x, y): res1 x y res2 x - y return (res1, res2) # 手动包元组存在能够跑的情况, 其最终呈现的结果是相同的。然而, 会给你标记为黄色: 朋友, 你所写的这两个括号是多余的。即便你不进行包裹, 原本也会有人帮你完成包裹的活计, 又何苦做这种多余的举动呢。再比如你就不喜欢元组非要列表——也行自己写个方括号def calculate(x, y): res1 x y res2 x - y return [res1, res2] # 手动包列表 result calculate(30, 10) print(result) # [40, 20]此刻到手的便是列表了。究竟是元组还是列表, 完全由你自行决定。然而通常情形下, 众人还是偏好偷懒, 什么都不书写, 径直采用res1, res2, 从而让其默认被包成元组, 如此最为简便省力。三、拆着接一个变量接一个值如今问题蓦地出现了哈, 返回的呈现出的是一个元组, 我期望着能够分别去获取到40以及20, 难道说凭借这样的方式去取出吗? 并非如此, 存在着更为优美典雅的写代码方式 , 那便是采纳拆包之后分开来接收:r1, r2 calculate(30, 10) print(r1) # 40 print(r2) # 20在左边写下两个变量, 于右边返回两个值, 使其能自动依照顺序对应入座, 即: r1 拿一个数值为 40 的量, r2 拿一个数值为 20 的量。这等同于 协助你把那个元组进行拆解, 然后逐个放置进左边的变量当中有标点吗。同理返回列表也能这么拆r1, r2 [40, 20] print(r1, r2) # 40 20简要概括多返回值表述为, 在后跟着多个值的情况下, 会自动打包成为元组而在接收时写上多个变量, 就会自动拆包让各变量拿到一份啦 一包跟一拆, 简直天生一对。四、打包接收参数*args 和 **“多返回值”呈现的是“返回时打包”这种情况, 随后要关注的是“接收时打包”这种情形。这一内容你先前或许曾见到过, 然而却未曾细致地进行过归纳总结。首先要记住两句话:来测一下写个展示信息的函数def show_info(*args, **kwargs): print(args) # 位置参数打包成的元组 print(kwargs) # 关键字参数打包成的字典 show_info(10, 20, 30, name张三, age18, gender男)运行结果(10, 20, 30) {name: 张三, age: 18, gender: 男}你所传递的那三个位置参数, 分别是 10、20、30, 它们全都被 *args 收纳进了一个元组之中你所传递的那三个关键字参数, 全都被 ** 收集进了一个字典里面。这不便是所谓的「打包」么? 于函数作定义之际, 写上了 * 跟 ** , 无论外面传递进来多少内容, 到了其内部之时, 首先会进行统一操作, 把它们收纳至一个容器当中。两个坑提前给你排掉1. 当在函数体之内打印之际, 切莫书写星号, 要直接书写 args 、, * 和 **不过是在定义之时的一种固定的写法呈现形式, 并非属于变量名的其中一部分内容。2. 星号后头跟着的那个名字, 并非一定得称作 args, 就算称作 *qwe 或者 **asd 同样是合乎规范的。仅仅是大家按照习惯都叫 args, 还有 , 一旦瞧见星号你便会明白其中情况, 切勿被别的名字给迷惑住哟。五、解包传递参数*nums 和 **只要存在打包, 那就必然会有拆包。刚刚所讲述的全部都是「数据以分散的形式出现, 在函数内部被收纳入容器之中」。此时此刻情形相反——数据已然被放置于容器之内, 然而函数需要的却是分散开来的, 这种状况该如何处理呢?比如别人给了你一个元组里面正好是三个数字nums (10, 20, 30) # 别人给我的还有一个字典里面正好是人的信息person {name: 张三, age: 18, gender: 男}而函数是要分开接收的def show_info(n1, n2, n3, name, age, gender): print(n1, n2, n3) print(name, age, gender)如果硬传你得这么写又长又啰嗦show_info(nums[0], nums[1], nums[2], person[name], person[age], person[gender])而用解包一行搞定show_info(*nums, **person)*nums 的意思是: 将元组 nums进行拆分, 逐个作为位置参数传进去, 可视为等同于10, 20, 30**的意思是: 把字典拆开, 将其每一项当作关键字参数传进去, 等同于 age18, 男。运行结果10 20 30 张三 18 男对称记忆法当进行函数定义之时, 写下 *args , 这意味着那些散着来的参数, 会被收进元组之中, 也就是打包接收。当进行函数调用之际, 书写 *nums , 其代表着被安置于元组当中的数据, 要将这些数据逐个拆开并传递进去, 也就是所谓的解包传递。一个于表示“收”的那个方向进行打包操作, 一个在意味着“传”的那个方向开展拆包行为, 恰好截然相反, 恰好相互有弥补作用。六、打包 解包组合拳打起来最具有趣味的情况出现了: 将打包以及解包同时予以运用是可行的。在函数进行定义之际通过 *, ** 来以打包的方式予以接收, 而在调用之时借助 *, ** 来以解包的形式去进行传递。这就是:将一方拆开之后传递进去, 接着在另一方又以进行收集会来, 让其再次转化汇聚一处!def show_info(*args, **kwargs): print(args) # (10, 20, 30) print(kwargs) # {name: 张三, age: 18, gender: 男} nums (10, 20, 30) person {name: 张三, age: 18, gender: 男} show_info(*nums, **person)运行结果(10, 20, 30) {name: 张三, age: 18, gender: 男}看见没, 调用的时候, 那种带星号的nums会将元组拆分成一个个的位置参数, 然后把这些位置参数投进去, 而在函数里面, 带星号的args又会把这些位置参数聚集成为一个元组带双星号的则会拆开字典, 之后, 再把它们包装成字典。这么转一圈下来, 数据换了个容器转了个来回, 一点都没丢失。这样的组合于真实项目当中十分常用, 函数签名被写成 *args, ** 的形式的时候, 拥有着能够接收任何内容的能力, 将现成的元组以及字典直接通过 *、** 进行拆解以后, 便具备了能够传递任何内容的特性, 并且在前后端进行传参时, 于装饰器进行封装过程中, 以及框架底层部分, 全都采用的是此种方式。七、一张表记住所有星号用法位置写法作用结果函数定义*args打包所有位置参数元组函数定义**打包所有关键字参数字典函数调用*nums拆开元组/列表当位置参数传逐个传入函数调用**拆开字典当关键字参数传键值对传入又给你送上一句顺口溜是, 定义带着星号意味着是收纳, 使用带有星号来调用那可就是拆箱, 单个星号管控的是位置哦, 两个星号管理的却是关键字嗯。在今天此为止, 多返回值借助逗号用于打包这件事, 接收是靠多变量去拆包的参数打包凭借定义时的星号来达成, 参数拆包倚仗调用时的星号来实现。东西并非难以明白可得, 但全部都是高频使用的情形, 在代码以内见过了好一会, 自然而然就会熟练的。把这一篇进行收藏, 当写函数没有思路的时候翻出来查阅上一眼, 比去翻看文档要快速得多了。

相关新闻