《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 导读

简介:

e4644a5e699956d6b581af7e82246b25dc28daf5

前  言

本书面向有志于拓展及深化Python知识的读者,它将教你如何改进Python程序的质量、可靠性、速度、可维护性以及可用性。书中包含大量实用的范例与思路,可帮助大家提升Python编程水平。
本书有四大主题:用设计模式编写出优雅的代码、用并发和“编译过的Python”(也就是Cython)提升处理速度、高级网络编程,以及图形。
《Design Patterns: Elements of Reusable Object-Oriented Software》(详情参见附录B)一书虽然早在1995年就出版了,然而时至今日,依然深刻地影响着面向对象编程这一领域。本书从Python语言的角度重新审视前书所提到的每种设计模式,给出实用的Python范例,并解释为何Python程序员用不到某些模式。这些模式在第1章、第2章及第3章中讲解。
Python的GIL(Global Interpreter Lock,全局解释器锁)会阻止Python代码同时在多个处理器核心上运行。于是有人就误以为Python不支持多线程,或无法发挥多核硬件的优势。对于“计算密集型”(CPU-bound)程序来说,可以用multiprocessing模块实现并发,该模块不受GIL限制,可以完全利用每个核心。这样一来,处理速度就很容易提高了(大致同CPU的核心数成正比)。对于“I/O密集型”程序来说,我们既可以用multiprocessing模块来做,也可以用threading模块或concurrent.futures模块来做。实际上,使用threading模块来编写I/O密集型程序时,并不用担心由GIL所带来的开销,因为网络延迟的影响更大。
遗憾的是,在编写并发程序时,如果采用低级与中级方式,那么非常容易出错,任何编程语言都有这种问题。要想少出错,就不要使用“显式锁”(explicit lock),而是改用Python的queue及multiprocessing模块,这些模块提供了封装程度较高的“队列”(queue),此外,也可以改用concurrent.futures模块来做。第4章会告诉大家如何用封装程度较高的并发技术来大幅提高程序性能。
某些程序员之所以使用C、C++或其他“编译型语言”(compiled language)来编程,是因为他们还有另外一个错误的想法,那就是Python程序运行得很慢。一般来说,Python确实要比编译型语言慢,但在目前的硬件上面,用Python语言所编写的绝大部分应用程序的运行速度都足够快。即便有时Python程序真的不够快,我们也可以一边享受用Python编程所带来的好处,一边想办法提升其运行速度。
如果要给某些长期运行的程序提速,那么可以使用PyPy这款Python解释器(网址是pypy.org)。这是一种“即时编译器”(just-in-time compiler),可以极大提升程序执行速度。另外一种优化执行效率的方式是调用运行速度与编译后的C程序相仿的代码,对于“计算密集型”程序来说,用这种代码改写后,其执行速度很容易变成原来的100倍。要想使Python程序运行得和C程序一样快,最简单的办法就是调用那种底层以C语言来实现的Python模块。比方说,标准库里的array模块或第三方numpy模块都能飞快地处理数组,并且很省内存(多维数组可以用numpy来处理)。除此之外,还可以使用标准库的cProfile模块来探查程序的瓶颈,并用Cython来写对速度要求很高的那部分代码。这种写法实际上就是一套“增强版Python语言”(enhanced Python):写好的程序可以编译成纯C,从而使运行速度提升到极致。
当然,有时候我们所需的功能已经由现成的C或C++库实现好了,或者由采用“C语言调用约定”(C calling convention)的其他语言程序库实现好了。在大多数情况下,都能找到第三方Python模块来访问我们所需的那些程序库,这些模块可以在Python Package Index(简称PyPI,网址是pypi.python.org)里找到。不过在个别情况下可能找不到这种模块,此时可以用标准库的ctypes模块或第三方的Cython包来调用C程序库里的功能。采用已经实现好的C程序库来编写代码能够极大减少开发时间,而且C代码的运行速度也相当快。第5章讲解ctypes与Cython。
Python标准库提供了许多用于网络编程的模块,比如底层的socket模块、中层的socketserver模块,以及高层的xmlrpclib模块。把用其他语言所写的代码移植到Python时,可能会用到底层与中层网络模块,然而直接用Python编程时,通常不需要理会那些底层的细节,只需要用高层模块来实现所需的网络功能即可。第6章讲解如何使用标准库中的xmlrpclib模块以及功能强大且易用的第三方RPyC模块。
每个程序差不多都要提供某种用户界面,使用户可通过它来向程序下达指令。可以用argparse模块来编写Python程序,使其支持命令行界面;也可以用其他模块来编写,使其支持完整的终端用户界面(例如,在Unix系统上,可用第三方urwid包实现这种界面,此包的网址为excess.org/urwid)。此外,有许多Web框架能够实现出Web界面,比如轻量级的bottle框架(网址是bottlepy.org)、重量级的Django框架(网址是www.djangoproject.com)与Pyramid框架(网址是www.pylonsproject.org)。当然,除了上面说的这几种界面外,还可以创建具有“图形用户界面”(Graphical User Interface,GUI)的Python应用程序。
经常听到“Web程序将取代GUI程序”这种说法,不过现在还没发展到那一步。实际上,用户可能更喜欢GUI程序,而不是Web程序。比方说,在21世纪初智能手机刚开始流行时,用户总是爱用专门制作好的“app”而不是浏览器中的网页来处理日常事务。有许多第三方Python包都可用来编写GUI程序。本书第7章要介绍的Tkinter包位于Python标准库里,该章会告诉大家如何用它创建样式新潮的GUI程序。
目前大多数计算机(包括笔记本电脑及部分智能手机)都配有功能强大的图形渲染硬件,这种硬件通常是独立的GPU(Graphics Processing Unit,图形处理单元),能够绘制出绚丽的二维及三维图形。而大多数GPU都支持OpenGL API,所以Python程序员可以通过第三方包来调用这套API。第8章将会讲解怎样用OpenGL绘制三维图形。
本书旨在演示如何编写更好的Python程序,如何写出效率高、易维护且易于使用的Python代码。阅读之前,需要有Python编程基础,因为此书是写给已经学会Python语言用法的读者看的,大家应该已经读过Python的开发文档或是类似教程了,比如《Programming in Python 3, Second Edition》(详情参见附录B)等书。而这本书将提供一些有助于提升Python编程水平的思路、灵感与实用技巧。
本书全部范例代码都在Linux系统的Python 3.3版本下测试通过(笔者也尽量在Python 3.2及Python 3.1版本下测试过了),绝大部分代码还能在OS X与Windows操作系统中运行。可从本书网站www.qtrac.eu/pipbook.html下载范例代码,这些代码也应该能在后续的Python 3.x版本下运行。
致谢
与写其他技术书籍时一样,笔者写这本书时也得到了大家的诸多建议、帮助及鼓励,在此深表谢意。
Nick Coghlan从2005年起成为Python的核心开发者,他提供了大量建设性的批评意见,并展示了许多想法及代码片段,以此表明书中所讲的某些内容还有更好的实现方式。Nick对笔者改进本书内容帮助极大,尤其是前面几章。
Doug Hellmann是资深Python开发者与技术作者,他给笔者写了许多条非常有用的评论,从成书之前的出版提案到成书之后正文里的每一章都是如此。Doug还给笔者提供了许多思路,并为本书撰写了序。
两位友人Jasmin Blanchette与Trenton Schulz都是有经验的Python程序员,他们各自的研究方向迥然不同,但都位于本书所讲的范围之内。Jasmin与Trenton反馈了许多意见,使笔者能够据此改写正文及范例代码中的许多不够明晰之处。
感谢策划编辑Debra Williams Cauley,在成书过程中,他再次向我提供了支持和帮助。
感谢Elizabeth Ryan精心管理了本书的出版流程,感谢Anna V. Popick出色的校对工作。
最后,一如往常,感谢妻子Andrea的关爱与支持。

目  录

第1章 Python的创建型设计模式
1.1 抽象工厂模式
1.1.1 经典的抽象工厂模式
1.1.2 Python风格的抽象工厂模式
1.2 建造者模式
1.3 工厂方法模式
1.4 原型模式
1.5 单例模式

第2章 Python的结构型设计模式
2.1 适配器模式
2.2 桥接模式
2.3 组合模式
2.3.1 常规的“组合体/非组合体”式层级
2.3.2 只用一个类来表示组合体与非组合体
2.4 修饰器模式
2.4.1 函数修饰器与方法修饰器
2.4.2 类修饰器
2.5 外观模式
2.6 享元模式
2.7 代理模式

第3章 Python的行为型设计模式
3.1 责任链模式
3.1.1 用常规方式实现责任链
3.1.2 基于协程的责任链
3.2 命令模式
3.3 解释器模式
3.3.1 用eval()函数求表达式的值
3.3.2 用exec()函数执行代码
3.3.3 用子进程执行代码
3.4 迭代器模式
3.4.1 通过序列协议实现迭代器
3.4.2 通过双参数iter()函数实现迭代器
3.4.3 通过迭代器协议实现迭代器
3.5 中介者模式
3.5.1 用常规方式实现中介者
3.5.2 基于协程的中介者
3.6 备忘录模式
3.7 观察者模式
3.8 状态模式
3.8.1 用同一套方法来处理不同的状态
3.8.2 用不同的方法来处理不同的状态
3.9 策略模式
3.10 模板方法模式
3.11 访问者模式
3.12 案例研究:图像处理程序包
3.12.1 通用的图像处理模块
3.12.2 Xpm模块概述
3.12.3 PNG包装器模块

相关文章
|
15天前
|
设计模式 机器学习/深度学习 前端开发
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
|
6月前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
87 4
|
5月前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
80 0
|
4月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
4月前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
|
4月前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
4月前
|
设计模式 监控 算法
Python编程中的设计模式应用与实践感悟###
在Python这片广阔的编程疆域中,设计模式如同导航的灯塔,指引着开发者穿越复杂性的迷雾,构建出既高效又易于维护的代码结构。本文基于个人实践经验,深入探讨了几种核心设计模式在Python项目中的应用策略与实现细节,旨在为读者揭示这些模式背后的思想如何转化为提升软件质量的实际力量。通过具体案例分析,展现了设计模式在解决实际问题中的独特魅力,鼓励开发者在日常编码中积极采纳并灵活运用这些宝贵的经验总结。 ###
|
4月前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
78 2
|
4月前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
4月前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
37 1

热门文章

最新文章