Python中的*arg和**kwarg
一个简单的函数
首先我们可以定一个简单的函数, 函数内部只考虑required_arg
这一个形参(位置参数)
def exmaple(required_arg):
print required_arg
exmaple("Hello, World!")
>> Hello, World!
那么,如果我们调用函数式传入了不止一个位置参数会出现什么情况?当然是会报错!
exmaple("Hello, World!", "another string")
>> TypeError: exmaple() takes exactly 1 argument (2 given)
定义函数时,使用*arg和**kwarg
*arg和**kwarg 可以帮助我们处理上面这种情况,允许我们在调用函数的时候传入多个实参
def exmaple2(required_arg, *arg, **kwarg):
if arg:
print "arg: ", arg
if kwarg:
print "kwarg: ", kwarg
exmaple2("Hi", 1, 2, 3, keyword1 = "bar", keyword2 = "foo")
>> arg: (1, 2, 3)
>> kwarg: {'keyword2': 'foo', 'keyword1': 'bar'}
从上面的例子可以看到,当我传入了更多实参的时候
- *arg会把多出来的位置参数转化为
tuple
- **kwarg会把关键字参数转化为
dict
再举个例子,一个不设定参数个数的加法函数
def sum(*arg):
res = 0
for e in arg:
res += e
return res
print sum(1, 2, 3, 4)
print sum(1, 1)
>> 10
>> 2
当然,如果想控制关键字参数,可以单独使用一个*,作为特殊分隔符号。限于Python 3
,下面例子中限定了只能有两个关键字参数,而且参数名为keyword1
和keyword2
def person(required_arg, *, keyword1, keyword2):
print(required_arg, keyword1, keyword2)
person("Hi", keyword1="bar", keyword2="foo")
>> Hi bar foo
如果不传入参数名keyword1
和keyword2
会报错,因为都会看做位置参数!
person("Hi", "bar", "foo")
>> TypeError: person() takes 1 positional argument but 3 were given
调用函数时使用*arg和**kwarg
直接上例子,跟上面的情况十分类似。反向思维。
def sum(a, b, c):
return a + b + c
a = [1, 2, 3]
# the * unpack list a
print sum(*a)
>> 6
def sum(a, b, c):
return a + b + c
a = {'a': 1, 'b': 2, 'c': 3}
# the ** unpack dict a
print sum(**a)
>> 6
Python中的*arg和**kwarg的更多相关文章
- python中的*arg和**kwargs
arg对应多出来的位置参数,把它们解析成tuple;kwargs把关键字参数解析成dict. def example(pram): print(pram) def example2(param, *a ...
- Python中的*args和**kwarg
可变参数 *args 允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple, 而 关键字参数 **kw 允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为 ...
- python 中为什么不需要重载 参数*arg和**args
函数重载主要是为了解决两个问题. (1)可变参数类型. (2) 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两 ...
- 谈谈Python中的decorator装饰器,如何更优雅的重用代码
众所周知,Python本身有很多优雅的语法,让你能用一行代码写出其他语言很多行代码才能做的事情,比如: 最常用的迭代(eg: for i in range(1,10)), 列表生成式(eg: [ x* ...
- 『Python题库 - 简答题』 Python中的基本概念 (121道)
## 『Python题库 - 简答题』 Python中的基本概念 1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变 ...
- decorator在Python中的作用
decorator(装饰器)在python中作用,可以起到代码复用,也可以起到AOP(面向横切面)的作用. 另外很重要的一点应该就是function在python的世界中是作为一等公民存在的. 在py ...
- python中*args, **kwargs理解
先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...
- python 中的 *args 和 **kwargs
在阅读Python代码时,经常会看到如下函数的定义: def fun(*args, **kwargs): 很多同学可能会对此感到困惑,这个 * args和 **kwargs是什么东西.为啥会在源码中应 ...
- python中的参数问题
python中的有默认参数和可变参数之分 默认参数arg 可变参数args, kargs 默认参数arg就是调用指定参数 可变参数*arg调用时传入的的参数会被python自动包装为列表 可变参数ka ...
随机推荐
- JavaScript--数组常用方法总结
JavaScript--数组常用方法总结 测试模板: var arr = ["a", "b", "c", "d", &q ...
- 18.3.1获得Class对象
package d18_3_1; /** * Java中的java.lang.Class,简单理解就是为每个java对象的类型标识的类, * 虚拟机使用运行时类型信息选择正确的执行方法,用来保存这些运 ...
- 转 PHP文件上传$_FILES数组各键值含义说明
文件上传的html表单: <form enctype="multipart/form-data" action="" method="POST& ...
- Log4net系列一:Log4net搭建之文本格式输出
Log4net简介 前言 项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多 ...
- asp.net MVC 错误信息“没有为该对象定义无参数的构造函数”请求各位大神帮忙!
在做一个登录的功能,没有用MVC自己生成的identity代码,仿照别人的代码写出了以后出现错误. 错误信息如下: 代码如下: 求各位asp.net大神支招,网上找了资料最终也没解决这个问题.
- JavaWeb ,EL,
WEB 概述: java web 是用java 技术来解决相关web 互联网领域的技术总和 . web 可分为 web服务器和web客户端(浏览器) web 的资源分类: 静态资源: HTM ...
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...
- RPC(Remote Procedure Call Protocol)远程过程调用协议
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
- spring 常见的注解
spring中的注解都必须在配置文件中进行如下的配置: <context:component-scan base-package="com.shanjin.oxm.service.im ...
- SAP CRM调查问卷的评分和图表显示功能介绍
SAP CRM里我们使用事务码CRM_SURVEY_SUITE创建一个调查问卷(Survey): 其中调查问卷的问题和答案均可分配权值(Rate),最后该问卷总的分数等于每个问题的权值乘以客户选择答案 ...