Google Code University › Programming Languages
Python是一种动态的解释型语言。所以你无需在源代码中声明变量或者函数或者函数参数的类型。你不仅不用在编译时检查你代码中的数据类型,而且可以使代码尽可能的短小精悍。(注释:参考与本小节对应的视频讲座)
了解一段Python代码运行效果的最好方法莫过于把这段代码放到Python解释器中运行。如果你有一个类似于「如果我把一个int变量加入一个列表会如何呢?」的问题,最快的方法就是直接去Python解释器中输入查看效果。Python仅仅分配变量而不用声明它们的类型。如果代码试图读取一个尚未赋值的变量,那么Python会返回一个运行时错误。与C++和Java相同的是,Python区分大小写,「a」和「A」是两个不同的变量。而与C++和Java不同的是,虽然你在Python代码结束的每一行跟上一个分号,但这不是最好的代码风格。注释则以「#」开始,并延伸到一行的结束。(请参考「安装Python」一节了解如何在安装和配置Python)
$ python ## 运行Python<span style="font-family: 宋体;">解释器</span>
Python 2.4.4 (#1, Oct 18 2006, 10:34:39)
[GCC 4.0.1 (Apple Computer, Inc. build 5341)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6 ## 在解释器中设置一个变量
>>> a ## 键入一个表达式并利用Python<span style="font-family: 宋体;">输出它的值</span>
6
>>> a + 2
8
>>> a = 'hi' ## 变量a<span style="font-family: 宋体;">同样可以与一个字符串绑定</span>
>>> a
'hi'
>>> len(a) ##调用字符串函数len()
2
>>> foo(a) ## 这次我故意输错了
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'foo' is not defined
>>> ctrl-d ## 按下 ctrl-d 退出 (Windows<span style="font-family: 宋体;">下请按</span>ctrl-z)
程序
Python源代码文件以「.py」后缀结尾。如果你已经有了一个「hello.py」文件,运行一个Python程序最简单的方法莫过于使用Shell命令「python hello.py Alice」——这会使用参数「Alice」读取和运行「hello.py」中的代码。
以下是一个非常简单的hello.py程序
#!/usr/bin/python
# 在此添加模块 -- sys 模块是一个非常基础的模块
import sys
# Gather our code in a main() function
def main():
print 'Hello there', sys.argv[1]
# 命令行下输入的参数保存在 sys.argv[]<span style="font-family: 宋体;">列表中</span>
# sys.argv[0] 是一个脚本名称,可以忽略
# 调用卖弄函数以开始的标准模版
if __name__ == '__main__':
main()
在命令行下运行程序:
$ python hello.py Guido
Hello there Guido
$ ./hello.py Alice # 无需键入python (Unix)
Hello there Alice
模块
一个Python文件,或者说一个模块,其包含的这些语句在你第一次调用这个模块的地方从上倒下运行,比如设置变量和函数。一个Python模块即可以像上面的「python hello.py Bob」一样直接运行,而可以被另一个模块调用。当直接运行一个Python文件的时候,这个特别的变量「_name_」就等「_main_」。因此,当一个文件直接运行的时候我们常用「if __name__ ==…」调用main()函数。在一个标准的Python程序中,列表sys.argv中的sys.argv[0] 包含了命令行参数(也就是程序本身),而sys.argv[1]则是这个列表的第一个真正参数。
函数
Python中定义函数的方法如下:
# 定义一个名为 "repeat",有两个参数的函数</pre>
def repeat(s, exclaim):
"""返回三倍于字符串s<span style="font-family: 宋体;">的值</span>
如果exclaim 为真, 则在句末加入感叹号.
"""
result = s + s + s
if exclaim:
result = result + '!!!'
return result
# 注意采用相同的缩进构成# if<span style="font-family: 宋体;">语句和函数
「def」不仅定义了一个带参数的函数还规定了如何缩进代码。函数的第一行描述了这个函数,而且,这是一个文档字符串。文档字符串可以只占用一行,也可以像上面的例子一样占用多行。如果你在在一个函数内部定义了一个变量,那么这将是一个局部变量。因此上方函数中变量「result」和其他函数的变量「result」是不同的(如果有的话)。为了给主调函数返回值,「return」通常会带一个参数。
下面的代码调用了「repeat()」函数,并且打印了返回值:
def main():
print repeat('Yay', False) ## Yay
print repeat('Woo Hoo', True) ## Woo Hoo!!!
在运行时,你必须确保在调用一个函数前已经使用了「def」定义了它。最典型的方法莫过于在文件的底部定义「main()」函数,而将它所调用的函数放在前面。
缩进
缩进通过使用空白符缩进在影响代码的含义是Python比较特别的一个特征。如同一个函数,由数条语句组成的逻辑块必须使用相同的缩进。如果一个逻辑块中有一行缩进不一致就会被标记为语法错误。
虽然Python使用空白符强制缩进让人一开始会感觉有点奇怪,但其实很符合逻辑,你会很快熟悉的。记得把你的编辑器设置为使用空格代替制表符,因为制表符会使Python文件中的缩进策略变得非常复杂。
运行时代码检查
Python在编译时仅作很小的检查,几乎所有类型、名称的检查都会推迟到运行时。假设上方的「main()」函数这样调用「repeat()」:
def main():
if name == 'Guido':
print repeeeet(name) + '!!!'
else:
print repeat(name)
If语句中有一个明显的错误:「repeat()」函数被错打成了「repeeeet()」。有趣的是Python已经编译了并且开始运行程序直到运行时才发现这个函数并不存在。只有当这个时候才会产生一个错误。这就意味着当你首次运行一个Python程序的时候你遇到的第一个错误很可能和例中一样只是一个简单的拼写错误。这也是一个静态强类型语言(比如Java)的优势,它们可以在编译时找出这样的小错误。(当然你也得自己去处理这些复杂的类型信息..)
变量名称
既然Python的变量并没有任何类型,那你就可以给变量取一些更有意义、更容易理解的名字了。比如把一个变量命名为「name」,把一个列表命名为「names」,而「tuples」则是一个元组的列表。经常有人忘记了变量的用途导致了一些简单的错误。所以请给你的变量合适的名字以确保代码正确。
模块和调用
就像一个「binky.py」文件同时是一个「binky」模块,所有的Python代码文件都是一个模块。所以一个模块都会包含一些定义了的变量、函数就像,「x=6」或者「def foo()」之类。假设一个名为「binky.py」的文件包含了一个名为foo()的函数。那么foo()函数的全名则是「binky.foo」。因此,不同的Python模块可以有相同的函数或者变量名儿不会冲突——modoule1.foo和module2.foo是不同的。就像标准的「sys」模块包含了一些类似于argv列表和「exit()」函数的Python基础元素,你可以使用import语句(比如「import sys」)来访问另一个函数中定义的元素。不过注意使用了import语句之后你仍需使用元素的全名,比如「sys.exit()」。
import sys
# 你现在可以用sys.xxx()<span style="font-family: 宋体;">了</span>
sys.exit(0)
此外「from hashing import sha1, md5」也是另一种import形式。这样你就可以用短名调用sha1()和md5()了。以下是经常被包含的python模块:
· sys – 调用 exit(), argv, stdin, stdout … 的接口
· re – 正则表达式
· os – 操作系统接口,文件系统
在线求助和help命令
如果你在学习Python想得到帮助,这里有三个不错的方法:
· 使用「python」、「python列表」、「python字符串」这样的关键字来谷歌,正确答案往往是第一个链接。这个小技巧对Python很管用。
· 查看官方Python文档网站——docs.python.org——那里有非常高质量的文档。不过你用谷歌来搜索往往能更快找到答案。
· 使用下面介绍的help()函数
Python解释器内建了可以查看变量、模块、函数…的文档字符串的help()函数,就像Java一样。这也是一个快速查看文档的方法。以下是调用解释器内建的help()函数的方法:
· help(len) – 查看len函数的内建文档(注意你应该输入「len」而不是「len()」,输入「len()」就会调用函数啦)
· help(sys) – 查看sys模块文档(你得先「import sys」)
· dir(sys) – dir()有点类似于help()但是只给出一个定义的元素的列表
· help(sys.exit) – 查看sys模块中exit()的文档
· help(list) – 查看模块中列表的文档
· help(list.append) – 查看模块中列表append()函数的文档