Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

Python 语言参考 (TLDR 版 Part I)

$
0
0

本参考手册描述 python 的语法及“核心语义”,简洁但力图精准、完备,如需:

内置对象类型、函数及模块,请参考 Python 标准库 ; Python 教程,请参考 Python 教程 ; 总目录 介绍 词法分析 数据模型 执行模型 导入系统 表达式 简单语句 复合语句 顶层组件 完整语法规范 1. 介绍 1.1. 实现 CPython:最常见常用的 C 语言实现,托管在 GitHub ; Jython Python for .NET IronPython PyPy:Python 实现的 Python,支持无堆栈和 JIT,官网 PyPy 。 1.2. 记法说明

本手册采用不严格的 BNF 语法标记法,如:

name ::= lc_letter (lc_letter | "_")* lc_letter ::= "a"..."z" ::= 定义规则 | 表示可选,即“或” * 表示前项重复0或多次 + 表示前项重复1到多次 [] 表示所包含项出现0或1次(即可有可无) () 表示分组 "" 表示字符 (空格)仅表示分隔 ... 表示 ASCII 表中某范围内的所有符号 2. 词法分析 2.1. 行结构

Python 程序由一系列 逻辑行 组成;逻辑行以 NEWLINE 结尾由一个或多个通过连接规则连接在一起的 物理行 ; 物理行 以 行尾序列 结尾。

注释:以 # 开头的物理行。

编码声明:Python 3.5 默认源码文件编码方式为 UTF-8;若需指定编码方式,可在头两行加入能被正则 coding[=:]\s*([-\w.]+) 捕捉的编码声明,若放在第二行,则第一行必须被注释,常用的声明方式为: # -*- coding: <encoding-name> -*- 显式行连接

通过反斜杠 \ 可以显式连接物理行,但不能与注释符 # 同处一行;字面量中只有字符串可以使用反斜杠连接多行:

if 1900 < year < 2100 and 1 <= month <= 12 \ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date return 1 隐式行连接

圆括号(元组)、方括号(列表)、花括号(字典)的内部可以直接跨多个物理行而被隐式连接为一个逻辑行,且可以在每行结尾添加注释:

month_names = ['Januari', 'Februari', 'Maart', # These are the 'April', 'Mei', 'Juni', # Dutch names 'Juli', 'Augustus', 'September', # for the months 'Oktober', 'November', 'December'] # of the year

三引号的多行字符串形式也是一种隐式行连接,但注释行将失效。

缩进

逻辑行是通过开头的空白符(空格或制表符)数量来计算该行的缩进层级的。 不要混用制表符和空格 。

通过 INDENT 和 DEDENT 和栈结构来处理多行语法块。

2.2. 其它

除了 NEWLINE 、 INDENT 、 DEDENT 之外,还包括如下几类符号(Token):

标识符 关键字 字面量 操作符 分隔符

空格只用于分隔符号,存在歧义时,取最长字符所代表的符号。

2.3. 标识符与关键字

标识符:ASCII 中的大小写字母,数字 0 到 9,下划线 _ ,Python 3 引入 Unicode 字符也可合法。

关键字: False class finally is return None continue for lambda try True def from nonlocal while and del global not with as elif if or yield assert else import pass break except in raise 保留标识符: _* :下划线开头的变量在 from module import * 时不会被导入; _ 本身也是特殊标识符,在交互模式下用于表示上一次执行的结果,在非交互模式下,没有特殊含义,只用作占位符(如 for _ in range(n) ); __*__ :参考 特殊方法名 ; __* :类中的私有属性名。 2.4. 字面量

字面量表示某些内置类型常量,即“所见即值”。

字符串与字节 stringliteral ::= [stringprefix](shortstring | longstring) stringprefix ::= "r" | "u" | "R" | "U" shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"' longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""' shortstringitem ::= shortstringchar | stringescapeseq longstringitem ::= longstringchar | stringescapeseq shortstringchar ::= <any source character except "\" or newline or the quote> longstringchar ::= <any source character except "\"> stringescapeseq ::= "\" <any source character> bytesliteral ::= bytesprefix(shortbytes | longbytes) bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"' longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""' shortbytesitem ::= shortbyteschar | bytesescapeseq longbytesitem ::= longbyteschar | bytesescapeseq shortbyteschar ::= <any ASCII character except "\" or newline or the quote> longbyteschar ::= <any ASCII character except "\"> bytesescapeseq ::= "\" <any ASCII character>

单、双引号包围的短字符串和三引号包围的多行长字符串(字节),均可以 r"" 或 R"" 开头表示原始字符串,在这种情况下反斜杠 \ 不再起到转义功能;以 u"" 或 U"" 开头是为了表示 Unicode 字符,这在 Python 3 以后是没有必要的,只是为了兼容 2.x 以前的代码。

字符串可以通过如下形式跨行连接:

re.compile("[A-Za-z_]" # letter or underscore "[A-Za-z0-9_]*" # letter, digit or underscore ) 整数 integer ::= decimalinteger | octinteger | hexinteger | bininteger decimalinteger ::= nonzerodigit digit* | "0"+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" octinteger ::= "0" ("o" | "O") octdigit+ hexinteger ::= "0" ("x" | "X") hexdigit+ bininteger ::= "0" ("b" | "B") bindigit+ octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F" bindigit ::= "0" | "1"

只要内存允许,长度没有限制;非 0 的十进制整数前不能有 0。

浮点数 floatnumber ::= pointfloat | exponentfloat pointfloat ::= [intpart] fraction | intpart "." exponentfloat ::= (intpart | pointfloat) exponent intpart ::= digit+ fraction ::= "." digit+ exponent ::= ("e" | "E") ["+" | "-"] digit+

科学计数法中整数与指数都是十进制的。浮点数值的范围与具体实现相关。

虚数 imagnumber ::= (floatnumber | intpart) ("j" | "J") 复数

将实数与虚数相加。

2.5. 操作符 + - * ** / // % @ << >> & | ^ ~ < > <= >= == != 2.6. 分隔符 ( ) [ ] { } , : . ; @ = -> += -= *= /= //= %= @= &= |= ^= >>= <<= **=

以下字符在字符串以外出现是非法的:

$ ? `


Viewing all articles
Browse latest Browse all 9596

Trending Articles