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使用socket进行简单网络连接的方法
Apr 29 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
python 调试冷知识(小结)
Nov 11 Python
python中提高pip install速度
Feb 14 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
Django models文件模型变更错误解决
May 11 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
一文详述 Python 中的 property 语法
Sep 01 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
Mar 04 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 身份证号验证函数
2009/05/07 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
浅析javascript闭包 实例分析
2010/12/25 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
Vue下的国际化处理方法
2017/12/18 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Django自定义分页与bootstrap分页结合
2021/02/22 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
教师师德教育的自我评价
2013/10/31 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
广告学毕业生求职信
2014/01/30 职场文书
副厂长岗位职责
2014/02/02 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
设计大赛策划方案
2014/06/13 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
公司证明怎么写
2014/09/22 职场文书
2016公司中秋节寄语
2015/12/07 职场文书