Skip to Content
《学习 Python》第 5 版
book

《学习 Python》第 5 版

by Mark Lutz
May 2025
Intermediate to advanced
1648 pages
23h 5m
Chinese
O'Reilly Media, Inc.
Content preview from 《学习 Python》第 5 版

第 19 章 高级函数专题 高级功能主题

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

本章将介绍一系列更高级的函数相关主题:递归函数、函数属性和注解、lambda 表达式,以及函数式编程工具(如mapfilter )。这些都是有些高级的工具,根据你的工作内容,你可能不会经常遇到。不过,由于它们在某些领域中的作用,对它们有一个基本的了解还是很有用的;例如,lambda是图形用户界面中的常客,而函数式编程技术在 Python 代码中也越来越常见。

使用函数的部分艺术在于它们之间的接口,因此我们还将在此探讨一些一般的函数设计原则。 下一章将继续这一高级主题,探讨生成器函数和表达式,并结合我们将在此学习的函数工具重新探讨列表理解。

功能设计理念

现在,我们已经有机会学习 Python 中的函数基础知识了,让我们在本章开始时介绍一下上下文。当您开始认真地使用函数时,您将面临如何将组件粘合在一起的选择--例如,如何将任务分解成有目的的函数(称为内聚),您的函数应该如何通信(称为耦合 ),等等。您还需要考虑函数的大小等概念,因为它们会直接影响代码的可用性。其中有些属于结构化分析和设计的范畴,但它适用于 Python 代码,也适用于其他代码。

第 17 章学习作用域时,我们介绍了与函数和模块耦合相关的一些观点,下面将为初识函数设计原则的读者回顾一些一般性指导原则:

  • 耦合:输入使用参数,输出使用return用于输出。一般来说,您应该努力使函数独立于外部事物。参数和return 语句通常是将外部依赖关系隔离到代码中少数众所周知的地方的最佳方法。

  • 耦合:只有在真正必要时才使用全局变量。全局变量(即外层模块中的名称)通常是函数进行通信的不良方式,它们会产生依赖性和时序问题,使程序难以调试、更改和重用。

  • 耦合:除非调用者期望,否则不要更改可变参数。函数可以更改传入的可变对象的部分内容,但(与全局变量一样)这会在调用者和被调用者之间产生紧密耦合,从而使函数过于特殊和脆弱。

  • 凝聚力:每个功能都应有一个统一的目的。如果设计得好,每个函数都应该只做一件事--可以用一个简单的陈述句来概括。如果这个句子非常宽泛(例如 "这个函数实现了我的整个程序"),或者包含大量的连接词(例如 "这个函数给员工加薪提交披萨订单"),您可能需要考虑将其拆分成更简单的独立函数。 否则,就无法重复使用函数中混合在一起的步骤背后的代码。

  • 大小:每个功能都应相对较小。这自然是根据前面的目标得出的,但如果您的函数开始在显示屏上横跨多个页面,那么可能是时候拆分它们了。特别是考虑到 Python 代码一开始就非常简洁,一个长的或嵌套很深的函数往往是设计问题的征兆。保持简单,保持简短。

  • 耦合:避免直接更改另一个模块文件中的变量。我们在第 17 章中介绍了这一概念,在本书下一部分讨论模块时,我们将再次讨论这一概念。不过,作为参考,请记住,跨文件边界改变变量会在模块间产生耦合,这与全局变量耦合函数的情况类似--模块会变得难以理解和重用。尽可能使用 访问函数,而不是直接赋值语句。

图 19-1总结了函数与外部世界对话的方式;输入可能来自左侧的项目,结果可能以右侧的任何形式发送出去。优秀的函数设计者倾向于尽可能只使用参数作为输入,使用return语句作为输出。

图 19-1. ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

学习 Java,第 6 版

学习 Java,第 6 版

Marc Loy, Patrick Niemeyer, Daniel Leuck
《高性能 Python》第二版

《高性能 Python》第二版

Micha Gorelick, Ian Ozsvald

Publisher Resources

ISBN: 9798341656963