目录结构

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. 最简单直接地理解Java软件设计原则之开闭原则

    写在前面 本文属于Java软件设计原则系列文章的其中一篇,后续会继续分享其他的原则.想以最简单的方式,最直观的demo去彻底理解设计原则.文章属于个人整理.也欢迎大家提出不同的想法. 首先是一些理论性 ...

  2. Django(中间件)

    中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...

  3. 网络编程(socket简介)

    socket简介 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中 ...

  4. 深信服上网行为管理配置跨三层MAC识别

    1.在认证高级选项里点击新增 如果PC的IP和MAC存在于多个三层交换机,则需新增多个. 点击上图"查看服务器信息"测试能否从交换机获取PC的IP和MAC,有返回结果则能正常获取, ...

  5. 弱网测试之Fidder

    是用Fidder可以模拟若罔测试. 1.Fiider设置 fiddler中选中Rules->Cutomize Rules,在文件中搜索关键字:m_SimulateModem: 修改m_Simul ...

  6. 既有Nginx重新动态编译增加http2.0模块

    1.HTTP2.0 HTTP2.0相较于http1.x,大幅度的提升了web性能,在与http1.1完全语义兼容的基础上,进一步减少了网络延时.我们现在很多对外的网站都采用https,但是F12一下看 ...

  7. 2018 ACM-ICPC 焦作区域赛 E Resistors in Parallel

    Resistors in Parallel Gym - 102028E 吐槽一下,网上搜索的题解一上来都是找规律,对于我这种对数论不敏感的人来说,看这种题解太难受了,找规律不失为一种好做法,但是题解仅 ...

  8. HDU 1754线段树

    第一个自己动手写的线段树,1Y还是有点小激动哈(虽然是模版题) 1 #include<cstdio> 2 #include<cstring> 3 #include<alg ...

  9. 2020牛客暑期多校训练营 (第二场) All with Pairs

    传送门:All with Pairs 题意:给你n个字符串,求出,f(si,sj)的意思是字符串 si 的前缀和字符串 sj 后缀最长相等部分. 题解:先对所有的字符串后缀hash,用map记录每个h ...

  10. hdu5135 Little Zu Chongzhi's Triangles

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submissi ...