*args and **kwargs
首先要知道, 并不是必须写成
*args和**kwargs。 只有变量前面的*(星号)才是必须的. 你也可以写成*var和**vars. 而写成*args和**kwargs只是一个通俗的命名约定。
*args 的用法
*args 和 **kwargs 主要用于函数定义。 你可以将不定数量的参数传递给一个函数。这里的不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。 *args 是用来发送一个非键值对的可变数量的参数列表给一个函数.
先看一个例子:
>>> def test_args(f_args,*argv):
... print("first normal args:",f_args)
... for arg in argv:
... print("another arg through *argv",arg)
...
>>> test_args('yasoob','python','eggs','test')
first normal args: yasoob
another arg through *argv python
another arg through *argv eggs
another arg through *argv test
>>>
再看一个例子:
>>> def one(*args):
... print(args) #1
...
>>> one()
()
>>> one(1,2,3)
(1, 2, 3)
>>> def two(x,y,*args):
... print(x,y,args) #2
...
>>> two('a','b','c')
a b ('c',)
>>>
第一个函数one只是简单的将任何(如果有)传递给它的位置参数打印出来。正如你在#1处见到的,在函数内部我们只是引用了args变量——*args只是表明在函数定义中位置参数应该保存在变量args中。Python也允许我们指定一些变量并捕获到任何在args变量里的其它参数,正如#2处所示,args为可迭代对象,可理解为tuple(元组)。
谈起tuple,看下python多线程参数用法:
'''
回零独立子线程
'''
def ThreadGoHomeFunction(self,axis):
try:
ThreadGoHomeFunction = threading.Thread(target=self.GoHomeFunction,args=(axis,))
ThreadGoHomeFunction.start()
except:
self.ShowErroeMessage("ThreadGoHomeFunction except fail")
return -1
在调用一个函数时带有一个以*为前导的变量作为参数表示这个变量(可迭代对象)内容需要被解析然后用作位置参数。再一次以实例来说明:
>>> def add(x,y):
... return x+y
...
>>> lst = [1,2]
>>> add(lst[0],lst[1]) #1
3
>>> add(*lst) #2
3
>>>
#1处的代码抽取出了和#2处相同的参数——在#2处Python为我们自动解析了参数,我们也可以像在#1处一样自己解析出来。*args既表示当调用函数是从一个iterable抽取位置参数,也表示当定义一个函数是接受任何额外的位置变量。
**kwargs 的用法
**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。与*表示iterables和位置参数一样,**表示dictionaries & key/value对
>>> def greet_me(**kwargs):
... for key,value in kwargs.items():
... print("{0} == {1}".format(key,value))
...
>>> greet_me(name="YangARTuan")
name == YangARTuan
>>>
>>> def foo(**kwargs):
... print(kwargs)
...
>>> foo()
{}
>>> foo(x=1,y=2)
{'x': 1, 'y': 2}
>>>
当我们定义一个函数时我们可以用**kwargs表明所有未捕获的keyword变量应该被存储在一个名为kwargs的字典中。
>>> dct = {'x': 1, 'y': 2}
>>> def bar(x, y):
... rturn x + y
>>> bar(**dct)
3
使用 *args 和 **kwargs 来调用函数
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5 # 现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
标准参数与*args、**kwargs在使用时的顺序
那么如果你想在函数里同时使用所有这三种参数, 顺序是这样的:
some_func(fargs, *args, **kwargs)
*args and **kwargs的更多相关文章
- How to use *args and **kwargs in Python
Or, How to use variable length argument lists in Python. The special syntax, *args and **kwargs in f ...
- python中应用*args 与**kwargs
这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...
- Python之路 day3 函数定义 *args及**kwargs
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...
- [翻译]PYTHON中如何使用*ARGS和**KWARGS
[翻译]Python中如何使用*args和**kwargs 函数定义 函数调用 不知道有没有人翻译了,看到了,很短,顺手一翻 原文地址 入口 或者可以叫做,在Python中如何使用可变长参数列表 函数 ...
- python 中*args 和 **kwargs
简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...
- python 的 *args 和 **kwargs
Python支持可变参数,通过*args和**kwargs来指定,示例如下: def test_kwargs(first, *args, **kwargs): print 'Required a ...
- 理解 Python 中的 *args 和 **kwargs
Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...
- Python中*args 和**kwargs的用法
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...
- Python中的*args和**kwargs
原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...
- python 基础——*args和**kwargs
*args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. def func(one, *args, **kwargs): print type(one) ...
随机推荐
- centos7 redis伪集群安装
安装gcc: yum install gcc -y 上传redis软件包到 /home下 解压: tar xf redis-3.2.11.tar.gz 进入 redis 目录 : cd r ...
- 一起做RGB-D SLAM (6)
第六讲 图优化工具g2o的入门 2016.11 更新 把原文的SIFT替换成了ORB,这样你可以在没有nonfree模块下使用本程序了. OpenCV可以使用 apt-get install libo ...
- Myeclipse的webservice本地监听设置(一个简陋的代理)
(1) 首先打开Myeclipse,然后选择window--->show view ---->other (2)搜索tcp,然后找到如图的样式 (3)选中,点击ok (4)弹出下图界面 ( ...
- 使用Nmap攻击靶机和使用Wireshark进行嗅探、分析
使用Nmap攻击靶机和使用Wireshark进行嗅探.分析 在上一次课中已经对Nmap的使用.原理已经做了很多学习,这次的课更多地针对Wireshark进行学习和使用. 使用192.168.200.1 ...
- loadrunner - 安装与破解
最近准备学习LR,借助这个平台,将自己的学习经历记录下来,当然很多都不是原创,都是遇到问题时各种百度,然后梳理下知识是为了避免以后遇到同样的错误时,能回过头来参考参考. 下面的是转载某位大神的博客,尊 ...
- POJ1751 Highways 2017-04-14 15:46 70人阅读 评论(0) 收藏
Highways Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14819 Accepted: 4278 Speci ...
- Provider 模式
Provider 模式:为一个API进行定义和实现的分离. 常见场景:DBPrider切换,第3方集成API切换 以发邮件为例: Email Provider Config: public abstr ...
- mysql my.cnf优化
[mysqld] lower_case_table_names = 1sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION skip_name_r ...
- s21day25 python笔记
s21day25 python笔记 正则表达式 1.定义 定义:正则表达式是一种规则匹配字符串的规则 re模块本身只是用来操作正则表达式的,和正则本身没关系 为什么要有正则表达式? 匹配字符串 一个人 ...
- tomcat7-maven-plugin 端口
不知道有没有人像我这样,在pom配置了下面这段之后, <plugins> <plugin> <groupId>org.apache.tomcat.maven< ...