所属网站分类: 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. JAVA多线程之Volatiles

    Java 语言中的 volatile 变量可以被看作是一种 “轻量级的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但 ...

  2. mysql通用分页存储过程遇到的问题

    DELIMITER $$ USE `tsb_asksys`$$ DROP PROCEDURE IF EXISTS `P_viewPage`$$ CREATE DEFINER=`root`@`local ...

  3. Teradata 认证系列 - 3. 关系型数据库的概念

    本课的学习目标 定义关系型数据库关联的术语 讨论主键的功能 讨论外键的功能 列出关系型数据库的优势 描述星型架构和第三范式数据模型的区别 什么是数据库?数据库是一个应用永久保存数据的集合表现在: 逻辑 ...

  4. 渐进式jpeg(progressive jpeg)图片及其相关

    最近看有些网站上的jpg格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是先是全部的模糊图片,然后逐渐清晰(就像GIF格式的交错显示). 一.基本JPEG(baseline jp ...

  5. Vue.js(2.x)之条件渲染

    1.v-if:这里的官网文档看完后赶脚v-if就是用来判断元素是显示还是隐藏. 2.template这个包装元素感觉挺好用,以后把需要某些特定操作才出现的元素存放进去挺好. 3.前面看的网友写的还可以 ...

  6. 构建第一个spring boot2.0应用之项目启动运行的几种方式(二)

    方法一. 配置Run/Debug Configuration  选择Main Class为项目 Application启动类(入口main方法) (2).进行项目目录,即包含pom.xml的目录下,启 ...

  7. vue中使用setTimeout

    在vue的函数中使用setTimeout self.distroyTimeout = setTimeout(()=>{ self.initData() },1000) 这时清除setTimeou ...

  8. 动态规划专题(五)——斜率优化DP

    前言 斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解.后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头. 基本式子 斜率优化\(DP\)的式子略有些复杂,大致可以 ...

  9. Linux运维工程师是什么鬼?

    第一部分:定义 运维工程师,字面理解运行维护. linux运维即linux运维工程师,集合网络.系统.数据库.开发.安全工作于一身的“复合性人才”.   除了传统IT运维部分,运维人员还是管理制度.规 ...

  10. 2017.12.2 用java做一个日历

    1.先判断输入的日期是否为闰年 2.在判断输入的月份是否为2月 3.在获取输入的年份和月份的1月1日 的列数 4.在输出 import java.util.*; public class demo{ ...