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编写屏幕截图程序方法
Feb 18 Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 Python
python查询sqlite数据表的方法
May 08 Python
python删除过期log文件操作实例解析
Jan 31 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
pycharm 配置远程解释器的方法
Oct 28 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
Python基于Webhook实现github自动化部署
Nov 28 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
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
jquery实现拖动效果
2016/08/10 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
详解vue 组件注册
2020/11/20 Vue.js
Python 文件操作实现代码
2009/10/07 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
使用python模拟命令行终端的示例
2019/08/13 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
调查研究项目计划书
2014/04/29 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS