Python中自定义函数的教程


Posted in Python onApril 27, 2015

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

我们以自定义一个求绝对值的my_abs函数为例:

def my_abs(x):
  if x >= 0:
    return x
  else:
    return -x

请自行测试并调用my_abs看看返回结果是否正确。

请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。

return None可以简写为return。
空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
  pass

pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

pass还可以用在其他语句里,比如:

if age >= 18:
  pass

缺少了pass,代码运行就会有语法错误。
参数检查

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError:

>>> my_abs(1, 2)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: my_abs() takes exactly 1 argument (2 given)

但是如果参数类型不对,Python解释器就无法帮我们检查。试试my_abs和内置函数abs的差别:

>>> my_abs('A')
'A'
>>> abs('A')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'

当传入了不恰当的参数时,内置函数abs会检查出参数错误,而我们定义的my_abs没有参数检查,所以,这个函数定义不够完善。

让我们修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance实现:

def my_abs(x):
  if not isinstance(x, (int, float)):
    raise TypeError('bad operand type')
  if x >= 0:
    return x
  else:
    return -x

添加了参数检查后,如果传入错误的参数类型,函数就可以抛出一个错误:

>>> my_abs('A')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 3, in my_abs
TypeError: bad operand type

错误和异常处理将在后续讲到。
返回多个值

函数可以返回多个值吗?答案是肯定的。

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的新的坐标:

import math

def move(x, y, step, angle=0):
  nx = x + step * math.cos(angle)
  ny = y - step * math.sin(angle)
  return nx, ny

这样我们就可以同时获得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print x, y
151.961524227 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print r
(151.96152422706632, 70.0)

原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
小结

定义函数时,需要确定函数名和参数个数;

如果有必要,可以先对参数的数据类型做检查;

函数体内部可以用return随时返回函数结果;

函数执行完毕也没有return语句时,自动return None。

函数可以同时返回多个值,但其实就是一个tuple。

 

Python 相关文章推荐
讲解Python中的递归函数
Apr 27 Python
python实现大转盘抽奖效果
Jan 22 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Django之模板层的实现代码
Sep 09 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
Python实现图片批量加入水印代码实例
Nov 30 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
简单的Python人脸识别系统
Jul 14 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
Python图片检索之以图搜图
May 31 Python
在Python中使用dict和set方法的教程
Apr 27 #Python
在Python中使用判断语句和循环的教程
Apr 25 #Python
详解Python中列表和元祖的使用方法
Apr 25 #Python
详解Python当中的字符串和编码
Apr 25 #Python
详细解析Python当中的数据类型和变量
Apr 25 #Python
Python最基本的输入输出详解
Apr 25 #Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 #Python
You might like
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
PHP实现MySQL更新记录的代码
2008/06/07 PHP
PHP安全性漫谈
2012/06/28 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
JavaScript实现换肤功能
2017/09/15 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
js实现查询商品案例
2020/07/22 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python实现图像全景拼接
2020/03/27 Python
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
大学生求职信范文
2014/05/24 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
母亲去世追悼词
2015/06/23 职场文书
仓库管理制度范本
2015/08/04 职场文书
教师教育教学随笔
2015/08/15 职场文书
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS