python 使用函数模块化代码

373 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

使用函数模块化代码

到目前为止,我们实现的所有功能都很小。它们非常适合放在一个页面上。随着我们实现更复杂的功能,将功能拆分为多个功能非常方便,每个功能都做一件简单的事情。为了说明这个想法,我们有点多余地将find_root拆分为三个单独的函数,如图4-8所示。每个函数都有自己的规范,每个函数作为独立实体都有意义。函数 find 根边界 查找根必须位于其中的区间,bisection_solve使用二分搜索来搜索此区间以查找根的近似值,find_root只需调用其他两个并返回根。

此版本的find_root是否比原始的整体式实现更容易理解?可能不是。一个很好的经验法则是,如果一个函数可以舒适地放在一个页面上,它可能不需要细分就很容易理解。

image.png

作为对象的函数

在Python中,函数是一类对象。这意味着它们可以被视为任何其他类型的对象,例如int或列表。它们具有类型,例如,表达式类型(abs)具有<类型“built-in_function_or_method”>的值;它们可以出现在表达式中,例如,作为赋值语句的右侧或作为函数的参数;它们可以由函数返回;等。

使用函数作为参数允许一种称为高阶编程的编码风格。它允许我们编写通常有用的函数。例如,Eigure 4-8 中的函数bisection_solve可以重写,以便可以将其应用于根查找以外的任务,如图 4-9 所示。

image.png

我们首先将整数参数幂替换为一个函数,eval_ans,该函数将浮点数映射到浮点数。然后,我们将表达式 ans**幂的每个实例替换为调用eval_ans (ans)的函数。

如果我们想使用新的bisection_solve来打印99的平方根的近似值,我们可以运行代码

image.png

麻烦地定义一个函数来做一些简单的事情,比如平方一个数字似乎有点愚蠢。幸运的是,Python支持使用保留字lambda创建匿名函数(即不绑定到名称的函数)。lambda 表达式的一般形式为

image.png

例如,lambda 表达式 lambda x, y: x*y 返回一个函数,该函数返回其两个参数的乘积。Lambda 表达式经常用作高阶函数的参数。例如,我们可以将上面对bisection_solve的调用替换为

image.png