1、Python 指南前言Copyright 2001, 2002, 2003 Python Software Foundation. All rights reserved.Copyright 2000 BeO. All rights reserved.Copyright 1995-2000 Corporation for National Research Initiatives. All rights reserved.Copyright 1991-1995 Stichting Mathematisch Centrum. All rights reserved.See the end of
2、this document for complete license and permissions information.概要Python 是一种容易学习的强大语言。它包括了高效的高级数据结构,提供了一个简单但很有有效的方式以便进行面向对象编程。 Python 优雅的语法,动态数据类型,以及它的解释器,使其成为了大多数平台上应用于各领域理想的脚本语言以及开发环境。Python 解释器及其扩展标准库的源码和编译版本可以从 Python 的 Web 站点 http:/www.python.org/ 及其所有镜像站上免费获得,并且可以自由发布。该站点上也提供了 Python 的一些第三方模块,程
3、序,工具,以及附加的文档。Python 的解释器很容易通过 C 或 C+ (或者其它可以由 C 来调用的语言)来实现功能和数据结构的扩展。因些, Python 也很适于作为定制应用的一种扩展语言。这个手册介绍了一些 Python 语言及其系统的基本知识与根念。这有助于对 Python 有一个基本的认识,当然所有的例子都包括在里面了,所以这本手册很适合离线阅读。需要有关标准对象和模块的详细介绍的话,请查询 Python 程序库参考手册文档。 Python 参考手册 提供了更多的关于语言方面的正式说明。需要编写 C 或 C+ 扩展,请阅读 Python 解释器的扩展和集成 以及 Python/C
4、API 参考手册。这几本书涵盖了各个深度上的 Python 知识。本手册不会涵盖 Python 的所有功能,也不会去解释所用到的所有相关的知识。相反,它介绍了许多 Python 中最引人注目的功能,这会对读者掌握这门语言的风格大有帮助。读过它后,你应该可以阅读和编写 Python 模块和程序了,接下来你可以从 Python 库参考手册中进一步学习 Python 复杂多变的库和模块了。1. 开胃菜如果你写过大规模的 Shell 脚本,应该会有过这样的体会:你还非常想再加一些别的功能进去,但它已经太大、太慢、太复杂了;或者这个功能需要调用一个系统函数,或者它只适合通过 C 来调用通常这些问题还不足
5、以严肃到需要用 C 重写这个 Shell ;可能这个功能需要一些类似变长字符串或其它一些在 Shell 脚本中很容易找到的数据类型(比如文件名的有序列表) ,但它们用 C 来实现就要做大量的工作,或者,你对 C 还不是很熟悉。另一种情况:可能你需要使用几个 C 库来工作,通常 C 的编写 / 编译 / 测试 / 重编译周期太慢。你需要尽快的开发软件。也许你需要写一个使用扩展语言的程序,但不想设计一个语言,并为此编写调试一个解释器,然后再把它集成进你的程序。遇到以上情况, Python 可能就是你要找的语言。 Python 很容易上手,但它是一门真正的编程语言,提供了比 Shell 多的多的结构
6、,支持大型程序。另一方面,它提供了比 C 更多的错误检查,并且,作为一门高级语言,它拥有内置的高级数据类型,例如可变数组和字典,如果通过 C 来实现的话,这些工作可能让你大干上几天的时间。因为拥有更多的通用数据类型,Python 适合比 Awk 甚至 Perl 更广泛的问题领域,在其它的很多领域, Python 至少比别的语言要易用得多。Python 可以让你把自己的程序分隔成不同的模块,这样就可以在其它的 Python 程序中重用。这样你就可以让自己的程序基于一个很大的标准模块集或者用它们作为示例来学习 Python 编程。 Python 中集成了一些类似文件 I/O ,系统调用, sock
7、ets ,甚至像 Tk 这样的用户图形接口。Python 是一门解释型语言,因为不需要编译和链接的时间,它可以帮你省下一些开发时间。解释器可以交互式使用,这样就可以很方便的测试语言中的各种功能,以便于编写发布用的程序,或者进行自下而上的开发。还可以当它是一个随手可用的计算器。Python 可以写出很紧凑和可读性很强的程序。用 Python 写的程序通常比同样的 C 或 C+ 程序要短得多,这是因为以下几个原因:l 高级数据结构使你可以在一个单独的语句中表达出很复杂的操作;l 语句的组织依赖于缩进而不是 begin/end 块;l 不需要变量或参数声明。Python 是可执行的:如果你会用 C
8、语言写程序,那就可以很容易的为解释器添加新的集成模块和功能,或者优化瓶颈,使其达到最大速度,或者使 Python 能够链接到所需的二进制架构上(比如某个专用的商业图形库) 。等你真正熟悉这一切了,你就可以把 Python 集成进由 C 写成的程序,把 Python 当作这个程序的扩展或命令行语言。顺便说一下,这个语言的名字来源于 BBC 的“ Monty Pythons Flying Circus ”节目,和凶猛的爬虫没有任何关系。在文档中引用 Monty Python 典故不仅是允许的,而且还受到鼓励!现在你已经了解了 Python 中所有激动人心的东西,大概你想仔细的试试它了。学习一门语言
9、最好的办法就是使用它,你会很乐于这样做。下一节中,我们会很机械的说明解释器的用法。这没有什么神秘的,不过有助于我们练习后面展示的例子。本指南其它部分通过例子介绍了 Python 语言和系统的各种功能,开始是简单表达式、语法和数据类型,接下来是函数和模块,最后是诸如异常和自定义类这样的高级内容。2. 使用 Python 解释器2.1 调用解释器通常 Python 的解释器被安装在目标机器的 /usr/local/bin/python 目录下;把 /usr/local/bin 目录放进你的 UNIX Shell 的搜索路径里,确保它可以通过输入python来启动。因为安装路径是可选的,所以也有可能
10、安装在其它位置,你可以与安装 Python 的用户或系统管理员联系。 (例如, /usr/local/python 就是一个很常见的选择)输入一个文件结束符( UNIX 上是 Ctrl+D , Windwos 上是 Ctrl+Z )解释器会以 0 值退出(就是说,没有什么错误,正常退出译者) 。如果这没有起作用,你可以输入以下命令退出:import sys; sys.exit()解释器的行编辑功能并不很复杂。装在 Unix 上的解释器可能会有 GNU readline 库支持,这样就可以额外得到精巧的交互编辑和历史记录功能。可能检查命令行编辑器支持能力最方便的方式是在主提示符下输入 Ctrl+
11、P 。如果有嘟嘟声(计算机扬声器) ,说明你可以使用命令行编辑功能,从附录 A 可以查到快捷键的介绍。如果什么也没有发声,或者 P 显示了出来,说明命令行编辑功能不可用,你只有用退格键删掉输入的命令了。解释器的操作有些像 Unix Shell :使用终端设备作为标准输入来调用它时,解释器交互的解读和执行命令,通过文件名参数或以文件作为标准输入设备时,它从文件中解读并执行脚本。启动解释器的第三个方法是python -c command arg .这种方法可以在命令行中直接执行语句,等同于 Shell 的 -c 选项。因为 Python 语句通常会包括空格之类的特殊字符,所以最好把整个语句用双引号
12、包起来。注意“ python file ”和“ python ”) ;继续的部分被称为从属提示符,由三个点标识(“ .”) 。在第一行之前,解释器打印欢迎信息、版本号和授权提示:pythonPython 2.3 (#1, Jul 30 2003, 23:22:59)GCC 3.2 20020927 (prerelease) on cygwinType “help“, “copyright“, “credits“ or “license“ for more information. 输入多行结构时需要从属提示符了,例如,下面这个 if 语句: the_world_is_flat = 1 if t
13、he_world_is_flat:. print “Be careful not to fall off!“.Be careful not to fall off!2.2 解释器及其环境2.2.1 错误处理有错误发生时,解释器打印一个错误信息和栈跟踪(监视)器?。交互模式下,它返回主提示符,如果从文件输入执行,它在打印栈跟踪器后以非零状态退出。(异常可以由 try 语句中的 except 子句来控制,这样就不会出现上文中的错误信息)有一些非常致命的错误会导致非零状态下退出,这由通常由内部矛盾和内存溢出造成。所有的错误信息都写入标准错误流;命令中执行的普通输出写入标准输出。在主提示符或附属提示符
14、输入中断符(通常是 Control-C or DEL )就会取消当前输入,回到主命令行。 1 执行命令时输入一个中断符会抛出一个 KeyboardInterrupt 异常,它可以被 try 句截获。2.2.2 执行 Python 脚本BSD 系统中, Python 脚本可以像 Shell 脚本那样直接执行,只要在脚本文件开头写一行命令,指定文件和模式:#! /usr/bin/env python( 将用户路径通知解释器 ) “ #! ”必须是文件的前两个字符,在某些平台上,第一行必须以 Unix 风格的行结束符( “ n ”)结束,不能用 Mac (“ r ”)或 Windows (“ rn
15、”)的结束符。注意, “ # ”是 Python 中是行注释的起始符。脚本可以通过 chmod 命令指定执行模式和许可权。$ chmod +x myscript.py2.2.3 源程序编码Python 的源文件可以通过编码使用 ASCII 以外的字符集。最好的做法是在 #! 行后面用一个特殊的注释行来定义字符集。# -*- coding: iso-8859-1 -*-根据这个声明, Python 会将文件中的字符尽可能的从指定的编码转为 Unicode ,在本例中,这个字符集是 iso-8859-1 。在 Python 库参考手册 中可以找到可用的编码列表(根据我的实验,中文似乎只能用 cp-
16、936 或 utf-8 ,不直接支持 GB , GBK , GB-18030 或 ISO-10646 译者注) 。如果你的文件编辑器支持 UTF-8 格式,并且可以保存 UTF-8 标记( aka BOM - Byte Order Mark ) ,你可以用这个来代替编码声明(看来至少 Jext 还不支持这样做,而 Vim ,我还没找到它的编码设置在哪里,还是老老实实的用注释行指定源代码的编码吧译者注) 。 IDLE 可以通过设定 Options/General/Default Source Encoding/UTF-8 来支持它。需要注意的是旧版 Python 不支持这个标记( Python
17、2.2 或更早的版本) ,也同样不能使操作系统支持 #! 文件。使用 UTF-8 内码(无论是用标记还是编码声明) ,我们可以在字符串和注释中使用世界上的大部分语言。标识符中不能使用非 ASCII 字符集。为了正确显示所有的字符,你一定要在编辑器中将文件保存为 UTF-8 格式,而且要使用支持文件中所有字符的字体。2.2.4 交互式环境的启动文件使用 Python 解释器的时候,我们可能需要在每次解释器启动时执行一些命令。你可以在一个文件中包含你想要执行的命令,设定一个名为 PYTHONSTARTUP 的环境变量来指定这个文件。这类似于 Unix shell 的 .profile 文件。这个文
18、件在交互会话期是只读的,当 Python 从脚本中解读文件或以终端作为外部命令源时则不会如此(尽管它们的行为很像是处在交互会话期。 )它与解释器执行的命令处在同一个命名空间,所以由它定义或引用的一切可以在解释器中不受限制的使用。你也可以在这个文件中改变 sys.ps1 和 sys.ps2 指令。如果你想要在当前目录中执行附加的启动文件,你可以在全局启动文件中加入类似以下的代码:if os.path.isfile(.pythonrc.py): execfile(.pythonrc.py)如果你想要在某个脚本中使用启动文件,必须要在脚本中写入这样的语句:import osfilename = os
19、.environ.get(PYTHONSTARTUP)if filename and os.path.isfile(filename):execfile(filename)3. Python 的非正式介绍在后面的例子中,区分输入和输出的方法是看是否有提示符(“ ”和“ ”):想要重复这些例子的话,你就要在提示符显示后输入所有的一切;没有以提示符开始的行,是解释器输出的信息。需要注意的是示例中的从属提示符用于多行命令的结束,它表示你需要输入一个空行。本手册中的很多示例都包括注释,甚至有一些在交互提示符中折行。 Python 中的注释以符号“ # ”起始,一直到当前行的结尾。注释可能出现在一行的开
20、始,也可能跟在空格或程序代码之后,但不会出现在字符串中,字符串中的 # 号只代表 # 号。示例:# this is the first commentSPAM = 1 # and this is the second comment# . and now a third!STRING = “# This is not a comment.“3.1 初步认识 Python让我们试验一些简单的 Python 命令。启动解释器然后等待主提示符“ ”出现(这用不了太久) 。3.1.1 数值解释器的行为就像是一个计算器。你可以向它输入一个表达式,它会返回结果。表达式的语法简明易懂: + , - , *
21、, / 和大多数语言中的用法一样(比如 C 或 Pascal ) ,括号用于分组。例如: 2+24 # This is a comment. 2+24 2+2 # and a comment on the same line as code4 (50-5*6)/45 # Integer division returns the floor:. 7/32 7/-3-3像 c 一样,等号( “ = ”)用于给变量赋值。被分配的值是只读的。 width = 20 height = 5*9 width * height900同一个值可以同时赋给几个变量: x = y = z = 0 # Zero x,
22、 y and z x0 y0 z0Python 完全支持浮点数,不同类型的操作数混在一起时,操作符会把整型转化为浮点数。 3 * 3.75 / 1.57.5 7.0 / 23.5复数也同样得到了支持,虚部由一个后缀“ j ”或者“ J ”来表示。带有非零实部的复数记为“ (real+imagj) ”,或者也可以通过“ complex(real, imag) ”函数创建。 1j * 1J(-1+0j) 1j * complex(0,1)(-1+0j) 3+1j*3(3+3j) (3+1j)*3(9+3j) (1+2j)/(1+1j)(1.5+0.5j)复数总是由实部和虚部两部分浮点数来表示。可能
23、从 z.real 和 z.imag 得到复数 z 的实部和虚部。 a=1.5+0.5j a.real1.5 a.imag0.5用于向浮点数和整型转化的函数( float(), int() 和 long() )不能对复数起作用没有什么方法可以将复数转化为实数。可以使用 abs(z) 取得它的模,也可以通过 z.real 得到它的实部。 a=3.0+4.0j float(a)Traceback (most recent call last):File “, line 1, in ?TypeError: cant convert complex to float; use e.g. abs(z) a
24、.real3.0 a.imag4.0 abs(a) # sqrt(a.real*2 + a.imag*2)5.0 交互模式下,最近一次表达式输出保存在 _ 变量中。这意味着把 Python 当作桌面计算器使用时,它可以更容易的进行连续计算,例如: tax = 12.5 / 100 price = 100.50 price * tax12.5625 price + _113.0625 round( _ , 2)113.06 这个变量对于用户来说是只读的。不要试图去给它赋值由于 Python 的语法效果,你只会创建一个同名的局部变量覆盖它。3.1.2 字符串除了数值, Python 还可以通过几种
25、不同的方法操作字符串。字符串用单引号或双引号标识: spam eggsspam eggs doesnt“doesnt“ “doesnt“doesnt“ doesn“tdoesn“t “doesnt“doesnt“ “doesn“t“doesn“t “doesnt“doesnt“ doesn“tdoesn“t “Yes,“ he said.“Yes,“ he said. “Yes,“ he said.“Yes,“ he said. “Isnt,“ she said.“Isnt,“ she said.字符串可以通过几种方式分行。可以在行加反斜杠作为继续符,这表示下一行是当前行的逻辑沿续。hello
26、 = “This is a rather long string containingnseveral lines of text just as you would do in C.nNote that whitespace at the beginning of the line issignificant.“print hello注意换行用 n 来表示;反斜杠后面的新行标识( newline ,缩写“ n ”)会转换为换行符,示例会按如下格式打印:This is a rather long string containingseveral lines of text just as yo
27、u would do in C.Note that whitespace at the beginning of the line is significant.然而,如果我们创建一个“ raw ”行, n 序列就不会转为换行,示例源码最后的反斜杠和换行符 n 都会做为字符串中的数据处理。如下所示:hello = r“This is a rather long string containingnseveral lines of text much as you would do in C.“print hello会打印为:This is a rather long string contai
28、ningnseveral lines of text much as you would do in C.或者,字符串可以用一对三重引号 ” 或 来标识。三重引号中的字符串在行尾不需要换行标记,所有的格式都会包括在字符串中。print “Usage: thingy OPTIONS-h Display this usage message-H hostname Hostname to connect to“得到下面的输出:Usage: thingy OPTIONS-h Display this usage message-H hostname Hostname to connect to解释器打
29、印出来的字符串与它们输入的形式完全相同:内部的引号,用反斜杠标识的引号和各种怪字符,都精确的显示出来。如果字符串中包含单引号,不包含双引号,可以用双引号引用它,反之可以用单引号。 (后面介绍的 print 语句,可以用来写没有引号和反斜杠的字符串) 。字符串可以用 + 号联接(或者说粘合) ,也可以用 * 号循环。 word = Help + A wordHelpA 两个字符串值之间的联接是自动的,上例第一行可以写成“ word = Help A ”这种方式只对字符串值有效,任何字符串表达式都不适用这种方法。 import string str ing # string.strip(str)
30、+ ing # string.strip(str) ing # “, line 1, in ?string.strip(str) ingSyntaxError: invalid syntax字符串可以用下标(索引)查询;就像 C 一样,字符串的第一个字符下标是 0 。这里没有独立的字符类型,字符仅仅是大小为一的字符串。就像在 Icon 中那样,字符串的子串可以通过切片标志来表示:两个由冒号隔开的索引。 word4A word0:2He word2:4lp切片索引可以使用默认值;省略前一个索引表示 0 ,省略后一个索引表示被切片的字符串的长度。 word:2 # The first two ch
31、aractersHe word2: # All but the first two characterslpA和 C 字符串不同, Python 字符串不能改写。按字符串索引赋值会产生错误。 word0 = xTraceback (most recent call last):File “, line 1, in ?TypeError: object doesnt support item assignment word:1 = SplatTraceback (most recent call last):File “, line 1, in ?TypeError: object doesnt
32、 support slice assignment然而,可以通过简单有效的组合方式生成新的字符串: x + word1:xelpA Splat + word4SplatA切片操作有一个很有用的不变性: s:i + si: 等于 s 。 word:2 + word2:HelpA word:3 + word3:HelpA退化的切片索引被处理的很优美:过大的索引代替为字符串大小,下界比上界大的返回空字符串。 word1:100elpA word10: word2:1索引可以是负数,计数从右边开始,例如: word-1 # The last characterA word-2 # The last-b
33、ut-one characterp word-2: # The last two characterspA word:-2 # All but the last two charactersHel不过 -0 还是 0 ,所以它不是从右边计数的! word-0 # (since -0 equals 0)H越界的负切片索引会被截断,不过不要尝试在前元素索引(非切片的)中这样做: word-100:HelpA word-10 # errorTraceback (most recent call last):File “, line 1, in ?IndexError: string index ou
34、t of range理解切片的最好方式是把索引视为两个字符之间的点,第一个字符的左边是 0 ,字符串中第 n 个字符的右边是索引 n ,例如:+-+-+-+-+-+| H | e | l | p | A |+-+-+-+-+-+0 1 2 3 4 5-5 -4 -3 -2 -1第一行是字符串中给定的 0 到 5 各个索引的位置,第二行是对应的负索引。从 i 到 j 的切片由这两个标志之间的字符组成。对于非负索引,切片长度就是两索引的差。例如, word1:3 的长度是 2 。内置函数 len() 返回字符串长度: s = supercalifragilisticexpialidocious l
35、en(s)343.1.3 Unicode 字符串从 Python2.0 开始,程序员们可以使用一种新的数据类型来存储文本数据: Unicode 对象。它可以用于存储多种 Unicode 数据(请参阅 http:/www.unicode.org/ ) ,并且,通过必要时的自动转换,它可以与现有的字符串对象良好的结合。Unicode 针对现代和旧式的文本中所有的字符提供了一个序列。以前,字符只能使用 256 个序号,文本通常通过绑定代码页来与字符映射。这很容易导致混乱,特别是软件的国际化(internationalization 通常写做“ i18n ”“ i ” +18 个字符 + “ n ”)
36、 。 Unicode 通过为所有字符定义一个统一的代码页解决了这个问题。Python 中定义一个 Unicode 字符串和定义一个普通字符串一样简单: uHello World !uHello World !引号前小写的“ u ”表示这里创建的是一个 Unicode 字符串。如果你想加入一个特殊字符,可以使用 Python 的 Unicode-Escape 编码。如下例所示: uHellou0020World !uHello World !被替换的 u0020 标识表示在给定位置插入编码值为 0x0020 的 Unicode 字符(空格符) 。其它字符也会被直接解释成对应的 Unicode 码
37、。如果你有一个在西方国家常用的 Latin-1 编码字符串,你可以发现 Unicode 字符集的前 256 个字符与 Lation-1 的对应字符编码完全相同。另外,有一种与普通字符串相同的行模式。想要使用 Python 的 Raw-Unicode-Escape 编码,你需要在字符串的引号前加上 ur 前缀。如果在小写“ u ”前可能有不止一个反斜杠,它只会把那些单独的 uXXXX 转化为 Unicode 字符。 urHellou0020World !uHello World ! urHellou0020World !uHellou0020World !行模式在你需要输入很多个反斜杠时很有用,
38、可能会用于正规表达式。作为这些编码标准的一部分, Python 提供了一个完备的方法集用于从已知的编码集创建 Unicode 字符串。内置函数 unicode() 提供了访问(编码和解码)所有已注册的 Unicode 编码的方法。它能转换众所周知的 Latin-1, ASCII, UTF-8, 和 UTF-16 。后面的两个可变长编码字符集用一个或多个 byte 存储 Unicode 字符。默认的字符集是 ASCII ,它只处理 0 到 127 的编码,拒绝其它的字符并返回一个错误。当一个 Unicode 字符串被打印、写入文件或通过 str() 转化时,它们被替换为默认的编码。 u“abc“
39、uabc str(u“abc“)abc u“uxe4xf6xfc str(u“)Traceback (most recent call last):File “, line 1, in ?UnicodeEncodeError: ascii codec cant encode characters in position 0-2: ordinal not in range(128)要把一个 Unicode 字符串用指定的字符集转化成 8 位字符串,可以使用 Unicode 对象提供的 encode() 方法,它有一个参数用以指定编码名称。编码名称小写。 u“.encode(utf-8)xc3xa
40、4xc3xb6xc3xbc如果你有一个特定编码的字符串,想要把它转为 Unicode 字符集, ,可以使用 uncode() 函数,它以编码名做为第二个参数。 unicode(xc3xa4xc3xb6xc3xbc, utf-8)uxe4xf6xfc3.1.4 链表Python 已经有了几个复合数据类型,用于组织其它的值。最通用的是链表,它写为中括之间用逗号分隔的一列值(子项) ,链表的子项不一定是同一类型的值。 a = spam, eggs, 100, 1234 aspam, eggs, 100, 1234像字符串一样,链表也以零开始,可以被切片,联接,等等: a0spam a31234 a-
41、2100 a1:-1eggs, 100 a:2 + bacon, 2*2spam, eggs, bacon, 4 3*a:3 + Boe!spam, eggs, 100, spam, eggs, 100, spam, eggs, 100, Boe!与不变的字符串不同,链表可以改变每个独立元素的值: aspam, eggs, 100, 1234 a2 = a2 + 23 aspam, eggs, 123, 1234可以进行切片操作,甚至还可以改变链表的大小: # Replace some items:. a0:2 = 1, 12 a1, 12, 123, 1234 # Remove some:.
42、 a0:2 = a123, 1234 # Insert some:. a1:1 = bletch, xyzzy a123, bletch, xyzzy, 1234 a:0 = a # Insert (a copy of) itself at the beginning a123, bletch, xyzzy, 1234, 123, bletch, xyzzy, 1234内置函数 len() 也同样可以用于链表: len(a)8它也可以嵌套链表(在链表中创建其它链表) ,例如: q = 2, 3 p = 1, q, 4 len(p)3 p12, 3 p102 p1.append(xtra) #
43、See section 5.1 p1, 2, 3, xtra, 4 q2, 3, xtra注意最后一个例子, p1 和 q 实际上指向同一个对象!我们在后面会讲到对象语法。3.2 开始编程当然,我们可以用 Python 做比 2 加 2 更复杂的事。例如,我们可以用以下的方法输出菲波那契( Fibonacci )序列的子序列: # Fibonacci series:. # the sum of two elements defines the next. a, b = 0, 1 while b (大于) , = (等于) , = (大于等于)和 != (不等于) 。循环体是缩进的:缩进是 Py
44、thon 对语句分组的方法。 Python 仍没有提供一个智能编辑功能所以你要在每一个缩进行输入一个 tab 或(一个或多个)空格。 实际上你可能会准备更为复杂的文本编辑器来编写你的 Python 程序,大多数文本编辑器都提供了自动缩进功能。交互式的输入一个复杂语句时,需要用一个空行表示完成(因为解释器没办法猜出你什么时候输入最后一行) 。需要注意的是每一行都要有相同的空字符来标识这是同一个语句块。print 语句打印给定表达式的值。它与你仅仅输入你需要的表达式(就像前面的计算器示例)不同,它可以同时输出多个表达式。字符串输出时没有引号,各项之间用一个空格分开,你可以很容易区分它们,如下所示:
45、 i = 256*256 print The value of i is, iThe value of i is 65536print 语句末尾的逗号避免了输出中的换行: a, b = 0, 1 while b x = int(raw_input(“Please enter an integer: “) if x # Measure some strings:. a = cat, window, defenestrate for x in a:. print x, len(x).cat 3window 6defenestrate 12在迭代过程中修改迭代序列不安全(只有在使用链表这样的可变序列
46、时才会有这样的情况) 。如果你想要修改你迭代的序列(例如,复制选择项) ,你可以迭代它的复本。通常使用切片标识就可以很方便的做到这一点: for x in a: # make a slice copy of the entire list. if len(x) 6: a.insert(0, x). adefenestrate, cat, window, defenestrate4.3 range() 函数如果你需要一个数值序列,内置函数 range() 可能会很有用,它生成一个等差级数链表。 range(10)0, 1, 2, 3, 4, 5, 6, 7, 8, 9range(10) 生成了一
47、个包含 10 个值的链表,它准确的用链表的索引值填充了这个长度为 10 的列表,所生成的链表中不包括范围中的结束值。也可以让 range 操作从另一个数值开始,或者可以指定一个不同的步进值(甚至是负数,有时这也被称为“步长” ): range(5, 10)5, 6, 7, 8, 9 range(0, 10, 3)0, 3, 6, 9 range(-10, -100, -30)-10, -40, -70需要迭代链表索引的话,如下所示结合使用 range() 和 len() : a = Mary, had, a, little, lamb for i in range(len(a):. print i, ai.0 Mary1 had2 a3 little4 lamb4.4 break 和 continue 语句和循环中的 else 子句break 语句和 C 中的类似,用于跳出最近的一级 for 或 while 循环。continue 语句是从 C 中借鉴来的,它表示循环继续执行下一次迭代。循环可以有一个 else 子句 ; 它在循环迭代完整个列表(对于 for )或执行条件为 false (对于 while )时执行,但循环被 break 中止的情况下不会执行。以下搜索素数的示例程序