函数是最小的基本功能单元,能够增强代码的可读性,易于管理,而且Python作为支持函数式编程的语言,广泛的使用必不用说。

虽说Python函数的定义非常简单,但是却非常灵活,特别是函数参数的使用,使得函数定义出来的接口能够处理复杂的参数问题,简化调用者的代码。Python中函数的参数类型有:必选参数、默认参数、可变参数、关键字参数、命名关键字参数等

默认参数

>>> def cal_power(x, n):s = 1while n > 0:s = s * xn = n - 1return s>>> cal_power(5,3)
125

上面这个函数计算x的n次方,非常简便。但是按照使用情况来看,如果大多情况计算的是二次方,那么每一次都需要输入参数2,能不能简便一些只输入一个参数呢?下面这样就可以了嘛!

>>> def cal_power(x, n = 2):s = 1while n > 0:s = s * xn = n - 1return s>>> cal_power(5)
25
>>> cal_power(5, 3)
125

默认参数能够在保证强大功能的前提下,简化使用者的调用。
默认参数的使用需要注意:

  • 默认参数一定要放在必选参数后面;
  • 默认参数必须指向不变对象!

如果有多个默认参数,在调用的时候一般需要按照顺序传入参数;同时,并非一定要将所有的可选参数全都传入,可以使用参数名只传入某一个参数。

>>> def cal_power(x, n = 2, add = 5):s = 1while n > 0:s = s * xn = n - 1return s + add>>> cal_power(5, 3, 10)
135
>>> cal_power(5, 3)
130
>>> cal_power(5, add = 10)
35

随心所欲!就是这么任性

可变参数

>>> def cal_add(numbers):s = 0for i in numbers:s = s + ireturn s
>>> list = [2,4,6,8]
>>> tuple = (2,4,6,8)
>>> cal_add(list)
20
>>> cal_add(tuple)
20

上面的这样一个函数,允许传入一个可iterable的且包含数字的对象,并对其中所有的元素进行相加。

但是每一次都构造一个可遍历对象,很不方便。如果能够利用可变参数,就可以将可变数量的参数传入函数,实施计算。

>>> def cal_add(*numbers):s = 0for i in numbers:s = s + ireturn s>>> cal_add(2,4,6,8)
20
>>> cal_add(2,4,6)
12
>>> cal_add()
0

只需要将参数前面加上*就可以构造一个可变参数。而实际上,在函数内部调用时,numbers接收到的是一个由传入参数构成的tuple,所以代码保持不变。但是调用函数却时可以传入任意个参数!

但是如果现在已经有一个list或者tuple,需要传入参数,逐一传入当然是可行的,但很麻烦,可以直接在list或tuple前加一个*,将其中的元素作为可变参数传入!

>>> cal_add(*list)
20
>>> cal_add(*tuple)
20

*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见!

关键字参数

可变参数允许你传入任意个参数,调用时自动组装成tuple;而关键字参数允许你传入任意个含参数名的参数,这些关键字参数在调用时自动组装成为一个dict

>>> def person(name,age,**kw):print('name:',name,'age',age,'other',kw)
>>> person("MrHammer",24,city='Nanjing',hometown='Jiangxi')
name: MrHammer age 24 other {'city': 'Nanjing', 'hometown': 'Jiangxi'}

关键字参数能够扩展函数的功能,用于接收一些可选功能!

和可选参数类似,也可以先组织一个dict对象,再使用**dict传入关键字参数,而调用时函数内部将参数重新组织成为一个dict。

>>> myInfo = {'city': 'Nanjing', 'hometown': 'Jiangxi'}
>>> person("MrHammer",24,**myInfo)
name: MrHammer age 24 other {'city': 'Nanjing', 'hometown': 'Jiangxi'}
>>> 

命名关键字参数

如果想要限制传入参数的关键字名称,可以使用以下方法进行限制。

>>> def person(name,age,*,city,hometown):print('name:',name,'age',age,'other',city, hometown)
>>> person("MrHammer",24,city='Nanjing',hometown='Jiangxi')
name: MrHammer age 24 other Nanjing Jiangxi

使用一个*作为特殊分隔符,*之后的参数就被作为命名关键字参数,命名关键字参数是必填参数,没法缺省,而且只能输入相应名字的参数。但同时输出的结果就不是dict对象,而直接是相应的值了。

>>> person("MrHammer",24,city='Nanjing',hometown='Jiangxi',sex='male')
Traceback (most recent call last):File "<pyshell#79>", line 1, in <module>person("MrHammer",24,city='Nanjing',hometown='Jiangxi',sex='male')
TypeError: person() got an unexpected keyword argument 'sex'

上面的问题说明:命名关键字说明之外的参数是没法被接收的!

>>> person("MrHammer",24,'Nanjing','Jiangxi')
Traceback (most recent call last):File "<pyshell#80>", line 1, in <module>person("MrHammer",24,'Nanjing','Jiangxi')
TypeError: person() takes 2 positional arguments but 4 were given

上面的问题说明:虽说关键字的名称已经指定了,但仍旧需要以键值对的方式传入参数!否则会被默认为位置参数!

如若参数中已经含有一个可变参数了,就不需要用’*’,可变参数后面跟着的就是命名关键字参数!

>>> def person(name,age,*args,city,hometown):print('name:',name,'age',age,'other',args,city, hometown)
>>> person('Mr',24,14,58,3.20,city='Nanjing',hometown='fad')
name: Mr age 24 other (14, 58, 3.2) Nanjing fad

参数组合

在Python中,必选参数、默认参数、可变参数、关键字参数、命名关键字参数可以互相组合使用,参数定义的顺序一定是必选参数、默认参数、可变参数、命名关键字参数、关键字参数,顺序一定不能乱!前面的是单个的参数,而后面是键值对参数。

>>> def person(name,age,*args,city='Nanjing',hometown,**kw):print(name,age,args,city,hometown,kw)
>>> person('MrHammer',24,*(50,'shade of gray',51),hometown='Jx')
MrHammer 24 (50, 'shade of gray', 51) Nanjing Jx {}
>>> person('MrHammer',24,*(50,'shade of gray',51),hometown='Jx',sex='male',hobby='jogging')
MrHammer 24 (50, 'shade of gray', 51) Nanjing Jx {'hobby': 'jogging', 'sex': 'male'}

你看,多么完美,将所有参数都用上了,命名关键字参数之后还可以接任意个关键字参数。
那么,最神奇的是下面的用法

>>> args = ('MrHammer',24,50,'shade of gray',51)
>>> kw = {'hometown':'Jx','sex':'male','hobby':'jogging'}
>>> person(*args,**kw)
MrHammer 24 (50, 'shade of gray', 51) Nanjing Jx {'hobby': 'jogging', 'sex': 'male'}

看到了吗!也就是我们常说的,任何函数都能够用fun(*args,**kw)的形式来调用,无论是怎么定义的!

(By MrHammer 2016-05-18 下午2点 @Hohai Clody)

Python中的函数参数相关推荐

  1. python中函数的参数_Python小知识-Python中的函数参数(基础篇)

    0 总述 这个题目分为2篇,第一篇基本上是概念以及实例,有个相对系统的认识,第二篇想写的深入一些,不同参数类型的区别以及和c/c++的函数参数对比下异同-下面开始是第一篇的内容啦- Python中的函 ...

  2. Python中自定义函数参数类型

    函数:函数是组织好的,可以重复使用的,用来实现单一的或相关联功能的代码段. 函数可以提升代码的复用率,提升代码的模块性,提升代码可维护性 使用def 关键字定义函数,例如:def func1(): 形 ...

  3. Python中的函数参数类型

    1.参数命名规则经验:绝大多数函数接收一定数量的参数,然后根据实际调用时提供的参数的值的不同,输出不同的结果.前面我们说过,将函数内部的参数名字,定义得和外部变量的名字一样是一种不好的习惯,它容易混淆 ...

  4. python中hist函数参数_用hist参数解释Python,python,解读

    python用hist参数解读 python 中绘制hist的方法有很多,我经常用的是matplotlib直接用x,y绘制:Dataframe直接.hist绘制: 绘制直方图 1.bins为80的图形 ...

  5. matlab中scatter函数怎么用,Python中scatter函数参数及用法详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  6. python scatter函数参数,Python中scatter函数参数及用法详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  7. python中round函数参数_python中关于round函数的小坑

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  8. python中round函数参数有负数_Python中round函数使用注意事项

    使用round函数的时候发现了一个奇怪的现象.一直觉得round函数是一个用于四舍五入的函数,结果却不一定.一般如果觉得奇怪,那就是没弄懂其本质的运作原理,所以深入了解了下round函数. Pytho ...

  9. 四、Python中scatter函数参数详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

最新文章

  1. dataTable 从服务器获取数据源的两种表现形式
  2. Kubernetes — Project Layout 与 cmd 入口设计
  3. 用户与IoT同享一个WLAN时:弹性至关重要
  4. 叶县有没有计算机培训学校,叶县中等专业学校
  5. 2.2.5 操作系统之调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)
  6. [数据结构-严蔚敏版]P42多项式Polynomial的实现
  7. android 动画 返回,Android“菜单图标变返回”动画
  8. 屏上有一层紫色(正在找原因)
  9. JavaScript学习笔记:数组reduce()和reduceRight()方法
  10. java qq 界面_【Java】仿真qq尝试:聊天界面 响应用户输入
  11. Music Bugs : 不支持wma格式的歌曲播放
  12. 第四章.深入类的方法
  13. python模拟键盘操作_Python 模拟键盘鼠标操作详细教程
  14. oracle单纯的sql能写循环吗,循环执行sql语句
  15. linux卸载nps,Linux NPS服务部署
  16. C++中的peek()函数及其用法
  17. 更改设置让Cheat Engine搜索安卓模拟器里的数据
  18. Matlab 图像几何变换
  19. table中同一列中合并相同项
  20. 初中英语多词性单词怎么办_初中英语单词巧记方法

热门文章

  1. ASP网站如何防止注入漏洞攻击
  2. CreateCompatibleDC CreateCompatibleBitmap SelectObject
  3. 门磁传感器到底有什么作用?智汀门磁传感器的原理和使用方法
  4. DSP中的EALLOW和EDIS
  5. Python爬取并绘制广州市公交线路
  6. 【游戏开发高阶】从零到一教你Unity使用ToLua实现热更新(含Demo工程 | LuaFramework | 增量 | HotUpdate)
  7. 考研经验分享(南京理工大学)
  8. 务必请收藏这几款实用PC软件,你一定用得上!
  9. 深度学习100问之深度学习的本质
  10. 【浙江工业大学】考研初试复试资料分享