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 相关文章推荐
python3生成随机数实例
Oct 20 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
Python中Continue语句的用法的举例详解
May 14 Python
Python使用filetype精确判断文件类型
Jul 02 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
python下10个简单实例代码
Nov 15 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
Python input函数使用实例解析
Nov 22 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
python把一个字符串切开的实例方法
Sep 27 Python
Python爬虫之爬取某文库文档数据
Apr 21 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
php全角字符转换为半角函数
2014/02/07 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
Firefox div高度自适应
2009/04/28 Javascript
Document 对象的常用方法
2009/07/31 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
简单介绍Python中的decode()方法的使用
2015/05/18 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
html5时钟实现代码
2010/10/22 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
妇产医师自荐信
2014/01/29 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
我的祖国演讲稿
2014/05/04 职场文书
环保公益策划方案
2014/08/15 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
师范生小学见习总结
2015/06/23 职场文书
学校证明范文
2015/06/24 职场文书
Python django中如何使用restful框架
2021/06/23 Python
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android