2.1.5 嵌套函数

本书中用到的另一个技巧是在函数内部定义函数。这样做有两个很好的理由:一是,它允许内部函数访问外部函数的所有信息,而不需要将这些信息作为参数传递;二是,内部函数可以定义一些对外部世界不可见的逻辑。

使用常规语法即可在函数中定义函数。让我们看一个例子:

这里,inner_fn函数是在outer_fn函数内部定义的,因此,它不能从主函数的外部访问,只能从其内部访问。inner_fn函数可以访问outer_fn中定义的所有内容,包括函数参数。

当函数的逻辑变得复杂,且可以被分解时,在函数内部定义子函数很有用。当然,我们也可以将函数分解成同一级别的简单函数。在这种情况下,为了表明这些子函数不从模块外部导入和使用,我们需要遵循Python的标准,将函数名称写成两个下划线开头的形式:

注意,Python没有访问修饰符(公共、专用……),因此,在模块顶层(即Python文件)编写的所有代码都可以被导入和使用。

记住,这两个下划线只是表示一个我们应该遵守的约定。实际上并没有阻止我们导入和使用这些代码。在导入以两个下划线开头的函数时,我们必须明白,该函数的作者并不希望其被外部引用;如果调用该函数,结果可能在意料之外。通过在被调用的函数内部定义子函数,我们可以避免这种行为。