资讯专栏INFORMATION COLUMN

SICP Python 描述 1.4 实践指南:函数的艺术

lemon / 2759人阅读

摘要:实践指南函数的艺术来源译者飞龙协议函数是所有程序的要素,无论规模大小,并且在编程语言中作为我们表达计算过程的主要媒介。目前为止,我们讨论了函数的形式特性,以及它们如何使用。第一行描述函数的任务。

1.4 实践指南:函数的艺术

来源:1.4 Practical Guidance: The Art of the Function

译者:飞龙

协议:CC BY-NC-SA 4.0

函数是所有程序的要素,无论规模大小,并且在编程语言中作为我们表达计算过程的主要媒介。目前为止,我们讨论了函数的形式特性,以及它们如何使用。我们现在跳转到如何编写良好的函数这一话题。

每个函数都应该只做一个任务。这个任务可以使用短小的名称来定义,使用一行文本来标识。顺序执行多个任务的函数应该拆分在多个函数中。

不要重复劳动(DRY)是软件工程的中心法则。所谓的DRY原则规定多个代码段不应该描述重复的逻辑。反之,逻辑应该只实现一次,指定一个名称,并且多次使用。如果你发现自己在复制粘贴一段代码,你可能发现了一个使用函数抽象的机会。

函数应该定义得通常一些,准确来说,平方并不是在 Python 库中,因为它是pow函数的一个特例,这个函数计算任何数的任何次方。

这些准则提升代码的可读性,减少错误数量,并且通常使编写的代码总数最小。将复杂的任务拆分为简洁的函数是一个技巧,它需要一些经验来掌握。幸运的是,Python 提供了一些特性来支持你的努力。

1.4.1 文档字符串

函数定义通常包含描述这个函数的文档,叫做文档字符串,它必须在函数体中缩进。文档字符串通常使用三个引号。第一行描述函数的任务。随后的一些行描述参数,并且澄清函数的行为:

>>> def pressure(v, t, n):
        """Compute the pressure in pascals of an ideal gas.

        Applies the ideal gas law: http://en.wikipedia.org/wiki/Ideal_gas_law

        v -- volume of gas, in cubic meters
        t -- absolute temperature in degrees kelvin
        n -- particles of gas
        """
        k = 1.38e-23  # Boltzmann"s constant
        return n * k * t / v

当你以函数名称作为参数来调用help时,你会看到它的文档字符串(按下q来退出 Python 帮助)。

>>> help(pressure)

编写 Python 程序时,除了最简单的函数之外,都要包含文档字符串。要记住,代码只编写一次,但是会阅读多次。Python 文档包含了文档字符串准则,它在不同的 Python 项目中保持一致。

1.4.2 参数默认值

定义普通函数的结果之一就是额外参数的引入。具有许多参数的函数调用起来非常麻烦,也难以阅读。

在 Python 中,我们可以为函数的参数提供默认值。调用这个函数时,带有默认值的参数是可选的。如果它们没有提供,默认值就会绑定到形式参数的名称上。例如,如果某个应用通常用来计算一摩尔粒子的压强,这个值就可以设为默认:

>>> k_b=1.38e-23  # Boltzmann"s constant
>>> def pressure(v, t, n=6.022e23):
        """Compute the pressure in pascals of an ideal gas.

        v -- volume of gas, in cubic meters
        t -- absolute temperature in degrees kelvin
        n -- particles of gas (default: one mole)
        """
        return n * k_b * t / v
>>> pressure(1, 273.15)
2269.974834

这里,pressure的定义接受三个参数,但是在调用表达式中只提供了两个。这种情况下,n的值通过def语句的默认值获得(它看起来像对n的赋值,虽然就像这个讨论暗示的那样,更大程度上它是条件赋值)。

作为准则,用于函数体的大多数数据值应该表示为具名参数的默认值,这样便于查看,以及被函数调用者修改。一些值永远不会改变,就像基本常数k_b,应该定义在全局帧中。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45484.html

相关文章

  • SICP Python描述 1.1 引言

    摘要:另一个赋值语句将名称关联到出现在莎士比亚剧本中的所有去重词汇的集合,总计个。表达式是一个复合表达式,计算出正序或倒序出现的莎士比亚词汇集合。在意图上并没有按照莎士比亚或者回文来设计,但是它极大的灵活性让我们用极少的代码处理大量文本。 1.1 引言 来源:1.1 Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 计算机科学是一个极其宽泛的学科。全球的分布...

    xumenger 评论0 收藏0
  • SICP Python 描述 1.5 控制

    摘要:函数体由表达式组成。我们说头部控制语句组。于是,函数体内的赋值语句不会影响全局帧。包含了多种假值,包括和布尔值。布尔值表示了逻辑表达式中的真值。执行测试以及返回布尔值的函数通常以开头,并不带下划线例如等等。返回值之后会和预期结果进行比对。 1.5 控制 来源:1.5 Control 译者:飞龙 协议:CC BY-NC-SA 4.0 我们现在可以定义的函数能力有限,因为我们还不知...

    mingzhong 评论0 收藏0
  • SICP Python 描述 1.3 定义新函数

    摘要:到目前为止,我们的环境只包含全局帧。要注意函数名称是重复的,一个在帧中,另一个是函数的一部分。运算符字表达式是全局帧中发现的名称,绑定到了内建的加法函数上。严格来说,这并不是问题所在不同局部帧中的的绑定是不相关的。 1.3 定义新的函数 来源:1.3 Defining New Functions 译者:飞龙 协议:CC BY-NC-SA 4.0 我们已经在 Python 中认识...

    SegmentFault 评论0 收藏0
  • SICP Python 描述 第二章 使用对象构建抽象 2.1 引言

    摘要:对象表示信息,但是同时和它们所表示的抽象概念行为一致。通过绑定行为和信息,对象提供了可靠独立的日期抽象。名称来源于实数在中表示的方式浮点表示。另一方面,对象可以表示很大范围内的分数,但是不能表示所有有理数。 2.1 引言 来源:2.1 Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 在第一章中,我们专注于计算过程,以及程序设计中函数的作用。我们看到了...

    phoenixsky 评论0 收藏0
  • SICP Python 描述 1.6 高阶函数

    摘要:操作函数的函数叫做高阶函数。这一节展示了高阶函数可用作强大的抽象机制,极大提升语言的表现力。新的环境特性高阶函数。这是因为局部函数的函数体的求值环境扩展于定义处的求值环境。这种命名惯例并不由解释器强制,只是函数名称的一部分。 1.6 高阶函数 来源:1.6 Higher-Order Functions 译者:飞龙 协议:CC BY-NC-SA 4.0 我们已经看到,函数实际上是...

    freecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<