2005年09月12日

如果说要我推荐一本Python入门级的简明教材的话,那不用想肯定是ByteofPython了。不过我当时看得还是英文版,现在可是有了中文翻译了。不太清楚我为什么对Python很感兴趣,我甚至还没用过它来编写除了练习以外的任何东西。大概算是一种“业余”的爱好吧。人总是需要某种好玩的玩具的吧。

简明 Python 教程("A Byte of Python" 简体中文译本)

2005年04月14日

第一次听说Python的时候就听到了它是一个动态语言,至于如何动态我实在想象不出来,最近才有所体会。这里我会给出一些小例子来演示这个动态的含义。

>>> class MyClass:
 pass

>>> inst = MyClass();
>>> inst.head = "hello"
>>> inst.head
‘hello’
>>> inst.face

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in -toplevel-
    inst.face
AttributeError: MyClass instance has no attribute ‘face’

在MyClass中,根本没有任何属性的定义,而在下面MyClass的实例inst,我给了它一个属性head赋值“hello”,没有出错,也就是这里动态的定义了一个属性head。

而接下来访问inst.face,因为没有赋值语句,也就没有动态定义,所以返回错误。而这个head也仅仅属于inst而已,并没有加入到MyClass中去。

>>> dir(MyClass)
['__doc__', '__module__']

>>> dir(inst)
['__doc__', '__module__', 'head']

而由于动态类型得特性,使得Python中类型得定义变得很灵活,甚至有些随意,这就引起了很多人得怀疑,如此灵活得风格会严重得阻碍编写程序,并且很容易引起一个错误而很难发现。

那么看下面这个东西吧。

>>> from types import *
>>> 
>>> def what (x):
...     if type(x) == IntType:
...             print "This is an int."
...     else:
...             print "This is something else."
... 
>>> what(4)

This is an int.
>>> 
>>> what("4")

This is something else.

事实上,静态类型得一个问题是,我们想要得类型常常不是能够立即可用得,而有时候我们甚至连想要什么类型都是无法实现确定得。于是我们可以发现很多时候我们要用到泛型算法,或者自己编写泛型。

而动态特性使得函数天然就是泛型,这些函数天生就可以应付各种类型的数据,就像上面得例子,what()会根据具体得类型的X给出想要的结果。就好像我们在C语言中写道:

#define max(a,b) ((a) > (b) ? (a) : (b))

当然我这里给出的列子没有什么实际的意义和轰动的效果,可能说服力不强,动态特性的优点也不仅于此。连Stanly Lippman都说过(去年11月份看的,如果我没记错的话):

“C++这样的静态语言在动态语言面前的反击是有限的”

那么Python的这一动态特性,绝不会像我说得那么简单了。

2005年04月09日

Python的一个重要的特别之处就是它的特殊编程格式,总结一下三天来我接触到的特别之处。

  • String

在Python中一个String常量有三种表示方法:一对单引号、一对双引号、一对三重引号。

双引号自然大家都很熟悉,而对于单引号,就使得两件事发生了——Python中不会有char类型;我们需要在想打印在单引号引领的字符串中的单引号时,需要转移字符" \’ "。而三重引号字符串更多的用在多行或者复杂字符串的处理上。

NOTE:print r“Hello\n”  raw字符串中转义字符原样显示:Hello\n;在处理TEXT时候要尽量使用Unicode字符串(用u引领)。两个在字面上挨着的两个或多个字符串会被Python自动连接为一个字符串。

  • \    Escape Sequence

和C++一样,\ 引领了转移字符,而在Python中,行尾的单独的 \  是告诉Python,这一行和下一行是一个逻辑行。Ex:

print \

i

print i

是一样的。

  • 缩进

很特别,在Python中的程序块范围不用常见的花括号标识。而我们用缩进来标识,这使得缩进不是一种使程序易于读懂的手段,而是使得程序能够顺利被Python执行的必须。一个不恰当的缩进会引起不正确的结果或者一个错误。看似漫不经心的随意风格,缺使得程序风格优化成为一种强迫。

i = 5
   print ‘Value is’, i # Error! Notice a single space at the start of the line
print ‘I repeat, the value is’, i

上面这段代码第二行前有两个空格,它会引起一个错误 SyntaxError: invalid syntax

三个问题带到以后的学习中:

  1. 没有了char类型,如果想实现一个严格控制长度的char[ ]数组表示的字符串,我们在string类中会有什么办法?
  2. ;号不再是必须的,也极少有人在Python中使用;分割语句,但是写上;是不是一个好习惯呢?
  3. 在Python中不必事先声明变量,自然编程简单了许多,但是这样的代码会随时冒出一个变量吓你一跳,是不是还需要遵循一定的变量使用规则,以方便阅读理解代码呢?
2005年04月08日

在一个程序里面,比较常见的操作便是Swap了。把两个或者多个变量的值进行交换,我们都做过这种程序,不管是高手还是新手。

常见的解决方案是:(c/c++/java)

//swap a and b

temp=a;

a=b;

b=temp;

很显然,我们需要一个临时变量来帮助我们实现这个过程。或者临时指针或者其他的方案。

让我们来看看Python下的swap:

a,b = b,a

Well,我们可以不用那个临时变量了。也没省多少力气?那看看下面这个:

>>> a,b,c,d,e = 1,2,3,4,5
>>> print a,b,c,d,e
1 2 3 4 5
>>> a,b,c,d,e = b,d,e,c,a
>>> print a,b,c,d,e
2 4 5 3 1

WOW!可以看到,这个程序就想我们想象中的问题一样简单!呃,我是说,这个过程更接近我们脑海里面的东西。(当然如果常年的编程使得您具备了机器的思维,那么可能你不会这么想……我们称之为退化)

是什么让Python下的Swap变得如此简单?Python更聪明?我们知道,这只是Python特殊的元组(tuple)机制,在简单的表达式背后,运行的是一个打包解包的过程。赋值符左边的元素分别被赋予右边对应位置的元素的值。实际上,如果要准确的表达这个概念,我们可以把表达式写作:

(a,b,c,d,e) = (b,d,e,c,a)

圆括号不是必须的,我们通过逗号来分割元素,而这个过程是一个多赋值,只不过在这里我们用多赋值来实现了Swap的功能而已。这个机制很有意思,我头一次用如此简洁优美的格式实现变量值的交换。(使用其他语言的库函数或模板除外,虽然我们看不到具体实现过程,但我知道这个过程没有这么美……)

我已经有些迫不及待的深入Python世界了,但是我知道这样不行,就像游泳之前,至少先做做准备活动,弄湿自己再说。

夜了,睡吧……Night,Amazing Python!

2005年04月07日

去年这个时候我第一次听说了Python,那个时候我忙着搞别得东西,没在意这么个东西。

夏天得时候,我下载了Thinking in Python,想要看看到底是个什么东西,结果假期玩得一塌胡涂得。

一年过去了,现在我进了实验室,有了项目得压力,每天得生活繁忙了很多。反而学会了抽时间,竟然在每天睡觉前能看看自己一直想看而没有看得东西。而从昨天开始,摆在我床头的是Python编程基础。(人真是贱,越忙就越给自己找事情……)

这本书写的很一般,但是是免费的,偶尔从图书馆随手借来的。但却恰好能满足我快速通览的要求。想是先解解渴,要是有点意思就抽时间深入了解一下。

刚翻了几页,我就忍不住从床上起来坐在电脑前想要试一试了。在光标处直接键入

>>>print “hello world!”

竟然可以直接得到输出

Hello world!

这是我见过的说有的编程语言里面最简单的HelloWorld实现了,怪不得都说Python简单,容易上手。我开始怀疑这是不是一种语言,这简直就是象dos或者bash一样的command吗?不同的是它运行在Python里面,而不是运行在Command Line里面。这个特性恰恰反映了Python的动态和Shell语言特性。

于是我瞬间发现了Python的一个很有实际意义的用处:做为计算器使用……

Python 2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2*4+13
21

 >>> 2**10
1024

配合上Python的一些数学函数,甚至可以实现科学计算……

可以想象我们在拥有了这么一个奇怪的“command line”之后,下一步是做什么?写出我们的“批处理”让Python自行运行得到我们想要的结果吧!

看来我要牺牲一些睡觉的时间出来捐献给Python了,鲁迅老先生早就说过了:“时间就像海棉里的水,只要愿挤,总还是有的”。

很高兴步入Amazing Python的世界,显然还不算晚^_^