1.Python快速教程
本书面向的对象是有经验的程序员,或者最好是通过其他的书本学习过Python这门语言的程序员。这一章将让你快速地了解Python这门语言。
1.1Python概述
这个简短的介绍是为有经验的程序员(这本书的读者应该都是有编程经验的人)准备的。你可以在www.python.org网站上查阅到丰富的资料(特别是有用到令人难以置信的HTML 页:A python Quick Reference),你还可以从大量的书籍查阅,比如Mark Lutz 和 David Ascher编写的Learning Python。(O’Reilly, 1999).
Python常常被归类为一种类似脚本的语言,但是脚本语言往往是受限制的,尤其在他们解决的问题的范围。从另一方面来说,Python是一种支持脚本的编程语言。这脚本是神乎其神的,你可能会发现自己正在用Python脚本更换所有你的批处理文件、 shell脚本跟简单的程序。但它不仅仅是一种脚本语言。
Python被设计的编写起来非常简洁(干净?),读起来就更容易了。你会发现即便你的代码已经写了很长的时间但你还是能很容易的阅读,阅读别人的代码也是一样。代码的可读性部分地通过简洁、扼要的语法做到,但更主要的因素是缩进 -- python的作用域取决于缩进。例如:
#: c01:if.py
response = "yes"
if response == "yes":
print "affirmative"
val = 1
print "continuing..."
#:~
‘#’表示此后的一行都是注释,就像c++跟Java中的’//’.
首先我们注意到Python基本语法是C语言风格的,就像你在if语句中看到的。但是在C语言的if语句中,你必须用括号把条件语句括起来,然而在Python中不需要这样(当然你也可以随便使用它们)。
条件语句用冒号结束,并且这表明接下来的将是一组缩进的指令,也就是if指令的“then”部分。在这个实例中,是用“print”指令发送结果到标准的输出,紧接着赋值给变量val。随后的指令并没有缩进,所以它不再是if语句的一部分。缩进可以嵌套任意多层,就像C++跟java中的大括号。但不同于那些语言的是,你无法选择大括号放置的位置 – 编译器强制所有人的代码都是同一个格式,这是Python一致可读性的一个主要的原因。
Python中通常每行只有一个指令(可以放置多个,只需要在指令间用分号隔开),因此不能以分号结尾。从上面简短的例子你可以看到,语言被设计的尽可能简单,而且仍然具有很强的可读性。
1.2 内置容器
在c++跟java那样的语言中,容器是以库的形式附加的,并不属于语言本身的一部分。在Python中,容器对于程序的本质特征是被构建到语言的核心来使其得到承认的:链表和关联数组(也可以叫映射、字典、哈希表)都是基本的数据类型。这使得这门语言增添了许多优雅。
另外,for语句自动遍历链表,而不仅仅是计算一连串的数字。从你开始经常使用for循环单步遍历数组或容器到现在,仔细想想,这其实很有意思。Python通过自动的让for语句用一个作用于某个序列的迭代器来使其格式化。
下面是一个例子:
#: c01:list.py
list = [ 1, 3, 5, 7, 9, 11 ]
print list
list.append(13)
for x in list:
print x
#:~
第一行代码创建了一个链表,你可以打印它,而且打印的结果看上去跟你输入的是一样的(作为对比,回忆一下Thinking in Java第二版里,我们在java中为了把数组打印出来,必需得创建一个特殊的Array2类)。链表就象是Java里的容器,你可以添加新的元素到里面(在本例中是用的append())并且它会自动调整大小。For语句创建了迭代器X,它会作用到这个链表的每一个值。
你可以用range()函数创建一个数字列表,所以如果真的需要,你也可以模仿C语言的for语句。需要注意的是,上面的例子中没有任何的声明 - 对象仅仅有一个名字,Python会通过你的用法来推断它的类型。好像Python设计的以至于你只有在绝对必要的时候才需要敲一下键盘。在你使用Python 一段时间后你会发现,那些非Python语言中的要求的让你费劲心思的分号,大括号,以及所有额外的废话竟然一点都没有描述你程序的意图。
1.3 函数
在Python中创建函数,用到的是def关键字,接下来是函数名跟参数列表,最后是一个冒号表示函数主题的开始。下面是转入到函数后的第一个例子:
#: c01:myFunction.py
def myFunction(response):
val = 0
if response == "yes":
print "affirmative"
val = 1
print "continuing..."
return val
print myFunction("no")
print myFunction("yes")
#:~
请注意,函数签名中并没有类型信息 – 它所有列出的信息中只有函数名称跟参数标识,但是并没有参数类型或返回类型。Python属于弱类(weakly-typed)语言,也就是说它尽可能的降低了对类型信息的要求。例如:你可以在相同的函数中传入和返回不同的类型:
#: c01:differentReturns.py
def differentReturns(arg):
if arg == 1:
return "one"
if arg == "one":
return 1
print differentReturns(1)
print differentReturns("one")
#:~
对于传入某个对象的函数来说,唯一的限制就是这个函数必须能够函数对它的操作,除此之外,函数并不关心其它的东西。下面的例子中,“+”运算符将在同一个函数中应用到整数和字符串。
#: c01:sum.py
def sum(arg1, arg2):
return arg1 + arg2
print sum(42, 47)
print sum('spam ', "eggs")
#:~
当“+”运算符应用到字符串时,它的意思是把两个字符串连接起来(是的,Python支持操作符重载,而且它做的很好)。
1.4 字符串
上面的例子还展示了Python的一小部分字符串处理功能,这是我所见过的语言中做的最好的。你可以使用单引号或双引号来代表字符串,这是非常宜人的,因为你可以在一个用双引号引起来的字符串中嵌入单引号,反之亦然。
#: c01:strings.py
print "That isn't a horse"
print 'You are not a "Viking"'
print """You're just pounding two
coconut halves together."""
print '''"Oh no!" He exclaimed.
"It's the blemange!"'''
print r'c:/python/lib/utils'
#:~
说Python并不是根据蛇来命名的倒不如说是根据一个名为Monty Python的马戏团,所以很多例子中事实上都引用到了Python-esque。
三个连续的引号可以引用任何的东西,包括接下来的一行。这在处理象生成Web页面等类似工作时显得十分的有用(Python是非常好的CGI语言),因为你只需要用三个连续的引号把整个页面引起来,而不用做任何其它的编辑。
字符串前面的‘r’表示这个字符串是raw字符串(译者注:原始字符串),它可以让反斜杠‘/’字面的显示出来,所以你就不用为了插入一个原始的反斜杠而插入额外的反斜杠了。(译者注:python中的‘/’是不可以直接输出的,如果你还是不能理解,你最好去阅读一下prthon的基础书籍)
Python使用了类似C语言printf()的替换语法,这使得字符串替换非常简单,但相对于C来说,它适用于所有的字符串。(译者注:本人是这么理解的。原文:Substitution in strings is exceptionally easy, since Python uses C’s printf( ) substitution syntax, but for any string at all)你只需要在字符串后面加上一个“%”和需要替换的值。
#: c01:stringFormatting.py
val = 47
print "The number is %d" % val
val2 = 63.4
s = "val: %d, val2: %f" % (val, val2)
print s
#:~
就像你看到的第二种情况一样,如果有一个以上的参数,你可以用括号把它们括起来(这形成了一个组元‘tuple’,也就是不可变的列表,你也可以为多个变量用一个标准的列表,但tuple是典型的)。
所有可用于printf()中的格式化操作在这里都是可用的,包括控制小数的位数。Python还有非常复杂的正则表达式。