Differences between revisions 1 and 2
Revision 1 as of 2006-01-17 18:05:40
Size: 9551
Editor: WeiZhong
Comment:
Revision 2 as of 2006-01-18 03:36:53
Size: 11427
Editor: WeiZhong
Comment:
Deletions are marked like this. Additions are marked like this.
Line 63: Line 63:
assert      else if pass
break     except import print
class      exec in raise
continue   finally is return
def      for lambda try
del      from not while
assert else if pass
break except import print
class exec in raise
continue finally is return
def for lambda try
del from not while
Line 70: Line 70:
以下划线开始或者结束的标识符通常有特殊的意义。例如以一个下划线开始的标识符(如 _foo)不能用from module import *语句导入。前后均有两个下划线的标识符,如__init__,被特殊方法保留。前边有两个下划线的标识符,如__bar,被用来实现类私有属性,这个将在第七章--类与面向对象编程中讲到。通常情况下,应该避免使用相似的标识符。 以下划线开始或者结束的标识符通常有特殊的意义。例如以一个下划线开始的标识符(如 `_foo`)不能用from module import *语句导入。前后均有两个下划线的标识符,如`__init__`,被特殊方法保留。前边有两个下划线的标识符,如`__bar`,被用来实现类私有属性,这个将在第七章--类与面向对象编程中讲到。通常情况下,应该避免使用相似的标识符。
Line 144: Line 144:


== 运算符、分隔符及特殊符号 ==

Python 目前支持以下运算符:
{{{
+ - * ** // / % << >> & | ^
+= -= *= **= //= /= %= <<= >>= &= |= ^=
~ < > <= >= == != <>
}}}
下边的这些可以作为表达式,列表,字典,以及语句不同部分的分隔符号:
{{{
( ) [ ] { } , : . ` = ;
}}}
比如,等号(=),作为对象名和所分配值之间的分隔符;逗号(,)用来分隔函数参数、列表或tuple中的元素;小数点(.)用在浮点数和扩展切片操作中的省略符(...),

下边这些特殊符号也在语句中使用:

' " # \ @

{{{
注:Python 2.4 中新增了 @ 符号用作函数修饰符 ---Wei Zhong
}}}

字符$、?不能在程序语句中出现,但是可以出现在字符串中。

== 文档字符串 ==

如果一个模块、类、或函数体的第一个语句是未命名一个字符串,该字符串就自动成为该对象的文档字符串`( DocStrings )`,如下例:
{{{#!python
def fact(n):
    "This function computes a factorial"
    if (n <= 1): return 1
    else: return n*fact(n-1)
}}}
代码浏览及文档生成工具经常用到文档字符串。通过访问一个对象的`__doc__`属性,你可以得到文档字符串:
{{{
这个 __doc__ 属性竟然是可写的。--WeiZhong
}}}
{{{
>>> print fact._ _doc_ _
This function computes a factorial
>>>
}}}
文档字符串的缩进必须与定义中的其他语句一致。此外,在不同行出现的多个未命名字符串不会自动连结成一个字符串,即使他们紧挨着。(注意:返回的文档字符串仅仅是第一个字符串,这与前边讲到的字符串的自动连结有所不同,注意区别)。

[:WeiZhong/2006-01-18:Python精要参考第二章]

[:WeiZhong/2006-01-17:Python 精要参考(第二版)] Python Essential Reference, Second Edition 译文

原著:David M Beazley 出版商: New Riders Publishing

初译: Feather andelf@gmail,com 修正补充: WeiZhong weizhong2004@gmail,com TableOfContents

第二章 语法及代码约定

本章讲述了Python程序的语法和代码约定。 本章的主题有行结构,语句分组,保留字,字符串,运算符,token等等,另外对如何使用 Unicode 字符串也做了详细的描述。

行结构/缩进

程序中的每个语句都以换行符结束。特别长的语句可以使用续行符(\)来分成几个短小的行,如下例:

import math
a = math,cos(3*(x-n)) + \
    math,sin(3*(y-n))

当你定义一个三引号字符串、列表、tuple 或者字典的时候不需要续行符来分割语句。及就是说,在程序中,凡是圆括号(,,,)、方括号[,,,]、花括号{,,,}及三引号字符串内的部分均不需要使用续行符。

缩进被用来指示不同的代码块,比如函数的主体代码块,条件执行代码块,循环体代码块及类定义代码块。缩进的空格(制表符)数目可以是任意的,但是在整个块中的缩进必须一致:

   1 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异常。

分号(;)可以把多个语句放在同一行中,只有一个语句的行也可以用分号来结束。

#指示这是一个延长至行末的注释,但是包在字符串内的#没有这个功能。

最后要说明的,解释器会忽略所有的空白行(非交互模式下)。

标识符及保留字

标识符是用于识别变量、函数、类、模块以及其他对象的名字,标识符可以包含字母、数字及下划线(_),但是必须以一个非数字字符开始。字母仅仅包括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,被用来实现类私有属性,这个将在第七章--类与面向对象编程中讲到。通常情况下,应该避免使用相似的标识符。

数字/文字

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 

运算符、分隔符及特殊符号

Python 目前支持以下运算符:

+       -       *       **      //      /       %       <<      >>      &       |       ^
+=      -=      *=      **=     //=     /=      %=      <<=     >>=     &=      |=      ^=
~       <       >       <=      >=      ==      !=      <>

下边的这些可以作为表达式,列表,字典,以及语句不同部分的分隔符号:

(    )      [    ]      {    }      ,      :      .      `      =      ;

比如,等号(=),作为对象名和所分配值之间的分隔符;逗号(,)用来分隔函数参数、列表或tuple中的元素;小数点(.)用在浮点数和扩展切片操作中的省略符(...),

下边这些特殊符号也在语句中使用:

' " # \ @

注:Python 2.4 中新增了 @ 符号用作函数修饰符 ---Wei Zhong 

字符$、?不能在程序语句中出现,但是可以出现在字符串中。

文档字符串

如果一个模块、类、或函数体的第一个语句是未命名一个字符串,该字符串就自动成为该对象的文档字符串( DocStrings ),如下例:

   1 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
>>>

文档字符串的缩进必须与定义中的其他语句一致。此外,在不同行出现的多个未命名字符串不会自动连结成一个字符串,即使他们紧挨着。(注意:返回的文档字符串仅仅是第一个字符串,这与前边讲到的字符串的自动连结有所不同,注意区别)。

WeiZhong/2006-01-18 (last edited 2009-12-25 07:17:10 by localhost)