目录结构

1.前言

2.【*args】的用法

2.1.第一步:首先编写这样的函数【test1】。

2.2.第二步:给函数【test1】赋值相关入参值。

2.3.第三步:调用函数【test1】,得到以下结果。

3.【**kwargs】的用法

3.1.第一步:首先编写这样的函数【test2】。

3.2.第二步:给函数【test2】赋值相关入参值。

3.3.第三步:调用函数【test2】,得到以下结果。

4.相关学习资料

1.前言

通过python编写的代码中,我们经常会见到这两个词【*args】和【**kwargs】,但是之前没深入学习导致只懂一点概念,所以趁这次空闲时间进行深入学习。
其实args和kwargs这只是编程人员约定俗成的变量名字,说直白一点就是习惯写成这样的变量名字了,我们也可以写成【*aaa】和【**bbb】。
为了搞清楚【*args】和【**kwargs】的基本用法,并且为了搞清楚后能更加熟练地运用于实际的项目开发,我们是有必要去做相关笔记,因为以后我们即使忘了也能通过笔记去进行快速复习。
相关细节:
①.【args】是单词【arguments】的缩写,表示可变参数;
②.【kwargs】是单词【keyword arguments】的缩写,表示关键字参数。
③.【*args】和【**kwargs】这其实就是 python语言中入参形式里的两种形式。
④. python入参形式只有这四种:位置参数、默认参数、可变参数、关键字参数。
⑤. 四种入参形式在一个函数的入参填写位置必须遵守这个基本原则:先是位置参数,再是默认参数,再接着是可变参数,最后是关键字参数。
⑥.  在任一个函数/方法的入参形式组合里, 入参【*args】必须只能放在入参【**kwargs】的前面,因为可变参数只能在关键字参数的前面。
 
 

2.【*args】的用法

【*args】就是就是传递一个可变参数列表给函数实参args,这个参数列表的数目未知,甚至长度可以为0。下面这段代码演示了如何使用【*args】。

2.1.第一步:首先编写这样的函数【test1】。

def test1(name,age=10,*args):
print("第一个入参为位置参数name,且位置参数name的值为:%s"%name)
print("第二个入参为默认参数age,且默认参数age的值为:%s"%age)
print("第三个入参是可变参数args,数据类型为元祖")
print(type(args))
for i in args:
print("可变参数args里的每个值为:%s"%i)

2.2.第二步:给函数【test1】赋值相关入参值。

test1("洪景盛",20,"a1","a2","a3","a3")

2.3.第三步:调用函数【test1】,得到以下结果。

第一个入参为位置参数name,且位置参数name的值为:洪景盛
第二个入参为默认参数age,且默认参数age的值为:20
第三个入参是可变参数args,数据类型为元祖
<class 'tuple'>
可变参数args里的每个值为:a1
可变参数args里的每个值为:a2
可变参数args里的每个值为:a3
可变参数args里的每个值为:a3

通过结果,我们可以得到这些结论:

①.第一个参数【name】是必须要传入的参数,参数name是位置参数。

②.第二个参数【age】是非必须要传入的参数,参数age是默认参数。

③.第三个参数【*args】是非必须要传入的参数,参数args是可变参数(可变参数的数据类型为元祖)。这四个入参值【"a1","a2","a3","a3"】则作为可变参数列表传给了参数args,并且是作为元组tuple来使用的。

3.【**kwargs】的用法

【**kwargs】就是将一个可变的关键字参数的字典传给函数实参kwargs,同样参数列表长度可以为0或为其他值。下面这段代码演示了如何使用【**kwargs】。

3.1.第一步:首先编写这样的函数【test2】。

def test2(name, sex="男",*args, **kwargs):
print('必填参数name的值:%s'%name)
print('默认参数sex的值:%s'%sex)
print(type(kwargs))
for i in args:
print ('可变参数args里的每个值为', i)
for k, v in kwargs.items():
print ('关键字参数kwargs的,每个key为: %s, 每个value为:%s;' % (k, v))

3.2.第二步:给函数【test2】赋值相关入参值。

test2(1,"女","A",False,{"a1":1},3,[2,"a2",{"c1":7}],k1=1,k2=2,k3=[11,22,"33",{"b1":11}],k4={"r1":1})

3.3.第三步:调用函数【test2】,得到以下结果。

必填参数name的值:1
默认参数sex的值:女
<class 'dict'>
可变参数args里的每个值为 A
可变参数args里的每个值为 False
可变参数args里的每个值为 {'a1': 1}
可变参数args里的每个值为 3
可变参数args里的每个值为 [2, 'a2', {'c1': 7}]
关键字参数kwargs的,每个key为: k1, 每个value为:1;
关键字参数kwargs的,每个key为: k2, 每个value为:2;
关键字参数kwargs的,每个key为: k3, 每个value为:[11, 22, '33', {'b1': 11}];
关键字参数kwargs的,每个key为: k4, 每个value为:{'r1': 1};

通过结果,我们可以得到这些结论:

①.args数据类型是一个元祖tuple,而kwargs数据类型则是一个字典dict,并且【*args】只能位于【**kwargs】的前面。

4.相关学习资料

①.关于【*args】和【**kwargs】的深入学习,可以参考这篇博客:https://www.cnblogs.com/yangzilaing/p/13470775.html

②.关于【位置参数、默认参数、可变参数、关键字参数】的深入学习,可以参考这篇博客:https://www.cnblogs.com/bingabcd/p/6671368.html

学习建议:

①.务必要搞懂【*args】和【**kwargs】的基本原理和知道大概怎么用。

②.在一个函数里把【*args】和【**kwargs】组合起来可以传入任意的参数,这在函数参数个数未知的情况下是很有效的一种做法,同时大大加强了函数的可拓展性。

③.【位置参数、默认参数、可变参数、关键字参数】的相关知识点,是学习如何写好一个规范的函数的最重要的基础知识点,也要知道大概怎么用。

django学习-18.*args和**kwargs的用法和使用场景的更多相关文章

  1. django 学习-18 用户管理Auth系统使用

    1.首先跟之前说的admin的要求有点像, vim urls.py from django.contrib import adminadmin.autodiscover()               ...

  2. Python中的args和kwargs

    有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...

  3. Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程

    这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...

  4. python学习-- 理解'*','*args','**','**kwargs'

    刚开始学习Python的时候,对有关args,kwargs,和*的使用感到很困惑.相信对此感到疑惑的人也有很多.我打算通过这个帖子来排解这个疑惑(希望能减少疑惑). 让我们通过以下5步来理解: 1.  ...

  5. 学习python的*args和 **kwargs

    *args表示任何多个无名参数,它是一个tuple(元组):**kwargs表示关键字参数,它是一个dict(字典) def foo(*args, **kwargs): print 'args = ' ...

  6. python学习笔记:*args和**kwargs使用原理?

    一.*args和**kwargs原理 先看个例子: def test(*args,**kwargs): print("args =",args) print("kwarg ...

  7. [Python学习笔记-004] 可变参数*args和**kwargs

    在Python中,可变参数的传递使用*args和**kwargs来实现,其中: *args表示任意个位置参数(positional argument),被表示为一个只读的数组(tuple): **kw ...

  8. python中*args和**kwargs学习

    *args 和 **kwargs 经常看到,但是一脸懵逼 ,今天终于有收获了 """ python 函数的入参经常能看到这样一种情况 *args 或者是 **kwargs ...

  9. Django 学习笔记(七)数据库基本操作(增查改删)

    一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...

随机推荐

  1. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  2. python中字符串的翻转(方法总结)

    Python翻转字符串(reverse string), 一共包含5种方法, 其中第一种最简单, 即步长为-1, 输出字符串; 方法如下 5种方法的比较: 1. 简单的步长为-1, 即字符串的翻转(常 ...

  3. centos安装Qt

    转:http://blog.csdn.net/wavelee/article/details/7855727 在编译Qt4.8.6版本的库时,在配置时 ./configure 出现了如下的错误: Ba ...

  4. Nginx图文详解

    想必大家一定听说过 Nginx,若没听说过它,那么一定听过它的"同行"Apache 吧! Nginx 的产生 Nginx 同 Apache 一样都是一种 Web 服务器.基于 RE ...

  5. Spark+Kafka实时监控Oracle数据预警

    目标: 监控Oracle某张记录表,有新增数据则获取表数据,并推送到微信企业. 流程: Kafka实时监控Oracle指定表,获取该表操作信息(日志),使用Spark Structured Strea ...

  6. 链表中head->next = p;和p=head->next;之间的区别

    最近这两天在看递归,然后,看了几个例子,其中有一个单链表反转的例子可以使用递归解决,但是这里却有一个问题让我迷惑了一会,就是链表操作中这两句话的含义: 以下图中的单向链表为例: Node preNod ...

  7. 自己动手实现java断点/单步调试(二)

    自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...

  8. poj3585 Accumulation Degree(树形dp,换根)

    题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...

  9. Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda

    1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...

  10. hdu5489 Removed Interval

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission ...