第二章: 未整理

词汇和语法约定

-章介绍Python^序的词汇和语法约定。本章涉及的主题包括行结构、语句分组、保留字、字

+面量、运算符、标记和源代码编码。

2.1行结构和缩进

程序中的每条语句都以换行符结束。可以使用续行符V将长语句分为几行,如下所示:

math.cos(3 * (x - n)) + \ math.sin(3 * (y - n))

使用三引号定义的字符串、列表、元组或字典分布在多行上时,不需要使用续行符。更具体地说, 包含在圆括号(.*.)、方括号[...]、大括号或三引号中的任意程序部分都可以放在多行上,而 不需要使用续行符,因为它们清晰地表示出了定义的开始和结束。

缩进用于表示不同的代码块,如函数体、条件语句、循环和类。代码块中首条语句的缩进量可以 是任意的,但整个代码块中的缩进必须保持一致,例如:

if a:

statementl #缩进一致,正确 statement2

else:

statement3

statement4 #缩进不一致,错误

如果函数体、条件语句、循环或类较短,而且只包含一条语句,就可以将其放在同一行上,例如:

if a statementelse statements

要表示一个空的函数体或代码块,可使用pass语句,例如:

if a

pass

else:

statements

尽管可以用制表符进行缩进,但并不鼓励这样做6 Python^程社区的首选是用空格(而且也鼓励 你这样做)。遇到制表符时,系统会将其转换为移到下一个为8倍数的列所需的空格量(例如,如果一 个制表符出现在第11列中,那么由于要移到第16行,所以中间会用空格填充)。如果运行Pyhtori时使用 -t选项,那么在同一程序代码块中发现有制表符和空格混用的情况时,就会显示警告信息。使用-tt 选项可将这些警告信息转换为TabError异常。

www.TopSage.com

使用分号结尾,但这是可选的。

#字符表示此行的内容都是注释,但出现在引号字符串中的#号无此作用。

最后,除非是在交互模式下运行,否则解释器将忽略所有空白行。在这种情况下,如果正在输入

一条多行语句,空白行表示输入结束。

2.2标识符和保留字

标识符是识别变量、函数、类、模块和其他对象的名称。标识符可以包含字母、数字和下划线_) 但必须以非数字字符开始。字母目前只允许使用ISO-Latin字符集中的字符A~Za~Z。由于标识符是 区分大小写的,所以F00foo是两个不同的标识符。诸如$、%和@等的特殊符号不允许出现在标识 符中。另外,ifelsefor这样的单词是保留字,也不能用作标识符名称。下面的列表显示了 所有保留字:

and 

del 

from 

nonlocal 

try 

as 

elif 

global 

not 

while 

assert 

else 

if 

or 

with 

break 

except 

import 

pass 

yield 

class 

exec 

in 

print 

 

continue 

finally 

is 

raise 

 

def 

for 

lambda 

return 

 

以下划线开始或结束的标识符通常具有特殊含义。例如,以一个下划线开始的标识符(如_foo) 不能使用from module import *语句导入。前后均带有双下划线的标识符(如_init_)是为 特殊方法保留的,而只有前面带有双下划线的标识符(如_Joar)则用于实现私有的类成员,这一点 将在第7章介绍。一般应避免使用相似的标识符。

2.3数字字面量

内置的数字字面ft分为4种类型:

□布尔值 □整数 口浮点数 □复数

标识符TrueFalse被解释为布尔值,其整数值分别是10。像1234这样的数字被解释为十进

制整数。要使用八进制、十六进制或二进制指定整数,可以在值的前面分别加上0OxOb(例如0644

0xl00fea8或 OblllOlOlO)

Python中,整数的位数是任意的,所以,如果要指定一个非常大的整数,只需写出所有位数,

1234568901234567890。但是在检査值和査看过去的Python代码时,可能会看到后面加上字母(小写的L)L字符的大数字,如12345678901234567890L。这个结尾处的L表示Python会根据值 的大小,选择将整数内部表示为固定精度的机器整数或任意精度的长整数类型。在老版本的Python中, 可以显式地选择使用任一种类型,并且可以在数字结尾加上字母L表示这是长类型。如今,这种区分 已经没有必要,不鼓励使用。因此,表示大整数值时不必加上L

123.M1.2334e+02这样的数字被解释为浮点数。整数或浮点数后面上jJ就构成了虚

www.TopSage.com

22 2章词汇和语法约定

数,如12.34J。用一个实数加上一个虚数就构成了复数,方法是将实数和虚数加起来,如 1.2+12.34J

2.4字符串字面

字符串字面量用于指定一个字符序列,其定义方法是把文本放入单引号9、双引号或三 引号("?或""")中。这三种引号形式在语义上没有差别,但要求在字符串开始和结尾使用的引号 类型必须相同。置于单引号和双引号中的字符串必须定义在一行上,而三引号的字符串可以分布在多 行上并包括所有格式符号(即换行符、制表符、空格等)在内。相邻字符串(由空格、换行符或续行 符隔开),itPhello" 抴orld•将被连接起来,形成一个字符串揾elloworld?

在字符串字面量中,反斜杠⑴字符用于转义特殊字符,如换行符、反斜杠本身、弓I号和非打印 字符。表2-1列出了可识别的一些转义码。无法识别的转义符序列将保持原样,包括最前面的反斜杠 在内。

2-1标准的字符转义码

字    符 

描    述 

续行符 

\\ 

反斜杠 

\* 

单引号 

双引号 

\a 

Bell (音箱发出提示音) 

\b 

退格符 

\e
\0 

Escape
Null (空值) 

\n
\v
\t 

换行符 垂直制表符 水平制表符 

\r 

回车符 

\f 

换页符 

\ooo 

八进制值\000~\377) 

\uxxxx 

Unicode字符\u0000~ \uffff

\Uxxxxxxxx 

Unicode字符\U00000000- \Uffffffff) 

\N{字符名称} 

Unicode字符名称 

\xhh 

十六进制值xOO~xff) 

转义码\000\xffl于将字符嵌人到很难输人的字符串字面跫(如控制码、非打印字符、符号、国 际字符等)中。必须为这些转义码指定对应于字符值的整数值。例如,如果要输入单词Jalapefio的字 符串字面量,可以输入1旿alape\xflo?其中的\xf 1就是fl的字符代码。

Python2中,字符串字面量对应于8位字符或面向字节的数据。关于这些字符串有一个很重要的 限制,即它们无法完全支持国际字符集和Unicode。为了解决这种限制问题,Python2Unicode数据使 用了单独的字符串类型。要输入Unicode字符串字面量,要在第一个引号前加上前缀nu\例如:

s = unJalape\u00floM

www.TopSage.com

2.5容器 23

Python 3中,不必加这个前缀字符(而且如果加上会算作语法错误),因为所有字符串已经是 Unicode编码。如果使用-U选项运行解释器,Python 2将会模拟这种行为。(即所有字符串字面量将被 作为Unicode字符对待,u前缀可以省略。)

无论你正在使用哪个Python版本,表2-1中的\u、转义码都可用于在Unicode字面量中插入 任意字符。每个Unicode字符都有一个指定的代码点code point)Unicode字符集中一般表示为 u+xxxx,其中xxxx是由44"或更多个十六进制数字表示的序列。(注意,这种表示法并非Python语法, 但作者在描述Unicode字符时经常使用它J例如,字符的代码点是U+00F1\u转义码用于插入代码 点范围在U+0000U+FFFF之间的Unicode字符(例如\u00fl)\1)转义码用于插入代码点范围在 U+1000 0及以上的字符(例如\U00012345)。使用\U转义码时请注意,代码点在U+10000以上的 Unicode字符通常被分解为一对字符,称为代理编码对surrogate pair)。这与Unicode字符串的内部表 示有关,第3章将会对此进行更详细的介绍。

Unicode字符还具有描述性名称。如果知道名称,就可以使用\N{字符名称}转义序列,例如:

uaJalape\N{LATIN SMALL LETTER N WITH TILDE}oa

关于代码点和字符名称的权威性参考,请参阅http://www.unicode.org/charts

另外,可以在字符串字面量前面加上rR如这些字符串称为原始字符串,因为其中所 有的转义字符都会原封不动地保留,也就是说,这种字符串包含的文本只表示其字面上的含义,包括 反斜杠在内。原始字符串的主要用途是指定其中反斜扛字符是有实际含义的字面量。例如re模块中正 则表达式的规范,或者指定Windows计算机上的一个文件名。(例如:r*c:\newdata\tests*。)

原始字符串不能以单个反斜杠结尾,如在原始字符串中,如果前面\字符的数量是奇数个, \uAXYX转义序列仍然会解释为Unicode字符。例如,ur玕ul234?定义的是包含单个字符U+1234的原始 Unicode字符串,而ur揬\ul234。定义的则是包含7个字符的字符串,其中前两个字符是反斜杠,余下个字符是字面量〜1234'此外在Python 2.2中,在如上所示的原始Unicode字符串中,r必须出现在之后。在Python3.0中,u前缀是可选的。

不能使用对应于UTF-8UTF-16数据编码的原始字节序列来定义字符串字面量。例如,直接输入 像?nbsp;Jalape\xc3\xblo?这样的原始UTF-8编码字符串,将会产生一个9个字符的字符串U+004A、 U+0061U+006CU+0061U+0070U+0065U+00C3U+00B1U+006F这可能不是你想要的 结果。因为在UTF-8中,多字节序列\xc3\xbl代表一个字符U+00F1而不是两个字符U+00C3U+00B1。 要将一个已编码的字节字符串指定为字面量,在第一个引号前加上Bb獼alape\xC3\xblO。。这 样才能从字面上创建一个单字节的字符串。通过这种表示方法,使用decode()方法解码字节字面量的 值就可以创建一个普通的字符串,关于该内容的更多细节,将在第3章和第4章中介绍。

字节字面量在大多数程序中都极少使用,因为这种语法直到Python 2.6才出现,而且在该版本中, 字节字面量和普通字符串之间没有差别。但在Python 3中,字节字面量变成了与普通字符串不同的新 的bytes数据类型(参阅附录A)o

2.5容器

将一些值放在方括号[...]、圆括号(...)和花括号内,可分别表示一个列表、元组和字

典中包含的对象集合,如下所示:

13.4# * hello* ]    # 一个列表

= ( 10, 20, 30 )    # 一个元组

www.TopSage.com

24 2章词汇和语法约定

c = { 'a*  3, 'b1  42 }    # 一个字典

列表、元组和字典字面量可以在不使用续行符(\)的情况下分布在多行上。另外,最后一项后面 允许跟一个逗号,例如:

a = [ 1,

3.4

'hello',

1

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

Python可以识别的运算符有:

+ -    ***///% «    »    &    |

八-    <    ><=>===!=    <>    +-

-=    *=    / =    II?nbsp;   %=    * *=    &=    |=    八=    >>=    << =

以下标记可以用作表达式、列表、字典和语句不同部分的分隔符:

例如,等号(=)在赋值语句中可用作名称和值之间的分隔符,而逗号{J则可用于分隔函数的 各个参数,列表和元组中的各个元素等。小数点C)可用在浮点数中以及在扩展切片操作中作为省 略号C)。

最后,语句中也会用到下面这堅特殊符号:

' ° # \ 0

字符$和?在Python中没有任何意义,不能出现在程序中,但可以出现在引号中的字符串字面量中。

2.7文档字符串

如果摸块、类或函数定义的第一条语句是一个字符串,该字符串就成为了相关对象的文档字符串,

如下所示:

def fact(n)?/span>

"This function computes a factorial"

if (n <= 1): return 1

else: return n * fact(n - 1)

代码浏览工具和文档生成工具有时会用到文档字符串。通过对象的__doc__属性可以访问文档字 符串,如下所示:

>>> print fact.__doc__

This function computes a factorial

?gt;

文挡字符串的缩进必须与定义中的所有其他语句保持一致,另外,文档字符串不能通过表达式进 行计算或者通过变量进行赋值。文档字符串始终是包含在引号中的字符串字面量。

2.8装饰器

函数、方法或类定义的前面可以使用一个特殊的符号,称为装饰器,其目的是修改定义后面的行 为。装饰器使用@符号表示,必须放在单独的行上并且位于对应的函数、方法或类之前,例如:

class Foo(object):

www.TopSage.com

2.9源代码编码    25

Sstaticmethod

def bar()    ?/span>

pass

可以使用多个装饰器,但每个装饰器必须位于不同的行上,例如:

@foo

@bar

def spam{): pass

6章和第7章中将介绍有关装饰器的更多内容。

2.9源代码编码

编写Python源程序时一般使用标准的7ASCII码。但是,在Unicode环境中工作的用户可能会发 现这很别扭一特别是当他们必须使用国际字符写出大量字符串字面;ft时。

只需在Python程序的第1行或第2行中包含一个特殊的编码注释,就可以使用不同的编码编写

Python源代码:

拜!/usr/bin/env python #    coding: UTF-8

s = "Jalapefio" #引号中的字符串直接使用UTF-8编码.

提供特殊的coding:注释语句时,可以直接使用支持Unicode的编辑器输入字符串字面量。但是, Python的其他元素(包括标识符名称和保留字)目前只能使用ASCII字符。


猜你喜欢

转载自www.cnblogs.com/amou/p/9038401.html