欢迎光临散文网 会员登陆 & 注册

简明Python教程·更多&迈向下一步

2023-02-16 08:00 作者:琉璃汐阳  | 我要投稿

 更多

到现在,我们的介绍已经涵盖了你将使用到的 Python 的大部分方面。在本章中,我们将介绍 一些其它的方面,来让我们对 Python 的认识更加全面。


传递元组 

你可曾希望从一个函数中返回两个不同的值?你能做到的。只需要使用一个元组。


要注意到 a, b = <some expression> 的用法会将表达式的结果解释为具有两个值的一个元组。

这也意味着在 Python 中交换两个变量的最快方法是:



特殊方法 

诸如 __init__ __del__ 等一些方法对于类来说有特殊意义。 

特殊方法用来模拟内置类型的某些行为。举个例子,如果你希望为你的类使用 x[key] 索引 操作(就像你在列表与元组中使用的那样),那么你所需要做的只不过是实现 __getitem__() 方法,然后你的工作就完成了。如果你试图理解它,就想想 Python 就是对 list 类这样做的! 

下面的表格列出了一些有用的特殊方法。如果你想了解所有的特殊方法,请参阅手册

  • __init__(self, ...)

    • 这一方法在新创建的对象被返回准备使用时被调用。

  • __del__(self)

    • 这一方法在对象被删除之前调用(它的使用时机不可预测,所以避免使用它)

  • __str__(self)

    • 当我们使用 print 函数时,或 str() 被使用时就会被调用。

  •  __lt__(self, other)

    • 当小于运算符(<)被使用时被调用。类似地,使用其它所有运算符(+、> 等等) 时都会有特殊方法被调用。

  •  __getitem__(self, key)

    • 使用 x[key] 索引操作时会被调用。 

  •  __len__(self)

    • 当针对序列对象使用内置 len() 函数时会被调用 


单语句块 

我们已经见识过每一个语句块都由其自身的缩进级别与其它部分相区分。 是这样没错,不过 有一个小小的警告。如果你的语句块只包括单独的一句语句,那么你可以在同一行指定它, 例如条件语句与循环语句。下面这个例子应该能比较清楚地解释:

注意,单个语句是在原地立即使用的,它不会被看作一个单独的块。尽管,你可以通过这种 方式来使你的程序更加小巧,但除非是为了检查错误,我强烈建议你避免使用这种快捷方 法,这主要是因为如果你不小心使用了一个“恰到好处”的缩进,它就很容易添加进额外的语 句。


Lambda 表格

  lambda 语句可以创建一个新的函数对象。从本质上说, lambda 需要一个参数,后跟一个表 达式作为函数体,这一表达式执行的值将作为这个新函数的返回值。

案例(保存为 more_lambda.py ):

输出:

它是如何工作的 

要注意到一个 list sort 方法可以获得一个 key 参数,用以决定列表的排序方式(通 常我们只知道升序与降序)。在我们的案例中,我们希望进行一次自定义排序,为此我们需 要编写一个函数,但是又不是为函数编写一个独立的 def 块,只在这一个地方使用,因此我 们使用 Lambda 表达式来创建一个新函数。 


列表推导 

列表推导(List Comprehension)用于从一份现有的列表中得到一份新列表。想象一下,现在 你已经有了一份数字列表,你想得到一个相应的列表,其中的数字在大于 2 的情况下将乘以 2。列表推导就是这类情况的理想选择。

案例(保存为 more_list_comprehension.py ):

输出:

它是如何工作的 

在本案例中,当满足了某些条件时( if i > 2 ),我们进行指定的操作( 2*i ),以此来获 得一份新的列表。要注意到原始列表依旧保持不变。

使用列表推导的优点在于,当我们使用循环来处理列表中的每个元素并将其存储到新的列表 中时时,它能减少样板(Boilerplate)代码的数量。 


在函数中接收元组与字典 

有一种特殊方法,即分别使用 * ** 作为元组或字典的前缀,来使它们作为一个参数为 函数所接收。当函数需要一个可变数量的实参时,这将颇为有用。

因为我们在 args 变量前添加了一个 * 前缀,函数的所有其它的额外参数都将传递到 args 中,并作为一个元组予以储存。如果采用的是 ** 前缀,则额外的参数将被视为字典 的键值—值配对。


 assert 语句 

assert 语句用以断言(Assert)某事是真的。例如说你非常确定你正在使用的列表中至少包 含一个元素,并想确认这一点,如果其不是真的,就抛出一个错误, assert 语句就是这种情 况下的理想选择。当语句断言失败时,将会抛出 AssertionError

你应该明智地选用 assert 语句。在大多数情况下,它好过捕获异常,也好过定位问题或向 用户显示错误信息然后退出。


装饰器

装饰器(Decorators)是应用包装函数的快捷方式。这有助于将某一功能与一些代码一遍又一 遍地“包装”。举个例子,我为自己创建了一个 retry 装饰器,这样我可以将其运用到任何函 数之中,如果在一次运行中抛出了任何错误,它就会尝试重新运行,直到最大次数 5 次,并 且每次运行期间都会有一定的延迟。这对于你在对一台远程计算机进行网络调用的情况十分 有用:

输出:

它是如何工作的 

请参阅:

  • http://www.ibm.com/developerworks/linux/library/l-cpdecor.html

  • http://toumorokoshi.github.io/dry-principles-through-python-decorators.html 


Python 2Python 3 的不同 

请参阅:

  • "Six" library 

  • Porting to Python 3 Redux by Armin 

  • Python 3 experience by PyDanny 

  • Official Django Guide to Porting to Python 3 

  • Discussion on What are the advantages to python 3.x? 


总结

我们在本章中介绍了有关 Python 的更多功能,不过我们还未涵盖到 Python 的所有功能。不 过,在这一阶段,我们已经涉猎了大多数你将在实践中遇到的内容。这足以让你开始编写任 何你所期望的程序。

 接下来,我们将讨论如何进一步探索 Python

迈出下一步

如果到现在你已经阅读过本书并且编写了许多程序,那么你一定已经开始熟悉并且习惯 Python 了。或许你已经创建了一些 Python 程序来尝试完成一些工作,同时锻炼你自己的 Python 技能。如果你尚未至此,你也应该作出努力。现在我们面临的问题是“下一步该做什 么?”。

 我会建议你试图解决这个问题: 

编写一款你自己的命令行地址簿程序,你可以用它浏览、添加、编辑、删除或搜索你的 联系人,例如你的朋友、家人、同事,还有他们诸如邮件地址、电话号码等多种信息。 这些详细信息必须被妥善储存以备稍后的检索。

如果你回想至今我们学过、讨论过、遇见过的所有东西,你会发现这其实非常简单。如果你 仍想要有关如何进行的提示,这儿倒是有一些。

一旦你能够做到这件事,你便可以说自己是一名 Python 程序员了。现在,赶快写封邮件来感 谢我写出了这么棒的一本书 ;-)。这一步并非强制但我仍建议如此。同时,请考虑购买本书的 实体书来支持本书的后续改进。

 如果你觉得上面的程序太容易了,这还有另一个: 

实现替换命令。这个命令能将一串字符串替换为另外提供的文件或列表中的另一串。

 只要你想,替换命令可以或简单或复杂地实现,从简单的字符串替换到搜寻搭配的样式(正 则表达式)。


 下一个项目 

如果你发现上面的程序都能很容易地编写出来,那么看看下面这个完整的项目列表,并尝试 编写你自己的程序:https://github.com/thekarangoel/Projects#numbers (这一列表与 Martyr2 的超级项目列表相同)。

 你还可以看看:

  • Exercises for Programmers: 57 Challenges to Develop Your Coding Skills 

  • Intermediate Python Projects 


示例代码 

学习一门编程语言的最好方式就是编写大量代码,并阅读大量代码:

  • Python Cookbook 是一本极具价值的“烹饪法”与提示的集合,它介绍了如何通过 Python 解决某些特定类型的问题。

  • Python Module of the Week 是另一本优秀的标准库必读指南。


 建议

  • The Hitchhiker's Guide to Python! 

  • The Elements of Python Style 

  • Python Big Picture 

  • "Writing Idiomatic Python" ebook (付费)


视频

  • Full Stack Web Development with Flask 

  • PyVideo 


问与答

  • Official Python Dos and Don'ts

  • Official Python FAQ

  • Norvig's list of Infrequently Asked Questions 

  • Python Interview Q & A 

  • StackOverflow questions tagged with python 


教程

  • Hidden features of Python

  • What's the one code snippet/python trick/etc did you wish you knew when you learned python?

  •  Awaretek's comprehensive list of Python tutorials 


讨论

如果你遇到了一个 Python 问题,但不知道该问谁,那么 python-tutor list 是你提问的最佳场 所。 

请确保你会自己做你的家庭作业,你会首先尝试自己解决问题,同时,还要会问聪明的问 题


新闻

如果你希望了解 Python 世界的最新动态,那就跟随 Official Python Planet 的脚步吧。


安装库 

Python 库索引中包含了大量开源的库,你可以在你自己的程序中使用它们。

 要想了解如何安装并使用这些库,你可以使用 pip


 创建一个网站 

学习使用 Flask 来创建你自己的网站。下面这些资源有助于你开始学习:

  • Flask Official Quickstart 

  • The Flask Mega-Tutorial

  • Example Flask Projects 


图形软件 

假设你希望使用 Python 来创建你自己的图形程序。这可以通过采用一个 GUIGraphical User Interface,图形用户界面)库和它们的 Python 绑定来实现。绑定是允许你用 Python 编 写你自己的程序,然后使用它们在 CC++ 或其它语言写编写的库。 

使用 PythonGUI 有许多选择:

  •  Kivy

    • http://kivy.org 

  • PyGTK

    • 这是 GTK+ 工具包的 Python 绑定,它是构建 GNOME 的基础。GTK+ 有许多奇怪 的用法,但是你一旦习惯了使用它,就能很快的创建出你的 GUI 应用。Glade 图形 界面设计工具是不可或缺的。它的文档至今仍在不断改进。GTK+GNU/Linux 下 能够良好工作,但是它针对 Windows 平台的移植工作尚未完成。你可以使用 GTK+ 创建免费或专有的软件。要想开始使用,请阅读 PyGTK 教程。 

  • PyQt 

    • Qt 工具包的 Python 绑定,它是构建 KDE 的基础。 受益于 Qt Designer 与令 人惊讶的 Qt 文档,Qt 十分容易使用也十分强大。如果你希望创建一款开源 (GPL)软件,你可以免费使用 PyQt,不过如果你想创建专有的比原软件,你需要购买它。从 Qt 4.5 开始你可以使用它来创建不采用 GPL 授权的软件。要想开始使用,请阅读 PySide

wxPython 

这是 wxWidgets 工具包的 Python 绑定。wxPython 有一个与之相关的学习曲线。不 过,它非常便携,并且可以运行在 GNU/Linux、Windwos、Mac、甚至是嵌入式平台中。有许多 IDE 可以采用 wxPython,并且包含了 GUI 设计工具,例如 SPE (Stani's Python Editor) 还有 wxGlade GUI 构建工具。你可以使用 wxPython 来创建 免费或专有的软件。要想开始使用,请阅读wxPython 教程


 GUI 工具总结 

想要了解更多的选择,可以参阅 GuiProgramming wiki page at the official python website

不幸的是,Python 没有一款标准 GUI 工具。我建议你根据你的实际情况从上面列出的工具中 进行挑选。第一个因素是你是否愿意为使用任何 GUI 工具付费。第二个因素是你希望你的程 序只在 Windwos 上运行,还是在 MacGNU/Linux 上运行,还是在它们三者之上都能运 行。第三个因素,如果 GNU/Linux 是目标平台,那你是要做 KDE 用户还是 GNOME 用户。

有关更详尽且更全面的分析,请参阅 'The Python Papers, Volume 3, Issue 1' (PDF) 的第 26 页。


各种实现 

编程语言主要有两部分——语言与软件。语言是你如何编写,软件是你怎样实际运行我们的 程序。 

我们一直在使用 CPython 软件来运行我们的程序。它被成为 CPython 是因为它是使用 C 语 言编写的,同时它也是经典的(ClassicalPython 解释器。

 还有其他软件可以运行你的 Python 程序:

  •  Jython 

    • Java 平台上运行的 Python 实现。这意味着你可以在 Python 语言中使用 Java 的 库与类,反之亦然。

  •  IronPython

    • .NET 平台上运行的 Python 实现。这意味着你可以在 Python 语言中使用 .NET 的库与类,反之亦然。

  • PyPy

    • Python 编写的 Pyhon 实现!这是一项研究项目,旨在于使其能快速且方便的改 进解释器,因为解释器本身就是用动态语言编写的了(而不是采用上述三种 C、 Java、C# 等动态语言来编写)。

还有其它诸如 CLPython——采用 Common Lisp 编写的 Python 实现,和Brython ,它在 JavaScript 解释器之上实现,意味着你可以使用 Python(而非 JavaScript)编写你的 Web 浏 览器(“Ajax”)程序。 

上述这些实现每一种都有其大有作为的专门领域。 


函数式编程(面向高阶读者)

当你开始编写更加庞大的程序时,你应该清楚了解更多关于使用函数的方式来进行编程,而 不是我们在《面向对象编程》章节中所学习的基于类的方式进行编程:

  • Functional Programming Howto by A.M. Kuchling 

  • Functional programming chapter in 'Dive Into Python' book 

  • Functional Programming with Python presentation 

  • Funcy library 

  • PyToolz library 


总结

现在我们已经行至本书末尾,不过,正如人们所说,这是昭示着开始的终结!你现在已经是 一名狂热 Python 用户,毫无疑问,你已准备好通过 Python 来解决诸多问题了。你可以开始 自动化你的电脑,去做任何你以前难以想象的事情,你可以开始编写你自己的游戏,开始做 更多更多的事,远不仅此。来,让我们出发吧!

  1. 本章所提供的所有学习资源均为英文,故对于其标题不作翻译。 ↩ 

  2. 创建一个类用来表示人的信息。使用一份字典来存储人物对象,将它们的名字当作键 值。使用 pickle 模块来将对象长久地存储在硬盘上。使用字典的内置方法来添加、删除 或编辑地址簿中的人物。——原书注 ↩



未完待续......

简明Python教程·更多&迈向下一步的评论 (共 条)

分享到微博请遵守国家法律