python函数的参数管理(01)*args和**kwargs

​

一、说明

python中关于函数的参数带入,有些许迷惑性,本文专门针对*args 和**kwargs形式参数的应用规矩做出一个简要说明。

二、多参数传递*args 和 **kwargs

args(arguments的缩写)在编程中,尤其是在Python里,是用来接收任意数量的位置参数的,它将这些参数收集到一个元组(tuple)中;对应的,**kwargs(keyword arguments的缩写)用于接收任意数量的关键字参数,将它们收集成一个字典(dictionary);两者主要用于函数定义,实现参数的灵活传递,*args必须放在**kwargs之前。

2.1 先看*args 的用法

*args 的用法(位置参数)

目的: 当函数接受的参数数量不固定,或者一个、或者N个时使用。

形式: args 中的 args 可以是任何名字,但星号 * 是必须的。
接收方式: 将传入的非关键字参数打包成一个元组(tuple)。
示例1:单独应用args

复制代码
def my_function(*args):
    print(type(args)) # <class 'tuple'>
    print(args)
my_function(1, 'hello', True)

输出:

<class 'tuple'>

(1, 'hello', True)

示例2: 用args和其它参数混合使用*

注意,单独的参数放在*args的前面,这是规定

复制代码
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

2.2 再看**kwargs的用法

对于*args 和 **kwargs,首先让我告诉你,没有必要写 *args 或 **kwargs。只有 *(星号)是必需的。您也可以编写 *var 和 **vars。编写 *args 和 **kwargs 只是一种约定。

1示例:用 **kwargs参数

**kwargs 允许您将关键字可变长度的参数传递给函数。如果你想在函数中处理命名参数,你应该使用 **kwargs。这是一个让您继续使用它的示例:

复制代码
def greet_me(**kwargs):

    for key, value in kwargs.items():
        print("{0} = {1}".format(key, value))
greet_me(name="yaso",age="44",salary=1900)

运行结果:

name = yaso

age = 44

salary = 1900

因此,您可以看到我们如何在函数中处理关键字参数列表。这只是 **kwargs 的基础知识,您可以看到它有多么有用。现在让我们谈谈如何使用 *args 和 **kwargs 调用带有参数列表或字典的函数。

2.3 函数定义为常规参数,用 *args 和 **kwargs 做形参

所以在这里我们将看到如何使用 *args 和 **kwargs 调用函数。只要考虑你有这个小功能,注意函数【定义-调用】之间的区别:

复制代码
def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

现在您可以使用 *args 或 **kwargs 将参数传递给这个小函数。这是如何做到的:

复制代码
#用 *args调用
args = ("wu'shui", 3, 5)
test_args_kwargs(*args)

结果:

arg1: wushui

arg2: 3

arg3: 5

#用 **kwargs调用:

kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}

test_args_kwargs(**kwargs)

结果如下:

arg1: 5

arg2: two

arg3: 3

2.4 使用 fargs ,*args, **kwargs 和的顺序

所以如果你想在函数中使用所有这三个,那么顺序是

some_func(fargs, *args, **kwargs)

三、应用时机

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

复制代码
import someclass
# api function

def  client_info( arg1,arg2 ):
	print("outside!")
	
class someclass
def get_info(self, *args):
    return "Test data"

someclass.get_info = client_info

此处,someclass一侧可以调用一个外部函数,参数也能传递。我相信您也可以想到其他一些用例。

猴子补丁:是程序在本地扩展或修改支持系统软件的一种方式(仅影响程序的运行实例),可以理解为动态补丁。

四、后记

相信您已经基本掌握了*args,**kwargs的用法。在参数管理中,有一个更加奇特的方式,那就是argparse,我们将在续文中说明。

​

相关推荐
沐晓时光3 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
用户956256254297 小时前
跟做:Firecrawl 单页转 Markdown 再丢进沙箱总结
python·api
威哥爱编程7 小时前
模拟面试智能体开发实战 02:回答等半分钟,谁还愿意练?把服务端和流式输出搭起来
python·agent·harmonyos
威哥爱编程8 小时前
模拟面试智能体开发实战 01:面试挂了都不知道挂在哪?用 Python 给自己造一个随叫随到的 AI 面试官
python·agent·harmonyos
2601_967980118 小时前
Python行情API量化 02:顺序拉 20 要 2 秒?并发批量把时间压到 0.5 秒
python·api·限流·并发·量化
伞伞悦读8 小时前
【第81期】特征缩放怎么选:标准化、MinMax 与 Robust 的原理、泄漏对照和完整实验
人工智能·python·深度学习·机器学习
新*9 小时前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer
David猪大卫9 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
卷无止境11 小时前
mathmodel-figure-templates 以及两个上手案例
后端·python
fengci.11 小时前
CTF2MISC中等部分
开发语言·前端·学习