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 解析XML文件
Apr 15 Python
python操作xml文件详细介绍
Jun 09 Python
跟老齐学Python之开始真正编程
Sep 12 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
Django中的文件的上传的几种方式
Jul 23 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
python使用多进程的实例详解
Sep 19 Python
对python中类的继承与方法重写介绍
Jan 20 Python
python输出决策树图形的例子
Aug 09 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
聊聊python中的异常嵌套
Sep 01 Python
python源码剖析之PyObject详解
May 18 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 MYSQL中插入当前时间
2008/04/06 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP实现的简单日历类
2014/11/29 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
详解React 元素渲染
2020/07/07 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
Vue 数据响应式相关总结
2021/01/28 Vue.js
Python中DJANGO简单测试实例
2015/05/11 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
大专生的学习自我评价
2013/12/04 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
室内趣味活动方案
2014/08/24 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
详细了解java监听器和过滤器
2021/07/09 Java/Android