所属网站分类: 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. Ubuntu16.04 下如何安装和卸载Google Chrome【亲测有效】

    一.安装 1.将下载源添加到系统源中. sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.li ...

  2. (6)ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

    1.HttpClient类使用存在的问题 HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面 ...

  3. java CountDownLatch 等待多线程完成

    CountDownLatch允许一个或多个线程等待其他线程完成操作. package com.test; import java.util.concurrent.CountDownLatch; pub ...

  4. 《C#高效编程》读书笔记11-理解短小方法的优势

    我们最好尽可能的编写最清晰的代码,将优化交给JIT编译器完成.一个常见的错误优化是,将大量逻辑放在一个函数中,以期减少额外的方法调用开销.这种将函数逻辑直接写在循环内部的常见优化做法却会降低.NET应 ...

  5. Vue小贴士

    1.去掉空格影响,删除掉此段代码 2.想要同时运行两个Vue项目,修改端口号,黄色框内的内容自己随意改个端口号就行,比如:8082 3.批处理  在项目的根目录中添加a.bat文件,这样就可以在运行的 ...

  6. node线程有多少

    一篇文章构建你的 NodeJS 知识体系

  7. 什么是Spring

    之前已经学习过web三层(数据库链接层dao,业务逻辑控制层service,用户层web). 在开发过程中,我们不断引入更加优秀的工具的目的都是在安全.高效的基础上,简化开发,和易于维护. 所以引入s ...

  8. OS进程同步与通信

    信号量机制 信号量用于互斥 P(S) 临界区 V(S) ----- P(S) 临界区 V(S) 生产者消费者: typedef int semaphore //信号量值设置为1就是互斥量 semaph ...

  9. JFrame 文本打印

    package tools; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import jav ...

  10. 如何将js导入时的小红叉去掉

    右键WebRoot-Myeclipse-Exclude From Validation