Python简单语句

Python简单语句简单语句包括表达式语句、赋值语句、assert 语句、pass 语句、del 语句、return 语句、yield 语句、raise 语句、break 语句、continue 语句、import 语句、global 语句、nonlocal 语句和type 语句。

简单语句由一个单独的逻辑行构成。 多条简单语句可以存在于同一行内并以分号分隔。 简单语句的句法为:

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

一、表达式语句

表达式语句用于计算和写入值(大多是在交互模式下),或者(通常情况)调用一个过程 (过程就是不返回有意义结果的函数;在 Python 中,过程的返回值为 None)。 表达式语句的其他使用方式也是允许且有特定用处的。 表达式语句的句法为:

expression_stmt ::= starred_expression

表达式语句会对指定的表达式列表(也可能为单一表达式)进行求值。

在交互模式下,如果结果值不为 None,它会通过内置的 repr() 函数转换为一个字符串,该结果字符串将以单独一行的形式写入标准输出(例外情况是如果结果为 None,则该过程调用不产生任何输出。)

二、赋值语句

参见《Python赋值语句》。

三、assert语句

assert 语句是在程序中插入调试性断言的简便方式:

assert_stmt ::= "assert" expression ["," expression]

简单形式 assert expression 等价于:

if __debug__:
if not expression: raise AssertionError

扩展形式 assert expression1, expression2 等价于:

if __debug__:
if not expression1: raise AssertionError(expression2)

以上等价形式假定 __debug__ 和 AssertionError 指向具有指定名称的内置变量。 在当前实现中,内置变量 __debug__ 在正常情况下为 True,在请求优化时为 False (对应命令行选项为 -O)。 如果在编译时请求优化,当前代码生成器不会为 assert 语句发出任何代码。 请注意不必在错误信息中包含失败表达式的源代码;它会被作为栈追踪的一部分被显示。

注意:赋值给 __debug__ 是非法的。 该内置变量的值会在解释器启动时确定。

四、pass语句

pass_stmt ::= "pass"

pass 是一个空操作 --- 当它被执行时,什么都不发生。 它适合当语法上需要一条语句但并不需要执行任何代码时用来临时占位,例如:

def f(arg): pass # a function that does nothing (yet)
class C: pass # a class with no methods (yet)

五、 del语句

del_stmt ::= "del" target_list

删除是递归定义的,与赋值的定义方式非常类似。目标列表的删除将从左至右递归地删除每一个目标。

名称的删除将从局部或全局命名空间中移除该名称的绑定,具体作用域的确定是看该名称是否有在同一代码块的 global 语句中出现。 如果该名称未被绑定,将会引发 NameError。

属性引用、抽取和切片的删除会被传递给相应的原型对象;删除一个切片基本等价于赋值为一个右侧类型的空切片(但即便这一点也是由切片对象决定的)。

六、return语句

return_stmt ::= "return" [expression_list]
  • return 在语法上只会出现于函数定义所嵌套的代码,不会出现于类定义所嵌套的代码。如果提供了表达式列表,它将被求值,否则以 None 替代。
  • return 会离开当前函数调用,并以表达式列表 (或 None) 作为返回值。当 return 将控制流传出一个带有 finally 子句的 try 语句时,该 finally 子句会先被执行然后再真正离开该函数。
  • 在一个生成器函数中,return 语句表示生成器已完成并将导致 StopIteration 被引发。 返回值(如果有的话)会被当作一个参数用来构建 StopIteration 并成为 StopIteration.value 属性。
  • 在一个异步生成器函数中,一个空的 return 语句表示异步生成器已完成并将导致 StopAsyncIteration 被引发。 一个非空的 return 语句在异步生成器函数中会导致语法错误。

七、yield语句

yield_stmt ::= yield_expression

yield 语句在语义上等同于 yield 表达式。 yield 语句可用来省略在使用等效的 yield 表达式语句时所必须的圆括号。 例如,以下 yield 语句:

yield <expr>
yield from <expr>

等同于以下 yield 表达式语句

(yield <expr>)
(yield from <expr>)

yield 表达式和语句仅在定义 generator 函数时使用,并且仅被用于生成器函数的函数体内部。 在函数定义中使用 yield 就足以使得该定义创建的是生成器函数而非普通函数。

八、raise语句

参见《Python raise语句》。

九、break语句

break_stmt ::= "break"

break 在语法上只会出现于 for 或 while 循环所嵌套的代码,但不会出现于该循环内部的函数或类定义所嵌套的代码。

它会终结最近的外层循环,如果循环有可选的 else 子句,也会跳过该子句。如果一个 for 循环被 break 所终结,该循环的控制目标会保持其当前值。

当 break 将控制流传出一个带有 finally 子句的 try 语句时,该 finally 子句会先被执行然后再真正离开该循环。

十、continue语句

continue_stmt ::= "continue"

continue 在语法上只会出现于 for 或 while 循环所嵌套的代码中,但不会出现于该循环内部的函数或类定义中。 它会继续执行最近的外层循环的下一个轮次。

当 continue 将控制流传出一个带有 finally 子句的 try 语句时,该 finally 子句会先被执行然后再真正开始循环的下一个轮次。

十一、import语句

参见《Python import语句》。

十二、global语句

global_stmt ::= "global" identifier ("," identifier)*

global 语句是作用于整个当前代码块的声明,所列出的标识符将被解读为全局变量,要给全局变量赋值不可能不用到 global 关键字,不过自由变量也可以指向全局变量而不必声明为全局变量。

  • 在 global 语句中列出的名称不得在同一代码块内该 global 语句之前的位置中使用。
  • 在 global 语句中列出的名称不能被定义为形式参数,也不能被作为 with 语句或 except 子句的目标,以及 for 循环的目标列表、class 定义、函数定义、import 语句或变量标注等等。

CPython 实现细节: 当前的实现并未强制要求所有的上述限制,但程序不应当滥用这样的自由,因为未来的实现可能会改为强制要求,并静默地改变程序的含义。

程序员注意事项:global 是对解析器的指令。 它仅对与 global 语句同时被解析的代码起作用。 特别地,包含在提供给内置 exec() 函数字符串或代码对象中的 global 语句并不会影响 包含 该函数调用的代码块,而包含在这种字符串中的代码也不会受到包含该函数调用的代码中的 global 语句影响,同样适用于 eval() 和 compile() 函数。

十三、nonlocal语句

nonlocal_stmt ::= "nonlocal" identifier ("," identifier)*

nonlocal 语句会使得所列出的名称指向之前在最近的包含作用域中绑定的除全局变量以外的变量。 这种功能很重要,因为绑定的默认行为是先搜索局部命名空间。 这个语句允许被封装的代码重新绑定局部作用域以外且非全局(模块)作用域当中的变量。

与 global 语句中列出的名称不同,nonlocal 语句中列出的名称必须指向之前存在于包含作用域之中的绑定(在这个应当用来创建新绑定的作用域不能被无歧义地确定)。nonlocal 语句中列出的名称不得与之前存在于局部作用域中的绑定相冲突。

十四、type语句

type_stmt ::= 'type' identifier [type_params] "=" expression

type 语句声明一个类型别名,即 typing.TypeAliasType 的实例。例如,以下语句创建了一个类型别名:

type Point = tuple[float, float]

此代码大致等价于:

annotation-def VALUE_OF_Point():
return tuple[float, float]
Point = typing.TypeAliasType("Point", VALUE_OF_Point())

annotation-def 指定一个 标注作用域,其行为很像是一个函数,但有几个小差别。

类型别名的值是在标注作用域中被求值的。 当创建类型别名时它不会被求值,只有当通过该类型别名的 __value__ 属性访问时它才会被求值 ,允许类型别名引用尚未被定义的名称。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录