[Python系列] Python函数及函数式编程(二)

第一节 定义函数

函数定义

在前面的学习过程中,我们用到了一些函数,例如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))

上述代码中:

  1. 通过def定义了计算长方形面积的函数,他有两个参数,分别是长方形的宽和高.
  2. 函数体是我们计算长方形面积的表达式,结果赋值给area,然后通过return返回我们所要的数据
  3. 我们通过函数名rectangle加小括号的形式对函数进行调用执行
  4. 执行过程中,我们在小括号内传入实际需要参与运算的数据(实参)
  5. 实参被赋给了参数列表,函数开始执行

关于函数的执行过程,我们先了解到这里,当我们学习了函数参数和作用域之后,再对函数执行过程进行进一步的总结.

注意:

  1. 现阶段,我们在函数调用时,如果传入的参数个数和函数定义时不符合,系统会报错

    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'
    
  2. 函数的调用通常情况下是在函数声明之后,否则可能出现报错

    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

小结

  1. 函数名称要符合标识符的命名规范
  2. 调用函数时,要确定函数的参数个数和调用位置
  3. 执行函数时,return可以作为函数结果的返回,也可以终止代码继续执行
  4. 空函数的函数体可以使用pass关键字
  5. 如果有必要,可以先对参数的数据类型进行检查
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值