第二章 语法及代码约定
时间:2007-04-16 来源:marlboro027
1. 第二章 语法及代码约定
本章讲述了Python程序的语法和代码约定。 本章的主题有行结构,语句分组,保留字,字符串,运算符,token等等,另外对如何使用 Unicode 字符串也做了详细的描述。
1.1. 行结构/缩进
程序中的每个语句都以换行符结束。特别长的语句可以使用续行符(\)来分成几个短小的行,如下例:
import math
a = math,cos(3*(x-n)) + \
math,sin(3*(y-n))
当你定义一个三引号字符串、列表、tuple 或者字典的时候不需要续行符来分割语句。及就是说,在程序中,凡是圆括号(,,,)、方括号[,,,]、花括号{,,,}及三引号字符串内的部分均不需要使用续行符。
缩进被用来指示不同的代码块,比如函数的主体代码块,条件执行代码块,循环体代码块及类定义代码块。缩进的空格(制表符)数目可以是任意的,但是在整个块中的缩进必须一致:
Toggle line numbers1 if a:
2 statement1 # 缩进一致,正确!
3 statement2
4 else:
5 statement3
6 statement4 #缩进不一致,错误!
如果块中只有很少的语句,那么你也可以把它们放置在同一行:
if a: statement1
else: statement2
要表示一个空的块或是空的主体,使用 pass语句:
if a:
pass
else:
statements
尽管允许用制表符指示缩进,我还是要说这是一个不好的习惯。 坚 决不要混合使用制表符和空格来缩进,这会给你带来意想不到的麻烦。建议你在每个缩进层次中使用单个制表符或两个或四个空格。运行 Python的时候使用 -t 参数,如果python 发现存在制表符和空格混用,它就显示警告信息,若使用 -tt 参数 python 则会在遇到混用情况时引发TabError异常。
分号(;)可以把多个语句放在同一行中,只有一个语句的行也可以用分号来结束。
#指示这是一个延长至行末的注释,但是包在字符串内的#没有这个功能。
最后要说明的,解释器会忽略所有的空白行(非交互模式下)。
1.2. 标识符及保留字
标 识符是用于识别变量、函数、类、模块以及其他对象的名字,标识符可以包含字母、数字及下划线(_),但是必须以一个非数字字符开始。字母仅仅包括ISO- Latin字符集中的A–Z和a–z。标识符是大小写敏感的,因此 FOO和foo是两个不同的对象。特殊符号,如$、%、@等,不能用在标识符中。另外,如 if,else,for 等单词是保留字,也不能将其用作标识符。下面的表列出了所有的保留字符:
and elif global or
assert else if pass
break except import print
class exec in raise
continue finally is return
def for lambda try
del from not while
以下划线开始或者结束的标识符通常有特殊的意义。例如以一个下划线开始的标识符(如 _foo)不能用from module import *语句导入。前后均有两个下划线的标识符,如__init__,被特殊方法保留。前边有两个下划线的标识符,如__bar,被用来实现类私有属性,这个将在第七章--类与面向对象编程中讲到。通常情况下,应该避免使用相似的标识符。
1.3. 数字/文字
Python中有四种内建的数值类型:整数、长整数、浮点数和复数。
象1234 这样的数被解析为一个十进制的整数。要指定一个八进制或者十六进制的整数,在一个合法的八进制数前加上 0 或者在一个合法的16进制数前加上 0x 就可以了。(如 0644 和 0x100fea8)。 在一个整数后面加上字母 l 或 L系统就认为这是一个长整数(如 1234567890L)。与受机器字长限制整数类型不同,长整数可以是任何长度(只受内存大小限制)。象123.34和1.2334e+02这样的数被 解析为浮点数。一个整数或者浮点数加上后缀 J 或者 j 就构成了一个复数的虚部,你可以用一个实数加上一个虚部创建一个复数,比如 1.2 + 12.34J。
Python目前支持两种类型的字符串:
8位字符数据 (ASCII)
16位宽字符数据 (Unicode)
最常用的是ASCII字符串,因为这个字符集刚好只用一个字节就可以字符集中的任意一个字符。通常情况下,ASCII串用单引号('),双引号("),或者三引号(''' 或 """) 来定义。字符串前后的引号类型必须一致。反斜杠(\)用来转义特殊字符,比如换行符、反斜杠本身、引号以及其他非打印字符。Table 2.1中列出了公认的特殊字符的表示方法,无法识别的转义字符串将被原样保留(包括前边的反斜杠)。此外,字符串可以包含嵌入的空字节和二进制数据。三引 号字符串中可以包含不必转义的换行符和引号。
Table 2.1 Standard Character Escape Codes
标准特殊字符 |
|
字符 |
描述 |
\ |
续行符 |
\\ |
反斜杠 |
\' |
单引号 |
\" |
双引号 |
\a |
Bell(音箱发出吡的一声) |
\b |
退格符 |
\e |
Escape |
\0 |
Null(空值) |
\n |
换行符,等价于\x0a和\cJ |
\v |
垂直制表符,等价于\x0b和\cK |
\t |
水平制表符,等价于\x09和\cI |
\r |
回车符,等价于\x0d和\cM |
\f |
换页符,等价于\x0c和\cL |
\OOO |
八进制值(000-377) |
\xhh |
十六进制值(x00-xff) |
\un |
Unicode字符值,n是四个十六进制数字表示的Unicode字符 |
Unicode 字符串用来表示多字节国际字符集,它包括65,536个字符。Unicode字符使用u或者U前缀来定义,例如`a = u"hello"`。在Unicode字符集中,每一个字符用一个16位整数来表示。Unicode字符使用 U+XXXX 这种形式来表示,XXXX是一个由 4 个十六进制数字组成的16进制数。(注意: 这种记法只是一个表示Unicode字符的习惯,并不是Python的语法)。例如U+0068是Unicode字符字母h(在Latin-1字符集中,你可以发现Unicode字符集的前256个字符与Lation-1的对应字符编码完全相同)。当Unicode字符串被赋值时普通字符和特殊字符都直接转换成Unicode字符序数(在[U+0000, U+00FF]中)。例如,字符串"hello\n"映射为ASCII时是:0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a,当使用u"hello\n"转换为Unicode字符串时是:U+0068, U+0065, U+006C, U+006C, U+006F, U+000A.任意Unicode字符都可以使用\uXXXX来定义,\uXXXX必须位于一个Unicode字符串中,例如:
s = u"\u0068\u0065\u006c\u006c\u006f\u000a"
在Python 的较老版本中,\xXXXX字节序列被用来定义Unicode字符(这与系统识别Unicode字符方式有关)。虽然现在仍然允许这样做,我仍然建议你最好采用新的表示方法。(因为旧的表示方法随时可能废止。)另外,八进制代码\OOO也可以用来定义在[U+0000, U+01FF]中的Unicode字符。
Unicode字符不能通过使用 UTF-8或者UTF-16编码中的原始字节序列来定义。例如,UTF-8编码的字符串 u'M\303\274ller' 建立的七个字符,用Unicode表示为+004D, U+00C3, U+00BC, U+006C, U+006C, U+0065, U+0072,这并不是你想要的结果。这是因为在UTF-8中,多字节序列\303\274用来代表U+00FC,而不是U+00C3, U+00BC。更多关于Unicode编码细节你可以阅读第三章--"类型和对象",第四章--"运算符和表达式",第九章--"输入和输出".
你可以给一个字符串加上前缀r或者R,例如 `r'\n\"'`,这些字符串被称为原始字符串,因为里边几乎所有的特殊字符都会原封不动地留下。不过原始字符串并不能以一个单独的反斜杠结尾(例如 r"\")。如果原始字符串使用ur或者UR前缀来定义的话,\uXXXX仍然会被解析为Unicode字符。如果你不想这样,你可以在它前边再加一个反斜杠,例如ur"\\u1234",它定义了一个含有7个字符的字符串。需要注意的是,定义原始Unicode字符串时,r必须在u之后。
邻近的字符串(被空格或者续行符分割),例如 "hello" 'world' 会被Python自动连结为一个字符串 "helloworld"。无论是普通字符串,Unicode字符串,还是自然字符串,都会自动连结。当然,只要这些字符串中有一个是Unicode字符串,那最终连结的结果也将是一个Unicode字符串。比如 "s1" u"s2" 就会产生 u"s1s2"。这个过程的细节你可以阅读第四章和附录A(the Python library).
如果Python在 -U 命令行参数下运行,所有的字符都会被解析为Unicode。
方括号[...]定义一个列表,圆括号(...)定义一个元组,花括号{...}定义一个字典:
a = [ 1, 3.4, 'hello' ] # A list
b = ( 10, 20, 30 ) # A tuple
c = { 'a': 3, 'b':42 } # A dictionary
1.4. 运算符、分隔符及特殊符号
Python 目前支持以下运算符:
+ - * ** // / % << >> & | ^
+= -= *= **= //= /= %= <<= >>= &= |= ^=
~ < > <= >= == != <>
下边的这些可以作为表达式,列表,字典,以及语句不同部分的分隔符号:
( ) [ ] { } , : . ` = ;
比如,等号(=),作为对象名和所分配值之间的分隔符;逗号(,)用来分隔函数参数、列表或tuple中的元素;小数点(.)用在浮点数和扩展切片操作中的省略符(...),
下边这些特殊符号也在语句中使用:
' " # \ @
注:Python 2.4 中新增了 @ 符号用作函数修饰符 ---Wei Zhong
字符$、?不能在程序语句中出现,但是可以出现在字符串中。
1.5. 文档字符串
如果一个模块、类、或函数体的第一个语句是未命名一个字符串,该字符串就自动成为该对象的文档字符串( DocStrings ),如下例:
Toggle line numbers1 def fact(n):
2 "This function computes a factorial"
3 if (n <= 1): return 1
4 else: return n*fact(n-1)
代码浏览及文档生成工具经常用到文档字符串。通过访问一个对象的__doc__属性,你可以得到文档字符串:
这个 __doc__ 属性竟然是可写的。--WeiZhong
>>> print fact._ _doc_ _文档字符串的缩进必须与定义中的其他语句一致。此外,在不同行出现的多个未命名字符串不会自动连结成一个字符串,即使他们紧挨着。(注意:返回的文档字符串仅仅是第一个字符串,这与前边讲到的字符串的自动连结有所不同,注意区别)。
This function computes a factorial
>>>