*args, **kwargs的用法

python 中参数*args, **kwargs

def foo(*args, **kwargs):
print 'args = ', args
print 'kwargs = ', kwargs
print '---------------------------------------'if __name__ == '__main__':
foo(1,2,3,4)
foo(a=1,b=2,c=3)
foo(1,2,3,4, a=1,b=2,c=3)
foo('a', 1, None, a=1, b='2', c=3)输出结果如下:args =  (1, 2, 3, 4) 
kwargs =  {} args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'}

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个 dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

-------------------------------------------------------------------------------------------

class testClass:
def __init__(self, **kwargs):
self.kwargs = kwargs
def print_kwargs(self):
i = 1
for key in self.kwargs.keys():
print "Kwarg %s (%s: %s)" % (i, key, self.kwargs[key])
i += 1
tc = testClass(hello=True, anumber=5, thisisgreat='Yes it is!')
tc.print_kwargs()

--------------------------------------------------------------------------------------------

Using **kwargs and default values is easy. Sometimes, however, you shouldn't be using **kwargs in the first place.

In this case, we're not really making best use of **kwargs.

class ExampleClass( object ):def __init__(self, **kwargs):self.val = kwargs.get('val',"default1")self.val2 = kwargs.get('val2',"default2")The above is a "why bother?" declaration. It is the same asclass ExampleClass( object ):def __init__(self, val="default1", val2="default2"):self.val = valself.val2 = val2

When you're using **kwargs, you mean that a keyword is not just optional, but conditional. There are more complex rules than simple default values.

When you're using **kwargs, you usually mean something more like the following, where simple defaults don't apply.

class ExampleClass( object ):def __init__(self, **kwargs):self.val = "default1"self.val2 = "default2"if "val" in kwargs:self.val = kwargs["val"]self.val2 = 2*self.valelif "val2" in kwargs:self.val2 = kwargs["val2"]self.val = self.val2 / 2else:raise TypeError( "must provide val= or val2= parameter values" )

 

 

 

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

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

相关文章

一个 js 中值传递和引用传递的坑。

今天在调试代码时遇到一个问题,刚开始想不明白,然后分析了一下后,才知道其中的问题,这也是一个基础的问题,(所以基础是很重要的) 代码如下: var a 3; a a * 2; console.log(a); //…

linux运维适合女生么,女生真的不适合做IT行业吗?Linux运维适合女生学习吗?

在很多人的脑海中都是女生不适合做IT,IT行业不适合女性。可能传统的思想中,女生只适合做文职工作,比如说幼师、公务员、会计等,就因为这样的思想也让IT行业男女出现了失衡的情况,那么作为女生真的不适合做IT行业吗?Li…

关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处

类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler。对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作。 尽管Message的构造器是公开的,但是获取Message对象的最好方法是调用Messag…

python编程中的if __name__ == 'main': 的作用和原理

大多数编排得好一点的脚本或者程序里面都有这段if __name__ main: ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享。 1、这段代码的功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行&…

vim 配置

vim包下载 https://github.com/spf13/spf13-vim 安装教程 http://blog.csdn.net/u011729865/article/details/49210841 https://www.zhihu.com/question/20151659转载于:https://www.cnblogs.com/aituming/p/6013279.html

自己简单封装的自己项目需要的http请求

2019独角兽企业重金招聘Python工程师标准>>> package www.tydic.com.util;import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Http…

excel导入linux乱码怎么解决方法,,请大家都来看下,Excel导入有乱码?原因出在哪里?应该怎么解决?...

老师,感谢你再次的回答。我按照您的方法操作,转换utf-8另外为CSV格式,然后这个CSV格式在Notepad 编辑器中打开后,没有乱码,μ 符号(希腊字符)正确显示。我想导入文件已经准备完毕,当我导入的时候&#xff0…

Oracle 正则表达式

一. 正则表达式简介: 正则表达式,就是以某种模式来匹配一类字符串。一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。例如,判断匹配性,进行字符串的重新组合等。正则表达式提供了字符串处理的快捷方式。…

python编程中的if __name__ == 'main': 的作用和原理[2]

这个问题来自于知乎用户的提问,当时看到这个问题,我只是做了下简单的回答。后来我发现,对于很多人来说,更准确的说应该是大部分的 Python 初学者,对这个问题理解的不是很深刻。所以这里我来做下总结,并试图…

Java基础中按值传递和引用传递详解

下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下: [java] view plaincopy public cla…

【Foreign】采蘑菇 [点分治]

采蘑菇 Time Limit: 20 Sec Memory Limit: 256 MBDescription Input Output Sample Input 51 2 3 2 31 21 32 42 5Sample Output 10912911HINT Main idea 询问从以每个点为起始点时,各条路径上的颜色种类的和。 Solution 我们看到题目,立马想到了O(n^2)…

c语言迷宫游戏怎么存放坐标,求解迷宫问题(c语言,很详细哦

《求解迷宫问题(c语言,很详细哦》由会员分享,可在线阅读,更多相关《求解迷宫问题(c语言,很详细哦(5页珍藏版)》请在人人文库网上搜索。1、求迷宫问题就是求出从入口到出口的路径。在求解时 , 通常用的是 “穷举求解”的方法 ,即从入口出发 ,顺某一方向向…

模块概述

概述 目前代码比较少,写在一个文件中还体现不出什么缺点,但是随着代码量越来越多, 代码就越来越难以维护 为了解决难以维护的问题,我们把很多相似功能的函数分组,分别放到不同的文件中取。这样每个文件所包含的内容相…

【MySQL】PREPARE 的应用

简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用…

简历要求中“ 扎实的JAVA基础”的学习方法

最近在头条看到一篇关于Java基础学习的文章,感觉写的很不错,分享一下,希望对大家有帮助 什么东西算作Java基础?学到什么程度才算扎实? 这些问题的答案,LZ已经用文言文告诉你了,咳咳,…

C++11 tuple的使用

多少分转载于:https://www.cnblogs.com/DswCnblog/p/6524832.html

c语言程序设计贪吃蛇需求分析,C语言编程新手入门基础进阶学习!贪吃蛇小游戏演示和说明...

C语言是面向过程的,而C++是面向对象的设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。游戏开始后,会在中间位置出现一条只有三个节点的…

解决bash: mysql: command not found 的方法【linux mysql命令 】

linux下,在mysql正常运行的情况下,输入mysql提示: mysql command not found 遇上-bash: mysql: command not found的情况别着急,这个是因为/usr/local/bin目录下缺失mysql导致,只需要以下方法即可以解决: …

堆和栈的区别(经典干货)

一、预备知识—程序的内存分配 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于 数据结构 中的栈。 2、堆区(he…

Strus2中关于ValueStack详解

什么是ValueStack 它是一个接口com.opensymphony.xwork2.util.ValueStack。我们使用它是将其做为一个容器,用于携带action数据到页面。在页面上通过ognl表达式获取数据。 valueStack主要是将action数据携带到页面上,通过ognl获取数据 1.ValueStack有一个…