Skip to content

Commit

Permalink
Merge pull request #1 from Vamei/master
Browse files Browse the repository at this point in the history
合并之前fork的代码
  • Loading branch information
me115 committed May 13, 2014
2 parents d4a1321 + 9202141 commit 033e603
Show file tree
Hide file tree
Showing 27 changed files with 2,390 additions and 70 deletions.
Binary file added build/Python.pdf
Binary file not shown.
Binary file added build/python_readlists.epub
Binary file not shown.
7 changes: 0 additions & 7 deletions content/07.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
#Python基础07 函数





函数最重要的目的是方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。



##函数的定义

首先,我们要定义一个函数, 以说明这个函数的功能。
Expand All @@ -26,7 +20,6 @@ def square_sum(a,b):

我们已经在循环和选择中见过冒号和缩进来表示的隶属关系。


c = a**2 + b**2 # 这一句是函数内部进行的运算

return c # 返回c的值,也就是输出的功能。Python的函数允许不返回值,也就是不用return。
Expand Down
23 changes: 0 additions & 23 deletions content/08.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
#Python基础08 面向对象的基本概念




Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。

面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。

下面是对面向对象的一种理解,基于分类。



##相近对象,归为类

在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。

面向对象就是模拟了以上人类认知过程。在Python语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。



先定义鸟类
```python
class Bird(object):
Expand All @@ -27,21 +20,15 @@ class Bird(object):
```
我们定义了一个类别(class),就是鸟(Bird)。在隶属于这个类比的语句块中,我们定义了两个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),这两个变量对应我们刚才说的属性(attribute)。我们暂时先不说明括号以及其中的内容,记为问题1。



假设我养了一只小鸡,叫summer。它是个对象,且属于鸟类。使用前面定义的类:
```python
summer = Bird()
print summer.way_of_reproduction
```
通过第一句创建对象,并说明summer是类别鸟中的一个对象,summer就有了鸟的类属性,对属性的引用是通过 对象.属性(object.attribute) 的形式实现的。



可怜的summer,你就是个有毛产的蛋货,好不精致。



##动作

日常认知中,我们在通过属性识别类别的时候,有时根据这个东西能做什么事情来区分类别。比如说,鸟会移动。这样,鸟就和房屋的类别区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。
Expand All @@ -65,24 +52,16 @@ print 'after move:',summer.move(5,8)

(它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到。有关self的内容会在下一讲展开)



另外两个参数,dx, dy表示在x、y两个方向移动的距离。move方法会最终返回运算过的position。

在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)。



我的summer可以跑了。



##子类

类别本身还可以进一步细分成子类



比如说,鸟类可以进一步分成鸡,大雁,黄鹂。

在OOP中,我们通过继承(inheritance)来表达上述概念。
Expand Down Expand Up @@ -130,8 +109,6 @@ print summer.move(5,8)

self代表了根据类定义而创建的对象。



建立对一个对象: 对象名 = 类名()

引用对象的属性: object.attribute
23 changes: 3 additions & 20 deletions content/09.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
#Python基础09 面向对象的进一步拓展




我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。



##调用类的其它信息

上一讲中提到,在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调用类属性。
Expand All @@ -25,16 +20,10 @@ li_lei.laugh_100th()
```
这里有一个类属性laugh。在方法show_laugh()中,通过self.laugh,调用了该属性的值。



还可以用相同的方式调用其它方法。方法show_laugh(),在方法laugh_100th中()被调用。



通过对象可以修改类属性值。但这是危险的。类属性被所有同一类及其子类的对象共享。类属性值的改变会影响所有的对象。



##__init__()方法

__init__()是一个特殊方法(special method)。Python有一些特殊方法。Python会特殊的对待它们。特殊方法的特点是名字前后有两个下划线。
Expand All @@ -52,12 +41,12 @@ summer = happyBird('Happy,Happy!')


屏幕上打印:
> We are happy birds.Happy,Happy!
We are happy birds.Happy,Happy!
我们看到,尽管我们只是创建了summer对象,但__init__()方法被自动调用了。最后一行的语句(summer = happyBird...)先创建了对象,然后执行:

```python
summer.__init__(more_words)

```
'Happy,Happy!' 被传递给了__init__()的参数more_words


Expand All @@ -68,8 +57,6 @@ summer.__init__(more_words)

在一些情况下,我们定义对象的性质,用于记录该对象的特别信息。比如说,人这个类。性别是某个人的一个性质,不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女。



当定义类的方法时,必须要传递一个self的参数。这个参数指代的就是类的一个对象。我们可以通过操纵self,来修改某个对象的性质。比如用类来新建一个对象,即下面例子中的li_lei, 那么li_lei就被self表示。我们通过赋值给self.attribute,给li_lei这一对象增加一些性质,比如说性别的男女。self会传递给各个方法。在方法内部,可以通过引用self.attribute,查询或修改对象的性质。

这样,在类属性的之外,又给每个对象增添了各自特色的性质,从而能描述多样的世界。
Expand All @@ -89,12 +76,8 @@ li_lei.printGender()

li_lei拥有了对象性质gender。gender不是一个类属性。Python在建立了li_lei这一对象之后,使用li_lei.gender这一对象性质,专门储存属于对象li_lei的特有信息。



对象的性质也可以被其它方法调用,调用方法与类属性的调用相似,正如在printGender()方法中的调用。



##总结

通过self调用类属性
Expand Down
30 changes: 10 additions & 20 deletions content/10.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
#Python基础10 反过头来看看




从最初的“Hello World”,走到面向对象。该回过头来看看,教程中是否遗漏了什么。

我们之前提到一句话,"Everything is Object". 那么我们就深入体验一下这句话。
Expand All @@ -13,41 +10,38 @@

dir()用来查询一个类或者对象所有属性。你可以尝试一下

```python
>>>print dir(list)
```

help()用来查询的说明文档。你可以尝试一下

```python
>>>print help(list)
```

(list是Python内置的一个类,对应于我们之前讲解过的列表)



##list是一个类

在上面以及看到,表是Python已经定义好的一个类。当我们新建一个表时,比如:

```python
>>>nl = [1,2,5,3,5]
```

实际上,nl是类list的一个对象。



实验一些list的方法:

```python
>>>print nl.count(5) # 计数,看总共有多少个5

>>>print nl.index(3) # 查询 nl 的第一个3的下标

>>>nl.append(6) # 在 nl 的最后增添一个新元素6

>>>nl.sort() # 对nl的元素排序

>>>print nl.pop() # 从nl中去除最后一个元素,并将该元素返回。

>>>nl.remove(2) # 从nl中去除第一个2

>>>nl.insert(0,9) # 在下标为0的位置插入9
```
总之,list是一个类。每个列表都属于该类。
Expand All @@ -62,17 +56,19 @@ Python补充中有list常用方法的附录。

这个方法定义了"+"运算符对于list对象的意义,两个list的对象相加时,会进行的操作。

```python
>>>print [1,2,3] + [5,6,9]
```


运算符,比如+, -, >, <, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。



尝试一下

```python
>>>print [1,2,3] - [3,4]
```

会有错误信息,说明该运算符“-”没有定义。现在我们继承list类,添加对"-"的定义

Expand All @@ -93,20 +89,14 @@ print superList([1,2,3]) - superList([3,4])

(教程最后也会给出一个特殊方法的清单)



定义运算符对于复杂的对象非常有用。举例来说,人类有多个属性,比如姓名,年龄和身高。我们可以把人类的比较(>, <, =)定义成只看年龄。这样就可以根据自己的目的,将原本不存在的运算增加在对象上了。



##下一步

希望你已经对Python有了一个基本了解。你可能跃跃欲试,要写一些程序练习一下。这会对你很有好处。

但是,Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象。我们已经看到了内置的比如说list,还有tuple等等。它们用起来很方便。在Python的标准库里,还有大量可以用于操作系统互动,Internet开发,多线程,文本处理的对象。而在所有的这些的这些的基础上,又有很多外部的库包,定义了更丰富的对象,比如numpy, tkinter, django等用于科学计算,GUI开发,web开发的库,定义了各种各样的对象。对于一般用户来说,使用这些库,要比自己去从头开始容易得多。我们要开始攀登巨人的肩膀了。



谢谢你的关注,

欢迎来到Python的世界。
Expand Down
48 changes: 48 additions & 0 deletions content/Python小题目 针对快速教程.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
Python小题目 针对快速教程




作业的目的是帮助熟悉之前学习的内容:



1.

写一个程序,判断2008年是否是闰年。

写一个程序,用于计算2008年10月1日是这一年的第几天?(2008年1月1日是这一年的第一天)

这些小题目是为了方便大家加深对Python理解而设计的。



2.

有一个record.txt的文档,内容如下:
```python
# name, age, score

tom, 12, 86

Lee, 15, 99

Lucy, 11, 58

Joseph, 19, 56
```
第一栏为姓名(name),第二栏为年纪(age),第三栏为得分(score)

现在,写一个Python程序,

1)读取文件

2)打印如下结果:

得分低于60的人都有谁?

谁的名字以L开头?

所有人的总分是多少?

3)姓名的首字母需要大写,该record.txt是否符合此要求? 如何纠正错误的地方?
21 changes: 21 additions & 0 deletions content/Python快速教程总结.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Python快速教程总结





到现在为止,Python快速教程就到一段落。谢谢大家的鼓励和支持,特别是对其中错误的包容和指正。



在第一部分,基础部分中,除了一些基础知识,我们着力于建立对象的概念。在第二部分中,我们深入到许多实用并且常用的Python用法。如果只是想了解Python是什么,那么第一部分应该可以给出一个基本概念。加上第二部分的话,我们应该可以有足够的知识读懂Python程序,并编写一些应用。

我会在以后写一些选读性的随笔,以便对教程更进一步补充。



我还在考虑下一步在博客中写什么。Python依然有一个庞大的标准库可以展开。但标准库的讲解离不开对计算机原理和互联网原理的了解,很难以一个快速教程的方式呈现出来。但离开标准库,Python也显得很单薄。一个可能是,先写一个总体纲要,描述一下标准库各个包所包含的内容,以及可能的用途,不知是否可行?

另外,最近看了一些Google Engine和Django的内容,觉得也不错。只可惜自己在这方面经验太浅,不知从何说起。

另一方面,我个人的Python经验也非常有限。希望能多参与到一些项目,以便能积累经验。
Loading

0 comments on commit 033e603

Please sign in to comment.