Skip to content

Commit

Permalink
Correct typos and translation errors. Fix LenKiMo#1.
Browse files Browse the repository at this point in the history
  • Loading branch information
LenKiMo committed Nov 1, 2017
1 parent 380952e commit 7f9d591
Show file tree
Hide file tree
Showing 9 changed files with 28 additions and 26 deletions.
4 changes: 3 additions & 1 deletion 03.2.translator-preface.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,6 @@

2017 年 7 月 6 日,进行了错字漏字订正。在 shuizhongyueming 的帮助下修改了《运算符与表达式》《安装》《面向对象编程》章节的错误。在 Leon0824 的帮助下修改了《基础》《函数》《模块》几章的错误。依 cobeeee 指正修改了《翻译》一章的错误。依 Alexander Nie 的指正调整了《函数》章节的部分内容。依 192\*\*\*\*543 指正修改了《第一步》章节的错误。依 薛景老师 指正改正了《关于 Python》章节的错误。依 genkagen 指正改正了《异常》《输入与输出》章节的错误。依 nastydt 指正改正了《面向对象编程》《运算符与表达式》一章的错误。依 wang454 指正改正了某一示例程序的错误。——以上修订体现在 4.05c 版中。

2017 年 7 月 28 日,进行了错字漏字订正。依 David Wang 的指正改正了《更多》《迈出下一步》章节的错误。依 薛景老师 指正改成了《第一步》《基础》《运算符与表达式》《控制流》章节的错误。依 Lulu Zeng 指正修改了《面向对象编程》章节的错误。依 LazyWolf Lin 指正与建议修改了《控制流》《函数》章节的错误与措辞。依 Kuno Kuno 指正修改了《面向对象编程》章节的错误。依 Cobeee 指正修改了《本书由来》章节的错误。本次修订得到了 Haruki Kirigaya 的协助,他参与修改了部分上述提到的错误,并指出了其它错误,具体章节包括《第一步》《基础》《运算符与表达式》《控制流》《函数》《解决问题》《面向对象编程》《异常》,在此深表感谢。——以上修订体现在 4.06c 版中。
2017 年 7 月 28 日,进行了错字漏字订正。依 David Wang 的指正改正了《更多》《迈出下一步》章节的错误。依 薛景老师 指正改成了《第一步》《基础》《运算符与表达式》《控制流》章节的错误。依 Lulu Zeng 指正修改了《面向对象编程》章节的错误。依 LazyWolf Lin 指正与建议修改了《控制流》《函数》章节的错误与措辞。依 Kuno Kuno 指正修改了《面向对象编程》章节的错误。依 Cobeee 指正修改了《本书由来》章节的错误。本次修订得到了 Haruki Kirigaya 的协助,他参与修改了部分上述提到的错误,并指出了其它错误,具体章节包括《第一步》《基础》《运算符与表达式》《控制流》《函数》《解决问题》《面向对象编程》《异常》,在此深表感谢。——以上修订体现在 4.06c 版中。

2017 年 11 月 1 日,对错字漏字以及误译错译进行了集中修订。依 Lyfeway 指正修改了《数据结构》《面向对象编程》一章的错误。依单行道指正修改了《附录:本书由来》一章的错误。依 Starnight Cyber 指正修改了《基础》一章的错误。依chchuj 指正修改了《面向对象编程》一章的错误。依 YangtseSu 指正修改了《模块》一章的错误。依小陈指正改正了《数据结构》一章的错误。依夜雨指正改正了《函数》一章的错误。在本次修订过程中,来自 Little Train Branch 群组的朋友 Haruka、Haruki Kirigaya、Yuki Kiriyama、藍星アキラ 检查了修订草稿,并对多处修订方案提出了具体的建议,同时还指出了先前尚未发现的错误,在此向他们表示感谢。——以上修订体现在 4.07c 版中。
4 changes: 2 additions & 2 deletions 07.basics.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ Why is Swaroop playing with that python?
name + 'is' +str(age) + 'years old'
```

但这样实现是很丑陋的,而且也容易出错。其次,转换至字符串的工作将由 `format` 方法自动完成,而不是如这般需要明确转换至字符串。再次,当时用 `format` 方法时,我们可以直接改动文字而不必与变量打交道,反之亦然。
但这样实现是很丑陋的,而且也容易出错。其次,转换至字符串的工作将由 `format` 方法自动完成,而不是如这般需要明确转换至字符串。再次,当使用 `format` 方法时,我们可以直接改动文字而不必与变量打交道,反之亦然。

同时还应注意数字只是一个可选选项,所以你同样可以写成:

Expand Down Expand Up @@ -304,7 +304,7 @@ This is the second line.

下面是这一程序的工作原理。首先,我们使用赋值运算符(`=`)将字面常量数值 `5` 赋值给变量 `i`。这一行被称之为声明语句(Statement)因为其工作正是声明一些在这一情况下应当完成的事情:我们将变量名 `i` 与值 `5` 相连接。然后,我们通过 `print` 语句来打印变量 `i` 所声明的内容,这并不奇怪,只是将变量的值打印到屏幕上。

接着,我们将 `1` 加到 `i` 变量所存储的值中,并将得出的结果重新存储进这一变量。尔后我们将这一变量打印出来,并期望得到的值应为 `6`
接着,我们将 `1` 加到 `i` 变量所存储的值中,并将得出的结果重新存储进这一变量。然后我们将这一变量打印出来,并期望得到的值应为 `6`

类似地,我们将字面文本赋值给变量 `s`,并将其打印出来。

Expand Down
2 changes: 1 addition & 1 deletion 10.functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

函数可以通过关键字 `def` 来定义。这一关键字后跟一个函数的*标识符*名称,再跟一对圆括号,其中可以包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。下面的案例将会展示出这其实非常简单:

案例(保存为 `functon1.py`):
案例(保存为 `function1.py`):

<pre><code class="lang-python">{% include "./programs/function1.py" %}</code></pre>

Expand Down
8 changes: 4 additions & 4 deletions 11.modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,12 @@ $ python
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# only few entries shown here
# 此处只展示部分条目

# 给出当前模块的属性名称
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__']
'__name__', '__package__','sys']

# 创建一个新的变量 'a'
>>> a = 5
Expand All @@ -165,7 +165,7 @@ $ python

首先我们看到的是 `dir` 在被导入的 `sys` 模块上的用法。我们能够看见它所包含的一个巨大的属性列表。

随后,我们以不传递参数的形式使用 `dir` 函数。在默认情况下,它将返回当前模块的属性列表。要注意到被导入进来的模块所能生成的列表也会是这一列表的一部分
随后,我们以不传递参数的形式使用 `dir` 函数。在默认情况下,它将返回当前模块的属性列表。要注意到被导入模块的列表也会是这一列表的一部分

给了观察 `dir` 函数的操作,我们定义了一个新的变量 `a` 并为其赋予了一个值,然后在检查 `dir` 返回的结果,我们就能发现,同名列表中出现了一个新的值。我们通过 `del` 语句移除了一个变量或是属性,这一变化再次反映在 `dir` 函数所处的内容中。

Expand All @@ -181,7 +181,7 @@ $ python

包是指一个包含模块与一个特殊的 `__init__.py` 文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了 Python 模块。

建设你想创建一个名为“world”的包,其中还包含着 ”asia“、”africa“等其它子包,同时这些子包都包含了诸如”india“、”madagascar“等模块。
让我们这样设想:你想创建一个名为“world”的包,其中还包含着 “asia”、“africa”等其它子包,同时这些子包都包含了诸如“india”、 “madagascar”等模块。

下面是你会构建出的文件夹的结构:

Expand Down
4 changes: 2 additions & 2 deletions 12.data_structures.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ Python 中有四种内置的数据结构——_列表(List)、元组(Tuple

我们可以通过我们的老朋友——`del` 语句——来删除某一键值—值配对。我们只需指定字典、包含需要删除的键值名称的索引算符,并将其传递给 `del` 语句。这一操作不需要你知道与该键值相对应的值。

接着,我们通过使用字典的 `item` 方法来访问字典中的每一对键值—值配对信息,这一操作将返回一份包含元组的列表,每一元组中则包含了每一对相应的信息——键值以及其相应的值。我们检索这一配对,并通过 `for...in` 循环将每一对配对的信息相应地分配给 `name``address` 变量,并将结果打印在 `for` 代码块中。
接着,我们通过使用字典的 `items` 方法来访问字典中的每一对键值—值配对信息,这一操作将返回一份包含元组的列表,每一元组中则包含了每一对相应的信息——键值以及其相应的值。我们检索这一配对,并通过 `for...in` 循环将每一对配对的信息相应地分配给 `name``address` 变量,并将结果打印在 `for` 代码块中。

如果想增加一堆新的键值—值配对,我们可以简单地通过使用索引运算符访问一个键值并为其分配与之相应的值,就像我们在上面的例子中对 Guido 键值所做的那样。

Expand Down Expand Up @@ -229,7 +229,7 @@ True

**它是如何工作的**

在这里,我们会看见一此操作中包含了好多字符串方法。`startwith` 方法用于查找字符串是否以给定的字符串内容开头。`in` 运算符用以检查给定的字符串是否是查询的字符串中的一部分。
在这里,我们会看见一此操作中包含了好多字符串方法。`startswith` 方法用于查找字符串是否以给定的字符串内容开头。`in` 运算符用以检查给定的字符串是否是查询的字符串中的一部分。

`find` 方法用于定位字符串中给定的子字符串的位置。如果找不到相应的子字符串,`find` 会返回 -1。`str` 类同样还拥有一个简洁的方法用以 `联结(Join)`序列中的项目,其中字符串将会作为每一项目之间的分隔符,并以此生成并返回一串更大的字符串。

Expand Down
14 changes: 7 additions & 7 deletions 14.oop.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@

## `self` {#self}

类方法与普通函数只有一种特定的区别——前者必须有一个额外的名字,这个名字必须添加到参数列表的开头,但是你*不用*在你调用这个功能时为这个参数赋值,Python 会为它提供。这种特定的变量引用的是对象_本身_,按照惯例,它被赋予 `self` 这一名称。
类方法与普通函数只有一种特定的区别——前者必须多加一个参数在参数列表开头,这个名字必须添加到参数列表的开头,但是你*不用*在你调用这个功能时为这个参数赋值,Python 会为它提供。这种特定的变量引用的是对象_本身_,按照惯例,它被赋予 `self` 这一名称。

尽管你可以为这一参数赋予任何名称,但是_强烈推荐_你使用 `self` 这一名称——其它的任何一种名称绝对会引人皱眉。使用一个标准名称能带来诸多好处——任何一位你的程序的读者能够立即认出它,甚至是专门的 IDE(Integrated Development Environments,集成开发环境)也可以为你提供帮助,只要你使用了 `self` 这一名称。

> **针对 C++/Java/C# 程序员的提示**
>
> Python 中的 `self` 相当于 C++ 中的指针以及 Java 与 C# 中的 `this` 指针
> Python 中的 `self` 相当于 C++ 中的 `this` 指针以及 Java 与 C# 中的 `this` 引用
你一定会在想 Python 是如何给 `self` 赋值的,以及为什么你不必给它一个值。一个例子或许会让这些疑问得到解答。假设你有一个 `MyClass` 的类,这个类下有一个实例 `myobject`。当你调用一个这个对象的方法,如 `myobject.method(arg1, arg2)` 时,Python 将会自动将其转换成 `MyClass.method(myobject, arg1, arg2)`——这就是 `self` 的全部特殊之处所在。

这同时意味着,如果你有一个没有参数的功能,你依旧必须拥有一个参数——`self`
这同时意味着,如果你有一个没有参数的方法,你依旧必须拥有一个参数——`self`

## 类 {#class}

Expand Down Expand Up @@ -80,7 +80,7 @@

**它是如何工作的**

在本例中,我们定义 `__init__` 方法用以接受 `name` 参数(与更普遍的 `self` 一道)。在这里,我们创建了一个字段,同样称为 `name`。要注意到尽管它们的名字都是“name”,但这是两个不相同的变量。虽说如此,但这并不会造成任何问题,因为点号 `self.name` 意味着这个叫作“name”的东西是某个叫作“self”的对象的一部分,而另一个 `name` 则是一个局部变量。由于我们已经如上这般明确指出了我们所指的是哪一个名字,所以它不会引发混乱。
在本例中,我们定义一个接受 `name` 参数(当然还有 `self` 参数)的 `__init__` 方法。在这里,我们创建了一个字段,同样称为 `name`。要注意到尽管它们的名字都是“name”,但这是两个不相同的变量。虽说如此,但这并不会造成任何问题,因为 `self.name` 中的点号意味着这个叫作“name”的东西是某个叫作“self”的对象的一部分,而另一个 `name` 则是一个局部变量。由于我们已经如上这般明确指出了我们所指的是哪一个名字,所以它不会引发混乱。

当我们在 `Person` 类下创建新的实例 `p` 时,我们采用的方法是先写下类的名称,后跟括在括号中的参数,形如:`p = Person('Swaroop')`

Expand All @@ -93,7 +93,7 @@

我们已经讨论过了类与对象的功能部分(即方法),现在让我们来学习它们的数据部分。数据部分——也就是字段——只不过是_绑定(Bound)_到类与对象的**命名空间(Namespace)**的普通变量。这就代表着这些名称仅在这些类与对象所存在的上下文中有效。这就是它们被称作_“命名空间”_的原因。

_字段(Filed_有两种类型——类变量与对象变量,它们根据究竟是类还是对象_拥有_这些变量来进行分类。
_字段(Field_有两种类型——类变量与对象变量,它们根据究竟是类还是对象_拥有_这些变量来进行分类。

**类变量(Class Variable)**是共享的(Shared)——它们可以被属于该类的所有实例访问。该类变量只拥有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。

Expand All @@ -113,7 +113,7 @@ _字段(Filed)_有两种类型——类变量与对象变量,它们根据

除了 `Robot.popluation`,我们还可以使用 `self.__class__.population`,因为每个对象都通过 `self.__class__` 属性来引用它的类。

`how_many` 实际上是一个属于类而非属于对象的方法。这就意味着我们可以将它定义为一个 `classmethod(类方法)` 或是一个 `staticmethod(静态方法)`这取决于我们是否知道我们需不需要知道我们属于哪个类。由于我们已经引用了一个类变量,因此我们使用 `classmethod(类方法)`
`how_many` 实际上是一个属于类而非属于对象的方法。这就意味着我们可以将它定义为一个 `classmethod(类方法)` 或是一个 `staticmethod(静态方法)`这取决于我们是否需要知道这一方法属于哪个类。由于我们已经引用了一个类变量,因此我们使用 `classmethod(类方法)`

我们使用[装饰器(Decorator)](./18.more.md#decorator)`how_many` 方法标记为类方法。

Expand Down Expand Up @@ -151,7 +151,7 @@ how_many = classmethod(how_many)

这种方法有诸多优点。如果我们增加或修改了 `SchoolMember` 的任何功能,它将自动反映在子类型中。举个例子,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。不过,对某一子类型作出的改动并不会影响到其它子类型。另一大优点是你可以将某一老师或学生对象看作 `SchoolMember` 的对象并加以引用,这在某些情况下会大为有用,例如清点学校中的成员数量。这被称作**多态性(Polymorphism)**,在任何情况下,如果父类型希望,子类型都可以被替换,也就是说,该对象可以被看作父类的实例。

同时还需要注意的是我们重用父类的代码,但我们不需要再其它类中重复它们,当我们使用独立类型时才会必要地重复这些代码。
同时还需要注意的是我们重用父类的代码,但我们不需要再在其它类中重复它们,当我们使用独立类型时才会必要地重复这些代码。

在上文设想的情况中,`SchoolMember` 类会被称作**基类(Base Class)**[^4]或是**超类(Superclass)**`Teacher``Student` 类会被称作**派生类(Derived Classes)**[^5]或是**子类(Subclass)**

Expand Down
2 changes: 1 addition & 1 deletion 22.revision_history.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 附录:本书由来 {#history-lesson}

我第一次使用 Python 是因为我需要为我所编写的 “钻石(Diamond)”程序编写一个安装程序,这样我就能让安装过程更加便捷。我必须要在 Qt 库的 Python 与 Perl 的绑定间做出选择。我在网上了做了些研究,然后我便发现了[埃里克·雷蒙(Eric S. Raymond)撰写的一篇文章](http://www.python.org/about/success/esr/),埃里克是一名著名且备受尊重的黑客,在文章中他说 Python 已经成为了他最喜欢的变成语言。同时我也发现相比起 Perl-Qt 绑定, PyQt 绑定更加成熟。于是,我决定 Python 将成为我要使用的语言。
我第一次使用 Python 是因为我需要为我所编写的 “钻石(Diamond)”程序编写一个安装程序,这样我就能让安装过程更加便捷。我必须要在 Qt 库的 Python 与 Perl 的绑定间做出选择。我在网上了做了些研究,然后我便发现了[埃里克·雷蒙(Eric S. Raymond)撰写的一篇文章](http://www.python.org/about/success/esr/),埃里克是一名著名且备受尊重的黑客,在文章中他说 Python 已经成为了他最喜欢的编程语言。同时我也发现相比起 Perl-Qt 绑定, PyQt 绑定更加成熟。于是,我决定 Python 将成为我要使用的语言。

然后,我便开始搜寻针对 Python 的好书。但是我找不到!我找到了一些 O'Reilly 的书,但它们都十分昂贵,而且比起教材更像是一本参考手册。于是我通过 Python 官方文档来解决了学习的问题。不过它们都太简略短小。它确实提供了有关 Python 的优秀观念与视角,但还不够完整。我能够驾驭它是因为我已经有了编程经验,但对于新手来说这就完全不适合了。

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

2005 年,**沈洁元**将本书的 1.20 版引进中国,并完成了全本翻译,将本书的译名定为《简明 Python 教程》。2017年,**漠伦**基于原书 4.0 版重新翻译,制作了本版全新译本,并沿用同样的译名。

本版译本定义为 4.06c 版。最后修订于 2017 年 728 日。
本版译本定义为 4.07c 版。最后修订于 2017 年 111 日。

## 有关 Python 3

Expand Down
14 changes: 7 additions & 7 deletions programs/io_pickle.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import pickle

# The name of the file where we will store the object
# 我们存储相关对象的文件的名称
shoplistfile = 'shoplist.data'
# The list of things to buy
# 需要购买的物品清单
shoplist = ['apple', 'mango', 'carrot']

# Write to the file
# 准备写入文件
f = open(shoplistfile, 'wb')
# Dump the object to a file
# 转储对象至文件
pickle.dump(shoplist, f)
f.close()

# Destroy the shoplist variable
# 清除 shoplist 变量
del shoplist

# Read back from the storage
# 重新打开存储文件
f = open(shoplistfile, 'rb')
# Load the object from the file
# 从文件中载入对象
storedlist = pickle.load(f)
print(storedlist)

0 comments on commit 7f9d591

Please sign in to comment.