python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...

参数在python中总是通过赋值进行传递的。在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数。

这种默认的传递方式很简单

def f(a,b,c):

print(a,b,c)

f(1,2,3)

1 2 3

python中可以使用基于关键字的参数匹配形式。在调用函数的时候,能够更详尽的定义内容传递的位置。关键字参数允许通过变量名进行匹配,而不是通过位置。

def f(a,b,c):

print(a,b,c)

f(c=3,a=1,b=2)

1 2 3

我们可以看出,当关键字参数使用时参数从左至右的关系已不再重要了,因为参数是通过变量名进行传递的,而不是通过其位置。这种调用显得更文档化一些(例如使用一些名称更直观的参数名)。

甚至在一个调用中混合使用基于位置的参数和基于关键字的参数也可以。在这种情况下,所有基于位置的参数首先按照从左到右的顺序匹配头部的参数,之后再进行基于变量名进行关键字的匹配。

def f(a,b,c):

print(a,b,c)

f(1,c=3,b=2)

1 2 3

再来说说python中的默认参数形式。默认参数允许创建函数可选的参数,如果没有传入值的话,在函数运行前,参数就被赋予了默认值,还是看一个例子:

def f(a,b=2,c=3):

print(a,b,c)

f(1)

1 2 3

f(a=1)

1 2 3

看到这个例子中,我们必须为a提供值,无论是通过位置参数还是关键字参数来实现,然而,为b和c提供值是可选的。如果我们不给b和c传递值,它们会分别赋值为2和3。

那么按位置顺序,当给函数传递两个值的时候,只有c得到默认值,并且当有三个值传递时,不会使用默认值。

def f(a,b=2,c=3):

print(a,b,c)

f(1,4)

1 4 3

def f(a,b=2,c=3):

print(a,b,c)

f(1,4,8)

1 4 8

最后一种情况,是关键字和默认参数一起使用的情况。关键字参数允许我们跳过有默认值的参数,但是要记住的是,首先要完成通过位置进行匹配的参数。

def f(a,b=2,c=3):

print(a,b,c)

f(1,c=6)

1 2 6

很明显,a通过位置得到了1,c通过关键字得到了6,而跳过了b,b通过默认参数得到了2.

有时看到函数定义的参数中有*和**符号,表示什么意思?

这也是python中非常有特色的:当*和**符号出现在函数定义的参数中时,表示任意数目参数收集。

先说说*,他是用元组的形式收集不匹配的位置参数。当这个函数调用时,python将所有位置相关的参数收集到一个新的元组中,并将这个元组赋值给变量args。

def f(a,*args):

print(args)

f(1,2,3,4)

(2, 3, 4)

再说说**的特性,他只对关键字参数有效。在这种情况下,**允许将关键字参数转化为字典,你能够在之后使用键调用来进行步进或字典迭代

def f(**kargs):

print(kargs)

f(a=1,b=2)

{'b': 2, 'a': 1}

最后我们来概况一下最一般的形式。即在函数头部能混合一般参数、*参数以及**去实现更加灵活的调用方式。

def f(a, *pargs, **kargs):

print(a,pargs,kargs)

f(1,2,3,x=4,y=5)

1 (2, 3) {'x': 4, 'y': 5}

这个例子中,1按位置传给a,2和3收集到pargs位置的元组中,x和y放入kargs关键字词典中

上面是在函数定义的时候写的*和**形式,那反过来,如果*和**语法出现在函数调用中又会如何呢?他会解包参数的集合。

例如,我们在调用函数时能够使用*语法,在这种情况下,它与函数定义的意思相反,他会解包参数的集合,而不是创建参数的集合。例如我们可以通过一个元组给一个函数传递四个参数,并且让python将它们解包成不同的参数。

def func(a,b,c,d):

print(a,b,c,d)

args = (1,2,3,4)

func(*args)

1 2 3 4

相似的,在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。

def func(a,b,c,d):

print(a,b,c,d)

kargs = {'a':1, 'b':2, 'c':3, 'd':4}

func(**kargs)

1 2 3 4

当然这种形式也是可以混合的,从左到右要以位置参数、元组解包、关键字参数、字典解包的顺序来进行

def func(a,b,c,d,e,f):

print(a,b,c,d,e,f)

args = (2, 3)

kargs = {'d': 4, 'e': 5}

func(1, *args, f=6, **kargs)

1 2 3 4 5 6

说了这些基本的知识,我们来看看一个实际应用的例子

这种支持任意参数形式的方法的一个应用点,就是实现对其他函数进行灵活调用。因为参数列表可以通过元组、字典形式传入,所以他支持运行时构建参数列表,这对于测试和计时其他函数非常方便。在下面的代码中,我们通过传递任何发送进来的参数来支持具有任意参数的任意函数:

def tracer(func, *args, **kargs):

print('calling:', func.__name__)

return func(*args, **kargs)

def func(a,b,c,d):

return a+b+c+d

print(tracer(func,1,2,c=3,d=4))

calling: func

10

很明显,这里在定义tracer函数时应用了收集任意参数的方法,在其中调用func函数时又利用了解包参数的方法。

最后综合所学,我们举一个例子,来仿写一个函数模拟print的功能,他可以接收任意的位置参数,同时接收规定范围内的关键字参数,对多余的关键字参数会报错。

import sys

def print30(*args, **kargs):

sep = kargs.pop('sep', ' ')

end = kargs.pop('end', '\n')

file = kargs.pop('file', sys.stdout)

if kargs:

raise TypeError('extra keywords:{}'.format(kargs))

output = ''

first = True

for arg in args:

output += ('' if first else sep) + str(arg)

first = False

file.write(output + end)

print30('hello','world','healthy',sep='&')

hello&world&healthy

在这段程序中,有几个关键点值得我们注意

对kargs字典进行pop操作,弹出了指定的三个关键字sep、end、file后,如果字典里还有值,则证明是多余的关键字,程序需要报错。第二在pop的时候,如果这三个参数如果在调用函数的时候指定了值,就用指定的值,如果没有指定值则用程序中指定的默认值。

从下面的例子就可以看出,使用多余的关键字,程序会报错。

print30('hello','world','healthy',sep='&',ppp='33',hhh='44')

Traceback (most recent call last):

File "E:/12homework/12homework.py", line 15, in

print30('hello','world','healthy',sep='&',ppp='33',hhh='44')

File "E:/12homework/12homework.py", line 7, in print30

raise TypeError('extra keywords:{}'.format(kargs))

TypeError: extra keywords:{'ppp': '33', 'hhh': '44'}

关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.comv2-d6447864fbc755396dbd5f78e0a85fd6_180x120.jpg

本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。

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

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

相关文章

word List 24

word List 24 如果存在什么问题,欢迎批评指正!谢谢!

[USACO1.5]八皇后 Checker Challenge

给定一个 NN 的棋盘,请你在上面放置 N 个棋子,要求满足: 每行每列都恰好有一个棋子 每条对角线上都最多只能有一个棋子 上图给出了当 N6 时的一种解决方案,该方案可用序列 2 4 6 1 3 5 来描述,该序列按顺序给出了从…

python窗口显示表格_pyqt 调用tablewidget窗口时无法显示窗口内容

请教一下大家,想实现在主窗口中点击按钮调用一个新窗口,这个窗口是tablewidget,目前可以实现弹出窗口,但是无法显示表格,只有一个空白窗口。实在找不到原因了,还请大家指点。 这是主窗口代码 # -*- coding:…

程序员过关斩将--redis做消息队列,香吗?

菜菜哥,我刚做完了一个订单系统,感觉很简单呀说说看,大量的订单状态怎么处理的?我设计的时候可是考虑了这一点,所以用了异步处理,采用了MQ那用的什么MQ呢,透露一下呗我用的redis做的MQ&#xff…

word List25

word List25 如果存在什么问题,欢迎批评指正!谢谢!

c++ 多核cpu序列号_关于 CPU 的一些基本知识总结

优质文章,及时送达作者 | 骏马金龙链接 | cnblogs.com/f-ck-need-u/p/11141636.htm关于CPU和程序的执行CPU是计算机的大脑。1、程序的运行过程,实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后,C…

.NET Core开发实战(第4课:Startup:掌握ASP.NET Core的启动过程)--学习笔记

04 | Startup:掌握ASP.NET Core的启动过程新建一个 ASP.NET Core Web 应用程序选择 APIpublic class Program {public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) >…

C语言---二进制和文本文件的备份

C语言—二进制和文本文件的备份 学习参考&#xff1a; https://www.cnblogs.com/jackytang/p/9011127.html 代码&#xff1a; #include <stdio.h> #include <stdlib.h> int copyFile(char *fileRead, char *fileWrite); int main() {char fileRead[100]; // 要…

聊聊统一身份认证服务

源宝导读&#xff1a;当企业的应用系统逐渐增多后&#xff0c;每个系统单独管理各自的用户数据容易行成信息孤岛&#xff0c;分散的用户管理模式阻碍了企业应用向平台化演进。本文将介绍构建统一身份认证的技术方案和思路。一、背景当企业的应用系统逐渐增多后&#xff0c;每个…

Word List 26

Word List 26 如果存在什么问题&#xff0c;欢迎批评指正!谢谢&#xff01;

[蓝桥杯2015决赛]五星填数-枚举+数论

解题思路&#xff1a; 对于一种符合题意的情况&#xff0c;旋转和对称之后结果也是一样&#xff0c;所以我们要除去旋转(/5)和对称(/2)的情况&#xff0c;所以结果要除以10 代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std;…

word List27

word List27 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

如何看待程序媛们的职场焦虑和未来职业规划?

本文公众号平台首发于【DotNET技术圈】&#xff0c;来自邹溪源一 引子昨天&#xff0c;有一位通过我们长沙.NET技术社区公众号【DotNET技术圈】加我的好友的姑娘问了一个关于职业规划的问题&#xff1a;“在你的身边有没有认识的女程序员&#xff0c;可以告诉一下我们她们的职业…

[蓝桥杯2016初赛]搭积木-枚举,next_permutation

代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std;int a[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};bool check() {if (a[0] > a[1] && a[0] > a[2] &&a[1] > a[3] && a[1] > a[4] &&a…

word List28

word List28 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

target not created怎么解决_怎么才能最短时、高效、踏实地学习 Python(附链接)...

作者&#xff1a;九章算法来源&#xff1a;数据Seminar本文约2400字&#xff0c;建议阅读5分钟本文教你高效学习全球主流编程语言Python。标签&#xff1a;PythonPython是当前全球的主流编程语言之一&#xff0c;基于其简洁的语法结构&#xff0c;可以让开发者用更少的代码完成…

【5min+】 巨大的争议?C# 8 中的接口

介绍【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面&#xff0c;比如C#的小细节&#xff0c;AspnetCore&#xff0c;微服务中的.net知识等等。5min不是超过5分钟的意思&#xff0c;""是知识…

[蓝桥杯2016初赛]寒假作业-next_permutation枚举

暴搜代码&#xff08;耗时较长&#xff0c;要90s左右&#xff09;如下&#xff1a; #include <iostream> using namespace std; const int N 15; int a[N]; bool st[N]; int cnt;void dfs(int u) {if (u 13) {if (a[1] a[2] a[3] && a[4] - a[5] a[6] &…

word List29

word List29 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

.NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

05 | 依赖注入&#xff1a;良好架构的起点为什么要使用依赖注入框架借助依赖注入框架&#xff0c;我们可以轻松管理类之间的依赖&#xff0c;帮助我们在构建应用时遵循设计原则&#xff0c;确保代码的可维护性和可扩展性ASP.NET Core 的整个架构中&#xff0c;依赖注入框架提供…