简单语句:由单个逻辑行构成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 simple_stmt ::= expression_stmt | assert_stmt | assignment_stmt | augmented_assignment_stmt | annotated_assignment_stmt | pass_stmt | del_stmt | return_stmt | yield_stmt | raise_stmt | break_stmt | continue_stmt | import_stmt | future_stmt | global_stmt | nonlocal_stmt
Expression Statements 表达式语句:用于计算、写入值(交互模式下),或调用过程(不
返回有意义结果的函数)
1 expresssion_stmt ::= starred_expression
用途:表达式语句对指定表达式[列表]进行求值
交互模式下
若值不为None
:通过内置repr()
函数转换为字符串,
单独一行写入标准输出
值为None
:不产生任何输出
Assignment Statements 赋值语句:将名称[重]绑定到特定值、修改属性或可变对象成员项
1 2 3 4 5 6 7 8 9 assignment_stmt ::= (target_list "=" )+ (starred_expression | yield_expression) target_list ::= target ("," target)* ["," ] target ::= identifier | "(" [target_list] ")" | "[" [target_list] "]" | attributeref | subscription | slicing | "*" target
赋值目标为列表 赋值目标(左端项)为列表(可选包含在圆括号、方括号内)
若目标列表为不带逗号、可以包含在圆括号内的单一目标,将
右端项赋值给该目标
否则:右端项须为与目标列表相同项数 的可迭代对象,其中
元素将从左至右顺序被赋值给对应目标
若目标列表包含带*
元素:则类似实参解包,其须为可迭代
对象,且右端项至少包含目标列表项数-1
加星目标前元素被右端项前段元素一一赋值
加星目标后元素被右端项后段元素一一赋值
加星目标被赋予剩余目标元素构成的列表
赋值目标为单个目标 目标为标识符(名称)
若名称已经被绑定则被重新绑定,可能导致之前被绑定名称
对象引用计数变为0,对象进入释放过程并调用其析构器
目标为属性引用
目标为抽取项
目标为切片
引用中原型表达式被求值:应当产生可变序列对象
上界、下界表达式若存在将被求值
其应为整数,若为负数将对原型表达式序列长度求模,最终
边界被裁剪至0、序列长度开区间中
默认值分别为零、序列长度
切片被赋值为右端项
若切片长度和右端项长度不同,将在目标序列允许情况下
改变目标序列长度
Augmented Assignment Statements 增强赋值语句:在单个语句中将二元运算和赋值语句合为一体
1 2 3 4 augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) augtarget ::= identifier | attributeref | subscription | slicing augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" | ">>=" | "<<=" | "&=" | "^=" | "|="
Annotated Assignment Statements 带标注的赋值语句:在单个语句中将变量、或属性标注同可选赋值
赋值语句合并
1 annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
关键字语句 assert
assert语句:在程序中插入调试性断言的简便方式
1 assert_stmt ::= "assert" expression ["," expression]
pass
pass语句:空操作,被执行时无事情发生
del
del语句:从局部、全局命名空间中移除名称的绑定,若名称未绑定
将raise NameError
1 del_stmt ::= "del" target_list
删除是递归定义的
类似赋值的定义方式
从左至右递归的删除目标列表中每个目标
属性、抽取、切片的删除会被传递给相应原型对象
return
return语句:离开当前函数调用,返回列表表达式值、None
1 return_stmt ::= "return" [expression_list]
yield
yield语句:语义上等于yield表达式
1 yield_stmt ::= yield_expression
yield表达式参见cs_python/py3ref/#todo
raise
raise语句:引发异常
1 raise_stmt ::= "raise" [expression ["from" expression]]
异常串联
异常串联可以通过在from
子句中指定None
显式抑制
break
break语句:终结最近外层循环、循环的可选else
子句
break
在语法上只出现在for
、while
所嵌套代码
若for
循环被break
终结,循环控制目标保持当前值
当break
将控制流传出带有finally
子句的try
语句时,
finally
子句会先被执行,然后真正离开循环
continue
continue语句:继续执行最近外层循环的下一伦茨
1 continue_stmt ::= "continue"
import
import语句
1 2 3 4 5 6 7 8 import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])* | "from" relative_module "import" identifier ["as" identifier] ("," identifier ["as" identifier])* | "from" relative_module "import" "(" identifier ["as" identifier] ("," identifier ["as" identifier])* [","] ")" | "from" module "import" "*" module ::= (identifier "." )* identifier relative_module ::= "." * module | "." +
导入机制参见cs_python/py3ref/import_system
绑定
若模块名称后带有as
,则在as
之后名称将直接绑定到所导入
模块
若没有指定其他名称、且被导入模块为最高层级模块,则模块
名称被绑定到局部命名空间作为对所导入模块的引用
若被导入模块不是最高级模块,则包含该模块的最高层级包名将
被绑定到局部命名空间作为的该最高层级包的引用,所导入模块
必须使用完整限定名称访问而不能直接访问
from
子句
*
通配符标识符列表为通配符*
形式:模块中定义的全部公有名称都被绑定
至import
语句作用域对应局部命名空间
通配符模式仅在模块层级允许使用,在类、函数中使用将
raise SyntaxError
相对导入 相对导入:指定导入模块时,无需指定模块绝对名称
需要导入的模块、包被包含在同一包中时,可在相同顶级包中
进行相对导入,无需指明包名称
在from
子句中指定的模块、包中使用前缀点号指明需要上溯
包层级数
一个前缀点号:执行导入的模块在当前包
两个前缀点号:上溯一个包层级
三个前缀点号:上溯两个包层级,依此类推
1 form ...sub_sub_pkg import mod1
相对导入可以避免模块之间产生冲突,适合导入相关性强代码
脚本模式(在命令行中执行.py
文件)不支持相对导入
要跨越多个文件层级导入,只需要使用多个.
,但
PEP 328 建议,相对导入层级不要超过两层
future 语句future语句:指明莫格特定模块使用在特定、未来某个python发行版
中成为标准特性的语法、语义
1 2 3 4 5 future_stmt ::= "from" "__future__" "import" feature ["as" identifier] ("," feature ["as" identifier])* | "from" "__future__" "import" "(" feature ["as" identifier] ("," feature ["as" identifier])* [","] ")" feature ::= identifier
import __future__ [as name]
:不是future语句,只是没有
特殊语义、语法限制的普通import语句
global
global语句:声明所列出标识符将被解读为全局变量
1 global_stmt ::= "global" identifier ("," identifier)*
nonlocal
nonlocal语句:使得列出的名称指向之前最近的包含作用域中
绑定的、除全局变量外的变量
1 nonlocal_stmt ::= "nonlocal" indentifier ("," identifier)*