语句和控制结构的若干问题
下面讨论一些前面没有涉及的与语句和控制结构有关的问题

表达式语句(expression statement)

把一个表达式或者一个逗号分隔的表达式列表写在语句的位置,就是一个表达式语句。系统对表达式语句执行也就是去求出它的值。

在交互式执行的方式下,求出的值将被转换为字符串输出在解释器的窗口里,使人可以看到。如果在脚本(程序)的方式下写表达式语句,求出的值就直接丢掉,不会显示。

由此可见,如果一个表达式的计算只是得到一个值,我们完全没必要将其写在程序里需要语句的位置上,因为它对程序的执行没有任何影响(除了可能消耗一些计算时间)。

但有时确实需要写表达式语句,例如写独立的函数调用。在 Python 里函数调用是一类表达式,它们可能出现在更复杂的表达式里,也可能提供用于赋值的值。独立写出的函数调用就是一个表达式语句,这种语句是经常需要的。最典型的一个例子是内部函数 print 的使用,用一些实参调用它将产生一些输出。调用 print 函数返回的值总是 None,没有什么用。

语句列表(statement list)

在前面的程序示例中,我们总是在一行里只写一个简单语句。实际上 Python 也允许在一行里写多个简单语句,语句之间用分号分隔,这就是语句列表。在一个语句列表的最后可以写或者不写符号,两者没有任何不同。

如果有几个很短的语句,可以用语句列表的形式把它们写在一行里。这样做有可能缩短一段程序的长度。但一般而言,Python 倡导在一行里只写一个语句的形式。

with语句

(语言手册 8.5 节,What is new in Python 2.6 里的 PEP 343 和Python 网页的最新版)

with 语句用于建立局部上下文,将一些表达式的值约束于一些局部的名字。其语法形式是

with 表达式 as 变量, 表达式 as 变量 ... :
    语句组
语句头部可以有一个或多个 "with段"("表达式 as 变量" 段)。在执行时,依次求值 "表达式" 并将其值约束于对应的 "变量"。最后在这样建立起的上下文中执行 with 语句的体。 下面是几个使用 with 语句的例子:
with A(...) as a, B(...) as b:
    ... ...
with open('fname.dat', 'r') as f:
    for line in f:
        ... ...
对于后一个例子,我们还需要结合 with 语句的深层语义说两句。看起来这个语句和简单的
for line in open('fname.dat', 'r') :
    ... ...
但实际上用 with 语句的写法更好些,因为它会在这个 with 语句完成前自动关闭打开的文件,即使是在内嵌的 for 语句由于执行中发生异常而退出的情况下,也能保证文件的正确关闭。

with 语句的作用是创建一个新的上下文,因此在进入和退出时都要做上下文的转换。

在程序执行进入 with 语句时,with 语句将求值其头部表达式得到的对象的约束放入新的上下文,这时它将自动执行这些对象的 __enter()__ 方法,在退出这里建立的上下文时,又会执行这些对象的 __exit__() 方法。由于文件对象的 __exit__() 方法包含关闭文件,所以就会有上面说的效果。

__enter__() 和 __exit__() 方法也是所有类实例都有的方法,默认由 object 类提供,默认动作是什么也不做。我们在自己定义类时,可以为类的实例定义这两个方法。如果有这样的定义,在进入和退出与这个类的实例相关的 with 语句时就会自动执行这两个方法。

本页及相关页面(除另声明者外)由裘宗燕创建维护,可自由用于各种学习活动。其他使用需得到作者许可。