python 函数中的参数类型


Posted in Python onFebruary 11, 2020

1.前言

Python中函数的参数类型比较丰富,比如我们经常见到*args**kwargs作为参数。初学者遇到这个多少都有点懵逼,今天我们来把Python中的函数参数进行分析和总结。

2.Python 中的函数参数

在Python中定义函数参数有5种类型,我们来一一演示它们。

2.1必选参数

必须参数是最基本的参数类型,当你在Python函数中定义一个必选参数时,每次调用都必须给予赋值,否则将报错。

>>>def fun(a):
    print("a=",a) 
  
>>>fun('felord.cn')
a= felord.cn
>>>fun()
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: fun() missing 1 required positional argument: 'a'

2.2默认参数

默认参数就是拥有一个默认值的参数。

>>>def fun(a="felord.cn"):
    print("a=",a) 
  
>>>fun()
a= felord.cn
>>>fun("Felordcn")
a= Felordcn

我们来看看下面这种情况:

>>>def fun(a=[]):
    a.append("foo")
    print("a=",a)
  
>>>fun()
a= ['foo']
>>>fun()
a= ['foo', 'foo']
>>>fun()
a= ['foo', 'foo', 'foo']

这是什么情况?每次调用参数a都“记忆”了原来的值,这是因为Python函数在定义的时候,默认参数a的值就被初始化为[],其实a也是一个变量,它指向对象[],每次调用该函数改变a的值则会改变a指针指向的对象的值。当你将a的默认值定义为一个不可变对象时就不会发生这种情况,你可以试试我说的。

所以,定义默认参数要牢记一点:默认参数必须指向不变对象!

2.3可变参数

有很多场景我们不确定参数的个数,也就是说参数是可变的。首先你可能会想到使用list或者tuple(元组)来封装多个参数,但是如何才能从函数的语义上看出这是一个可变参数呢?所以我们通过一个前缀标识*来声明该参数是一个可变参数,通常记作*args,你也可以记作*paramsargs会把所有的参数收纳成一个tuple。我们来演示一个求和的函数:

>>>def calc(*args):
    total=0
    for i in args:
      total+=i
    return total    
 
>>>calc(1)
1
>>>calc(1,2,3,4,5)
15
>>>calc()
0

2.4关键字参数

关键字参数也是实现任意个数参数的一种方式,区别在于可变参数收纳为一个tuple而关键字参数将我们传入参数的参数名和对应的值收纳为一个dict(字典)。通常记作**kwargs以区别于可变参数,实际上kw就是keyword的缩写。我们来试一试:

>>>def mapper(**kwargs):
    print(kwargs)
  
>>>mapper()
{}
>>>mapper(name="felord.cn")
{'name': 'felord.cn'}

2.5命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些关键字,需要我们在函数内部进行显式的检查来确定,这种样板代码往往跟我们的意图无关。那么Python本身能不能限制关键字参数的名字呢?当然有!我们可以使用命名关键字参数来实现这个目的。在*,之后紧跟的连续的非可变参数和非关键字参数就是命名关键字参数。我们也来演示一下:

>>>def info(name,*,age,city):
    print("name=",name,"age=",age,"city=",city)
   
>>>info("felord.cn")
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: info() missing 2 required keyword-only arguments: 'age' and 'city'
>>>info("felord.cn",city="beijing",age=20)
name= felord.cn age= 20 city= beijing

根据上面你或许能发现其它什么规律,另外命名关键字参数也可以设置关键字的默认值,但是传参必须带 keyword

>>>def info(name,*,age=20,city):
    print("name=",name,"age=",age,"city=",city)
  
>>>info("felord.cn",city="beijing")
name= felord.cn age= 20 city= beijing
>>>info("felord.cn","beijing")
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: info() takes 1 positional argument but 2 were given

3.参数组合

这5种参数可以组合使用,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。特别注意可变参数无法和命名关键字参数混合。对于任意函数,都可以通过类似function(args, *kw)的形式调用它,无论它的参数是如何定义的。限于篇幅不再一一举例,可自行测试。

4. 总结

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。其中也有不少细节,参数类型也是学习Python函数的一个关键知识点

以上所述是小编给大家介绍的python 函数中的参数类型,希望对大家有所帮助!

Python 相关文章推荐
python的类变量和成员变量用法实例教程
Aug 25 Python
简单介绍Python中的decode()方法的使用
May 18 Python
python中引用与复制用法实例分析
Jun 04 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
详解python的webrtc库实现语音端点检测
May 31 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
python中验证码连通域分割的方法详解
Jun 04 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
如何在django中实现分页功能
Apr 22 Python
python numpy矩阵信息说明,shape,size,dtype
May 22 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 #Python
python3正则模块re的使用方法详解
Feb 11 #Python
Python版中国省市经纬度
Feb 11 #Python
Python终端输出彩色字符方法详解
Feb 11 #Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 #Python
利用python中集合的唯一性实现去重
Feb 11 #Python
TensorFLow 变量命名空间实例
Feb 11 #Python
You might like
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
php中curl使用指南
2015/02/05 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php实现搜索类封装示例
2016/03/31 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python面向对象特殊成员
2017/04/24 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
金融与证券专业求职信
2014/06/22 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书