所属网站分类: python基础 > 函数


作者:慧雅

链接: http://www.pythonheidong.com/blog/article/18/

来源:python黑洞网 www.pythonheidong.com

1. *args和** kwargs

我已经看到大多数新的python程序员很难搞清楚* args和** kwargs魔术变量的用法。那他们是什么?首先让我告诉你,没有必要写* args或** kwargs。只有*(星号)是必要的。你也可以写* var和** vars。写* args和** kwargs只是一个惯例。所以现在让我们先来看看* args。

1.1 * args的用法

* args和** kwargs主要用于函数定义。* args和** kwargs允许您将可变数量的参数传递给函数。这里的变量意味着您事先不知道用户可以向您的函数传递多少个参数,因此在这种情况下您使用这两个关键字。

def test_var_args(f_arg, *argv):
    print("first normal arg:", f_arg)
    for arg in argv:
        print("another arg through *argv:", arg)

test_var_args('yasoob', 'python', 'eggs', 'test')

这会产生以下结果:

first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

那么现在让我们谈谈** kwargs

1.2 ** kwargs的用法

** kwargs允许您将keyworded可变长度的参数传递给函数。如果要在函数中处理命名参数,则应使用** kwargs 。这是一个让你开始使用它的例子:

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} = {1}".format(key, value))

>>> greet_me(name="yasoob")
name = yasoob

所以你可以看到我们如何处理函数中的keyworded参数列表。这只是** kwargs的基础,你可以看到它是多么有用。现在让我们谈谈如何使用* args和** kwargs来调用带有参数列表或字典的函数。

1.3 使用* args和** kwargs来调用函数

所以在这里我们将看到如何使用* args和** kwargs调用函数。只要考虑一下你有这个小功能:

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

现在你可以使用* args或** kwargs将参数传递给这个小函数。这是怎么做的:

# first with *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **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)

1.4 什么时候使用它们?

这实际上取决于您的要求。最常见的用例是制作函数装饰器(在另一章中讨论)。此外,它也可以用于猴子修补。Monkey修补意味着在运行时修改一些代码。假设您有一个带有函数的类,该函数get_info调用API并返回响应数据。如果我们想测试它,我们可以用一些测试数据替换API调用。例如:

import someclass

def get_info(self, *args):
    return "Test data"

someclass.get_info = get_info

我相信你也可以考虑其他一些用例。

python * args和** kwargs的用法的更多相关文章

  1. Python中 * 与 **, *args 与 **kwargs的用法

    * 用于传递位置参数(positional argument) ** 用于传递关键字参数(keyword argument) 首先,先通过一个简单的例子来介绍 * 的用法: def add_funct ...

  2. Python中*args 和**kwargs的用法

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...

  3. Python *args 和 **kwargs用法

    *args的参数形式把剩下的没有关键字的参数收起来形成一个tuple,*kwargs把有关键字的收起来做成一个字典 def this_fun(a,b,*args,**kwargs): print a ...

  4. 【Python】Python中*args 和**kwargs的用法

    好久没有学习Python了,应为工作的需要,再次拾起python,唤起记忆. 当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. 还是 ...

  5. python 可变参数函数定义* args和**kwargs的用法

    python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法.其中,*args是可变的positional arguments列表,**kwargs是 ...

  6. python的*args和**kwargs基础用法

    *args表示任何多个无名参数,它是一个tuple **kwargs:传入的字典,就如:a=1,传入键值,默认就传入到**kwargs中,如下面代码: class FOO: def __init__( ...

  7. python/*args和**kwargs

    *args和**kwargs #coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值 ...

  8. python *args,**kwargs参数

    实际上,关键的是*和** 我们以三个例子来解释: 普通的使用参数: def test1(arg): print(arg) test1("a") 输出: a *是将剩下的参数用元祖表 ...

  9. python:*args和**kwargs的用法

    1.*args用来将参数打包成tuple给函数体调用 代码: # *args用来将参数打包成tuple给函数体调用 def func(*args): print(args,type(args)) fu ...

随机推荐

  1. 三,JVM 自带命令行工具之JMap

    jmap:java内存映像工具 jmap(Memory Map for java ) 命令用于生成堆转储快照(一般被称为headdump 或dump文件) jmap命令格式:jmap [option ...

  2. Java获取系统信息(用户目录,临时目录等)

    java.version Java运行时环境版本 java.vendor Java运行时环境供应商 java.vendor.url Java供应商的 URL java.home Java安装目录 ja ...

  3. vulhub-php/php_inclusion_getshell

    注:本地测试php文件包含+phpinfo泄露导致getshell,此漏洞与php版本无关 使用vulhub环境进行复现: 项目地址:https://github.com/vulhub/vulhub/ ...

  4. java向上取整向下取整

    向上取整用Math.ceil(double a) 向下取整用Math.floor(double a) 举例: public static void main(String[] args) throws ...

  5. webservice 简单实例

    C# 创建.部署和调用WebService的简单示例   webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservi ...

  6. jar 压缩 解压 war包

    Win+R 输入cmd进入命令行,进入到源码所在目录.所用工具,jdk自带的jar.exe 打包命令:jar -cvf xxx.war * 解包命令: jar -xvf xxx.war * 参数 说明 ...

  7. 给类型为text的input设置value值却无法修改

    给类型为text的input设置value值后就无法修改了 我的页面显示为如下但是退格却无法改变他的值 原来是缺少onChange事件,没法监听value的改变 所以需要添加 onChange={th ...

  8. 50道CSS基础面试题(附答案)

    1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...

  9. This is your path and you will pursue it with excellence.

    This is your path and you will pursue it with excellence.自己选的路就要走出精彩.

  10. 【转发活动】Hey, 是你吗? | 寻"粉"启示

    你知道吗 从 A computer on every desk and in every home 让每张办公桌上和每个家庭都有一台计算机 ▼ 到 Where do you want to go to ...