Python 优雅的使用参数 - 可变参数(*args **kwargs)

2023-11-05 01:58

本文主要是介绍Python 优雅的使用参数 - 可变参数(*args **kwargs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面的话

传递参数的行为对于现在编程语言来说,再寻常不过的概念

参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。 - 来自 wikipedia

先来看一个例子:

# 来源于 https://docs.python.org/2/library/itertools.html
def chain(*iterables):for it in iterables:for element in it:yield element

大家可能注意到 *iterables 了,对了,就是他, 不定参数

>>> from itertool import chain
>>> chan([1,2], [2, 3])				# 你可以这么用
[1, 2, 2, 3]
>>> chan([1,2], [2, 3], [4, 5])		# 你还可以这么用
[1, 2, 2, 3, 4, 5]
>>> chan([1,2], [2, 3], [4, 5])		# 你也可以这么用
[1, 2, 2, 3, 4, 5]
...	// 随心所欲的加参数

很神奇把,(^_^)v,来讲讲枯燥的概念把!

可能很多人用了几年的 Python 都没真正使用过可变参数,就比如我,为了学写通用模块,就会对它有需求;或许你经常看 Python 模块库代码,会发现很多函数的参数定义,都会跟上 *args 和 **kwargs(不定参数的另一种形式,后面会讲到)。

在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变量目的参数。 - 来自 wikipedia

通俗的说就是,函数可以处理不同数量的参数。

在我看来,几乎80%的使用可变参数列表的场景,都可以使用数组和字典来解决。但是使用可变参数列表的函数可以提供一种数组和字典无法提供的东西:优雅

*args

def argsFunc(a, *args):print aprint args>>> argsFunc(1, 2, 3, 4)
1
(2, 3, 4)

argsFunc 中匹配完定义好的参数,剩余的参数以元组的形式存储在 args(args 名称你可以自行定义),因此在上述程序中只要你传入不小于 1 个参数,该函数都会接受,当然你也可以直接定义只接受可变参数,你就可以自由传递你的参数:

def argsFunc(*my_args):print my_args>>> argsFunc(1, 2, 3, 4)
(1, 2, 3, 4)
>>> argsFunc()
()

很简单把,现在来将另一个种不定参数形式

**kwargs

形参名前加两个*表示,参数在函数内部将被存放在以形式名为标识符的 dictionary 中,这时调用函数的方法则需要采用 arg1=value1,arg2=value2 这样的形式。

为了区分,我把 *args 称作为数组参数,**kwargs 称作为字典参数

>>> def a(**x):print x
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中

不过,有个需要注意,采用 **kwargs 传递参数的时候,你不能传递数组参数

>>> a(1,2,3) #这种调用则报错
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)

同样很简单,但是我们什么时候可以用到他呢?

import mysql.connector  db_conf = {user='xx',password='yy', host='xxx.xxx.xxx.xxx',database='zz'
}cnx = mysql.connector.connect(user=db_conf['user'],password=db_conf['password'], host=db_conf['host'],database=db_conf['database'])
...

相比,使用 Mysql Python 库时候,经常看到这个样子的代码,db_conf 一般都从配置文件读取,这是优雅的不定字典参数就派上用途了!

import mysql.connector  db_conf = {user='xx',password='yy', host='xxx.xxx.xxx.xxx',database='zz'
}cnx = mysql.connector.connect(**db_conf)
...

怎样,是不是顺眼多了,代码也省了不少!^_^

今天就到这里了,很早就开始写这一篇了,不想像网路上的大部分博客,只是写一个使用文档类型的教程,看完就忘了。

适当的考虑应用场景,希望能印象深刻。学会,就尽可能的使用它;再优雅的概念,不用也是百搭。

The End

参考 * Python中函数的参数定义和可变参数 * Python函数中定义参数的四种方式 * wiki - 参数 * 【C/C++ 语法备忘】4、可变参数列表

 

这篇关于Python 优雅的使用参数 - 可变参数(*args **kwargs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346636

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.