Python/cpython中的简单语句详解
什么是简单语句
在Python编程语言中,简单语句(Simple statements)是指那些可以在一行内完整表达的语句。Python语法允许在一行中使用分号分隔多个简单语句。简单语句是Python语法中最基础的构建块之一,它们构成了程序的基本执行单元。
简单语句包含多种类型,每种类型都有其特定的语法和用途:
- 表达式语句
- 赋值语句
- 增强赋值语句
- 带注解的赋值语句
- pass语句
- del语句
- return语句
- yield语句
- raise语句
- break语句
- continue语句
- import语句
- global语句
- nonlocal语句
- 类型语句
表达式语句
表达式语句是Python中最简单的语句形式,主要用于计算和输出值,或者调用函数(特别是那些不返回有意义结果的函数,在Python中这类函数返回None)。
表达式语句的语法非常简单:
expression_stmt: starred_expression
在交互模式下,如果表达式的值不是None,Python会使用内置的repr()函数将其转换为字符串并输出到标准输出。这使得交互式编程非常方便,可以立即看到表达式的结果。
赋值语句详解
赋值语句是Python中最常用的语句之一,用于将名称绑定到值,或者修改可变对象的属性或元素。
基本语法
赋值语句的基本语法如下:
target_list = expression
其中target_list可以是一个或多个目标,用逗号分隔。Python支持多种形式的赋值目标:
- 简单变量名(标识符)
- 元组或列表形式的多个目标(解包赋值)
- 属性引用(如obj.attr)
- 下标引用(如list[index])
- 切片(如list[start:end])
- 带星号的目标(用于扩展的可迭代对象解包)
赋值规则
Python的赋值操作遵循以下规则:
- 首先计算右边的表达式
- 然后按照从左到右的顺序将结果分配给目标列表
- 如果目标是可变对象的一部分(属性、下标或切片),则由该对象决定如何执行赋值
解包赋值
Python支持强大的解包赋值功能:
# 简单解包
a, b = 1, 2
# 带星号的解包
first, *middle, last = [1, 2, 3, 4, 5]
解包赋值时,右边的可迭代对象必须包含足够数量的元素来匹配左边的目标(考虑星号目标可以匹配零个或多个元素)。
变量绑定规则
当目标是一个简单名称时:
- 如果名称没有在global或nonlocal语句中声明:
- 名称绑定到当前局部命名空间中的对象
- 如果名称在global或nonlocal语句中声明:
- 名称绑定到全局或外层命名空间中的对象
属性赋值注意事项
当对类实例的属性进行赋值时,有一个重要的行为需要注意:
class MyClass:
x = 10 # 类属性
obj = MyClass()
obj.x = obj.x + 1 # 这会创建一个实例属性x,值为11,类属性x保持不变
在这个例子中,右边的obj.x访问的是类属性(因为实例属性还不存在),而左边的obj.x则创建一个新的实例属性。
增强赋值语句
增强赋值语句(如+=、-=等)将二元操作和赋值组合在一个语句中:
augmented_assignment_stmt: augtarget augop (expression_list | yield_expression)
常见的增强赋值操作符包括:
+= -= *= /= //= %= **=
&= |= ^= >>= <<=
增强赋值与普通赋值的区别在于:
- 目标只被计算一次
- 操作可能就地修改对象(如果对象支持)
- 左边在右边之前被计算
例如,a[i] += f(x)
会先查找a[i],然后计算f(x),执行加法,最后将结果写回a[i]。
带注解的赋值语句
Python支持在赋值时为变量添加类型注解:
annotated_assignment_stmt: augtarget ":" expression ["=" (starred_expression | yield_expression)]
注解赋值与普通赋值的区别在于:
- 只允许单个目标
- 可以包含类型注解
- 在类和模块作用域中,注解会被收集到特殊的注解作用域中
注解不会影响运行时的行为,主要用于静态类型检查和IDE支持。
assert语句
assert语句用于在程序中插入调试断言:
assert_stmt: "assert" expression ["," expression]
简单形式assert expr
等价于:
if __debug__:
if not expr: raise AssertionError
带消息的形式assert expr1, expr2
等价于:
if __debug__:
if not expr1: raise AssertionError(expr2)
在优化模式下(使用-O选项),assert语句不会生成任何代码。
pass语句
pass语句是一个空操作,当它被执行时什么也不发生。它通常用作语法上的占位符:
pass_stmt: "pass"
示例:
def empty_function():
pass
class EmptyClass:
pass
del语句
del语句用于删除名称或对象的元素:
del_stmt: "del" target_list
del可以删除:
- 变量名(从命名空间中移除绑定)
- 列表中的元素
- 字典中的键
- 对象的属性
删除名称时,如果名称未绑定,会引发NameError异常。
总结
Python的简单语句虽然语法简单,但功能强大且灵活。理解这些语句的工作原理对于编写高效、清晰的Python代码至关重要。从基本的表达式和赋值,到更高级的解包和增强赋值,这些构建块构成了Python编程的基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考