第一节 定义函数
函数定义
在前面的学习过程中,我们用到了一些函数,例如len()
,min()
,max()
这些函数都是由Python官方提供的,我们称之为内置函数(BIF)
本节主要介绍自定义函数的定义和调用.
自定义函数的语法非常简单
def 函数名(参数列表):
函数体
return 返回值
类比一下我们之前书写的函数
import math
def area_of_circle(x):
return math.pi*x*x
其中
- def 是定义函数的关键字
- 函数名需要符合标识符的命名规范
- 区分大小写
- 首字母可以是下划线
_
但不能是数字 - 除首字母之外的其他字符 可以是下划线,字母和数字
- 关键字不能作为标识符
- 函数名需要符合一般的命名标准
- 全部小写,如果由多个单词构成,可以用下划线隔开
- 在模块或函数内部,可以用单下划线开头
- 类内部使用使用变量名,双下划线开头,表示私有
- 多个参数列表之间可以用逗号分隔
- 函数体是我们"重复执行的代码块"
- 函数执行完毕之后如果有返回值,可以用return将数据返回,否则可以使用return None或者省略return语句.请注意,函数体内部的语句在执行时,一旦执行到
return
时,函数就执行完毕
我们再次定义一个函数,用以计算长方形的面积
def rectangle_area(width,height):
area = width * height
return area
r_area = rectangle_area(100,200.0)
print("100*200的长方形面积:{0:.2f}".format(r_area))
上述代码中:
- 通过def定义了计算长方形面积的函数,他有两个参数,分别是长方形的宽和高.
- 函数体是我们计算长方形面积的表达式,结果赋值给area,然后通过return返回我们所要的数据
- 我们通过函数名
rectangle
加小括号的形式对函数进行调用执行 - 执行过程中,我们在小括号内传入实际需要参与运算的数据(实参)
- 实参被赋给了参数列表,函数开始执行
关于函数的执行过程,我们先了解到这里,当我们学习了函数参数和作用域之后,再对函数执行过程进行进一步的总结.
注意:
-
现阶段,我们在函数调用时,如果传入的参数个数和函数定义时不符合,系统会报错
def rectangle_area(width,height): area = width * height return area r_area = rectangle_area(100) print("100*200的长方形面积:{0:.2f}".format(r_area))
TypeError: rectangle_area() missing 1 required positional argument: 'height'
-
函数的调用通常情况下是在函数声明之后,否则可能出现报错
r_area = rectangle_area(100,200.0) def rectangle_area(width,height): area = width * height return area print("100*200的长方形面积:{0:.2f}".format(r_area))
NameError: name 'rectangle_area' is not defined
空函数
如果想要定义一个什么也不做的空函数,可以使用pass
语句
def hi():
pass
pass
什么也不做,那他有什么用呢?
上述例子只是pass使用的一个场景,它可以在你新编写的代码时作为一个函数或者条件句体的占位符,允许你保持在更为抽象的层次上进行思考,pass
会被静默地忽略掉
当然,pass
通常用于"语法上需要一个语句,但程序什么动作也不做"的情状
while True:
pass
这通常用于创建最小的类
class MyEmptyClass:
pass
参数检查
虽然我们没有详细的学习函数的参数相关内容,但是我们在上文中创建的函数明显是有缺陷的,
既然是长方形的面积计算,那么我们不应该也不能够传入字符串等其他数据类型做乘法运算,对于自定义函数,系统不会自动帮你检测传入的参数是否合格
因此,我们需要在定义函数时就应该在函数内部设置一个"筛选机制"来进行参数的检查.
简单改造一下上面的例子
def rectangle_area(width,height):
if not isinstance(width,(int,float)):
raise TypeError('Bad operand type')
if not isinstance(height,(int,float)):
raise TypeError('Bad operand type')
area = width * height
return area
r_area = rectangle_area(100,"A")
print("100*200的长方形面积:{0:.2f}".format(r_area))
isinstance()
是一个内置函数,可以帮助我们判断数据的数据类型
TypeError Traceback (most recent call last)
<ipython-input-7-8327442e8212> in <module>
9 return area
10
---> 11 r_area = rectangle_area(100,"A")
12 print("100*200的长方形面积:{0:.2f}".format(r_area))
<ipython-input-7-8327442e8212> in rectangle_area(width, height)
4
5 if not isinstance(height,(int,float)):
----> 6 raise TypeError('Bad operand type')
7
8 area = width * height
TypeError: Bad operand type
小结
- 函数名称要符合标识符的命名规范
- 调用函数时,要确定函数的参数个数和调用位置
- 执行函数时,return可以作为函数结果的返回,也可以终止代码继续执行
- 空函数的函数体可以使用
pass
关键字 - 如果有必要,可以先对参数的数据类型进行检查