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中用split()方法分割字符串的使用介绍
May 20 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
Python求解任意闭区间的所有素数
Jun 10 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
python 实现二维列表转置
Dec 02 Python
python numpy生成等差数列、等比数列的实例
Feb 25 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
Python使用pyyaml模块处理yaml数据
Apr 14 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带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
三种php连接access数据库方法
2013/11/11 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
2013/12/31 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python实现股市信息下载的方法
2015/06/15 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python中的数据结构比较
2019/05/13 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
大学四年学习的自我评价分享
2013/12/09 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
我的画教学反思
2014/04/28 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL