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实现的Kmeans++算法实例
Apr 26 Python
Python运用于数据分析的简单教程
Mar 27 Python
在Django中创建动态视图的教程
Jul 15 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
Python操作MongoDB详解及实例
May 18 Python
用不到50行的Python代码构建最小的区块链
Nov 16 Python
python实现决策树分类算法
Dec 21 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP中用hash实现的数组
2011/07/17 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
简单的Jquery全选功能
2013/11/07 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
python实现从字典中删除元素的方法
2015/05/04 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
python简单操作excle的方法
2018/09/12 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python匿名函数的使用方法解析
2019/10/10 Python
Python: 传递列表副本方式
2019/12/19 Python
Python加速程序运行的方法
2020/07/29 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
中英文求职信范文
2014/01/27 职场文书
高级编程求职信模板
2014/02/16 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
情感电台广播稿
2015/08/18 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸