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 base64 decode incorrect padding错误解决方法
Jan 08 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
python实现串口自动触发工作的示例
Jul 02 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
学Python 3的理由和必要性
Nov 19 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
python如何求100以内的素数
May 27 Python
python与idea的集成的实现
Nov 20 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
PHP制作用户注册系统
2015/10/23 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
js DOM模型操作
2009/12/28 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
django Admin文档生成器使用详解
2019/07/22 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
大客户销售经理职责
2013/12/04 职场文书
工会主席岗位责任制
2014/02/11 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
大学生党员自我评价
2015/03/04 职场文书
教师工作态度自我评价
2015/03/05 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript