![机械工程师Python编程:入门、实战与进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/439/51753439/b_51753439.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.1.5 嵌套函数
本书中用到的另一个技巧是在函数内部定义函数。这样做有两个很好的理由:一是,它允许内部函数访问外部函数的所有信息,而不需要将这些信息作为参数传递;二是,内部函数可以定义一些对外部世界不可见的逻辑。
使用常规语法即可在函数中定义函数。让我们看一个例子:
![](https://epubservercos.yuewen.com/AE06E7/30549606304263306/epubprivate/OEBPS/Images/51_05.jpg?sign=1734600810-B65PNgLpkqDsrbmBgqePyiQJByv3ZjPt-0-8fb4c69499afeb65497c2702976fe28e)
这里,inner_fn函数是在outer_fn函数内部定义的,因此,它不能从主函数的外部访问,只能从其内部访问。inner_fn函数可以访问outer_fn中定义的所有内容,包括函数参数。
当函数的逻辑变得复杂,且可以被分解时,在函数内部定义子函数很有用。当然,我们也可以将函数分解成同一级别的简单函数。在这种情况下,为了表明这些子函数不从模块外部导入和使用,我们需要遵循Python的标准,将函数名称写成两个下划线开头的形式:
![](https://epubservercos.yuewen.com/AE06E7/30549606304263306/epubprivate/OEBPS/Images/52_01.jpg?sign=1734600810-q4HYdObqPHN8UkrIovdBBzoyahy7pX1y-0-0f9839faf7b1939789a78e4870abb0dd)
注意,Python没有访问修饰符(公共、专用……),因此,在模块顶层(即Python文件)编写的所有代码都可以被导入和使用。
记住,这两个下划线只是表示一个我们应该遵守的约定。实际上并没有阻止我们导入和使用这些代码。在导入以两个下划线开头的函数时,我们必须明白,该函数的作者并不希望其被外部引用;如果调用该函数,结果可能在意料之外。通过在被调用的函数内部定义子函数,我们可以避免这种行为。