返回介绍

嵌套lambda和作用域

发布于 2024-01-29 22:24:16 字数 1345 浏览 0 评论 0 收藏 0

lambda是嵌套函数作用域查找(我们在第17章见到的LEGB原则中的E)的最大受益者。例如,在下面的例子中,lambda出现在def中(很典型的情况),并且在上层函数调用的时候,嵌套的lambda能够获取到在上层函数作用域中的变量名x的值。

在上一章中关于嵌套函数作用域的讨论没有表明的就是lambda也能够获取任意上层lambda中的变量名。这种情况有些隐晦,但是想象一下,如果我们把上一个例子中的def换成一个lambda。

这里嵌套的lambda结构让函数在调用时创建了一个函数。无论以上哪种情况,嵌套的lambda代码都能够获取在上层lambda函数中的变量x。这可以工作,但是这种代码让人相当费解。出于对可读性的要求,通常来说,最好避免使用嵌套的lambda。

为什么要在意:回调

lambda的另一个常见的应用就是为Python的tkinter GUI API(这个模块在Python 2.6中叫做Tkinter)定义行内的回调函数。例如,如下的代码创建了一个按钮,这个按钮在按下的时候会打印一行信息,假设tkinter在你的计算机上可用的话(它在Windows和其他操作系统上是默认打开的)。

这里,回调处理器是通过传递一个用lambda所生产的函数作为command的关键字参数。与def相比lambda的优点就是处理按钮动作的代码都在这里,嵌入了按钮创建的调用中。

实际上,lambda直到事件发生时才会调用处理器执行。在按钮按下时,编写的调用才发生,而不是在按钮创建时发生。

因为嵌套的函数作用域法则对lambda也有效,它们也使回调处理器变得更简单易用,自Python2.2之后,它们自动查找编写时所在的函数中的变量名,并且在绝大多数情况下,都不再需要传入参数默认参数。这对于获取特定的self实例参数是很方便的,这些参数是在上层的类方法函数中的本地变量(关于类的更多内容在第六部分介绍)。

在上一个发布版本中,self必须要作为默认参数来传入到lambda中。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文