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中time()方法的使用的教程
May 22 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
python实现基于SVM手写数字识别功能
May 27 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
Python面向对象之类和实例用法分析
Jun 08 Python
python实现人工智能Ai抠图功能
Sep 05 Python
PyCharm如何导入python项目的方法
Feb 06 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
python如何写个俄罗斯方块
Nov 06 Python
python解压zip包中文乱码解决方法
Nov 27 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
一个简单的PHP入门源程序
2006/10/09 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
php array_map()函数实例用法
2021/03/03 PHP
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
10个顶级Python实用库推荐
2021/03/04 Python
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
晚会邀请函范文
2014/01/24 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
食堂卫生管理制度
2015/08/04 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS