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代码真的很爽
Aug 26 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
详解Python中的join()函数的用法
Apr 07 Python
Python爬取京东的商品分类与链接
Aug 26 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
举例讲解Python装饰器
Dec 24 Python
Python自动化实战之接口请求的实现
May 30 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将数据导入到Foxmail
2006/10/09 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
详解JavaScript的变量
2019/04/04 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
社区服务活动小结
2014/07/08 职场文书
自我工作评价范文
2015/03/06 职场文书
风之谷观后感
2015/06/11 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
python运行脚本文件的三种方法实例
2022/06/25 Python