您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python中*args和*kwargs

时间:2020-09-11 10:49:40  来源:  作者:
Python中*args和*kwargs

 

Python/ target=_blank class=infotextkey>Python的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。

  • args 是 arguments 的缩写,表示位置参数
  • kwargs 是 keyword arguments 的缩写,表示关键字参数

注:这其实就是 Python 中可变参数的两种形式,并且 *args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。

我们将通过以下5方面来理解:

  1. *的作用
  2. *args的用法
  3. **的作用
  4. **kwargs的用法
  5. 实例

*的作用

通过一个函数调用来理解“*”的作用

#定义一个含三位置参数的函数
>>>def fun(a, b, c):
...	print a,b,c#传三个位置参数,调用此函数>>> fun(1,2,3)
1 2 3	# 输出

现在我们定义一个含三个整数的数列,并使用‘*’

>>> var = [1, 2, 3]
>>> fun(*var)
1 2 3	# 输出

'*'做了什么?它拆开数列'var'的数值作为位置参数,并把这些位置参数传给函数‘fun’来调用。

这意味着fun(*var)与fun(1,2,3)是等效的,因为var=[1,2,3]

注:*var与位置参数可混合使用

*args的用法

"*args"在函数定义中是做什么用的?它接收元组作为位置参数,而非是常见的参数列表。在这里,“args”是个元组。

“args”与“常规参数列表”混合使用

#在函数定义中,参数‘a’代表‘常规参数列表’
>>> def fun(a, *args):
...	print("a is ", a)
...	print("args is ", args)
#‘args’接收除常规参数之外的位置参数作为元组>>> fun(11, 12, 13, 14)
a is 11
args is (12, 13, 14)

注:'args'既然是元组,我们就可以遍历它。

**的作用

通过一个函数调用来理解“**”的作用

# 定义一个三参数的函数
>>> def fun(a, b, c):
...	print(a, b, c)...>>> func(1, 2, 3)
1 2 3
>>> fun(a=1, b=2, c=3)
1 2 3

使用“**”调用函数,这种方式我们需要一个字典。

>>> var = {'b' : 2, 'c' : 3}
>>> fun(1, **var)
1 2 3

注:在函数调用中使用‘*’,我们需要元组;在函数调用中使用‘**’,我们需要一个字典

“**”做了什么?它unpack字典,并将字典中的数据项作为键值参数传给函数。因此,fun(1, **var)的写法与fun(1, b=2, c=3)等效。

**kwargs的用法

在函数定义中“**kwargs”意味着什么?kwargs接收除常规参数列表外的键值参数字典,在这里'kwargs'是个字典。

重新定义函数:

>>> def fun(a, **kwargs):
...	print("a is ", a)
...	print("We expect kwargs 'b' and 'c' in this function")
...	print("b is ", kwargs['b'])
...	print("c is ", kwargs['c'])
...>>> fun(1, b=3, c=5)
a is 1
We expect kwargs 'b' and 'c' in this function
b is 3
c is 5

注:在一个字典前使用“**”可以unpack字典,传字典中的数据项作为键值参数。

实例

通过一个应用实例来说明'args','kwargs'应用场景以及为何要使用它。

在继承类和重写方法的时候,我们可以用到’*args’和’**kwargs’将接收到的位置参数和键值参数给父类方法,通过实例我们更好的理解。

>>> class Model(object):
...	def __init__(self, name):
...		self.name = name...	def save(self, force_update=False, force_insert=False):
...		if force_update and force_insert:
...			raise ValueError("Cannot perform both operations")
...		if force_update:
...			print("Updated an existing record")
...		if force_insert:
...			print("Created a new record")

构造一个新类,类有’Model’的行为,但我们只有检查一些条件后才会保存这个类的对象。这个新类继承’Model’,重写’Model’的’save()’

>>> class ChildModel(Model):
...	def save(self, *args, **kwargs):
    ...             if self.name=='abcd':
...                     super(ChildModel, self).save(*args, **kwargs)...             else:
...                     return None

实际上对应的保存动作发生在’Model’的’save’方法中。所以我们调用子类的的’save()’方法而非’Model’的方法.子类ChildModel的’save()’接收任何父类save()需要的参数,并传给父类方法。因此,子类’save()’方法参数列表中有”*args”和”**kwargs”,它们可以接收任意位置参数或键值参数,常规参数列表除外。

下面创建ChildModel实体并保存:

>>> c=ChildModel('abcd')
>>> c.save(force_insert=True)
Created a new record
>>> c.save(force_update=True)
Updated an existing record

这里传键值参数给对象的save()方法,调用的是子类的save()。



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  Tags: Python  点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  Tags: Python  点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  Tags: Python  点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  Tags: Python  点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  Tags: Python  点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  Tags: Python  点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  Tags: Python  点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  Tags: Python  点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  Tags: Python  点击:(28)  评论:(0)  加入收藏
假设某日我开了一家空调公司,暂且就叫他天强空调安装设备公司吧,假装自己有公司,接了一单大生意,就是给甘肃省的各个高校安装空调(其实这边的气候基本用不到空调,就是假想一下),那么...【详细内容】
2022-07-01  Tags: Python  点击:(33)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条