Skip to content

流程控制

逻辑运算符

与数据库 sql 语句相似

  • 成员运算符:in 后面讲列表了会讲

  • 比较运算符:== > >= < <= <> !=
    对于None的判断除了比较运算符,更推荐用is Noneis not None,其他情况不用 is
    在 python3 中,是否不等于<>被取消了,想要使用需要开启实验性/兼容语法

    python
    from __future__ import barry_as_FLUFL
  • 逻辑运算符:and or not

  • 位运算符:| & ~ ^ >> <<

内置模块operator里的函数与运算符映射。

赋值运算符

赋值运算符  =  用于给变量赋值。
在 python 中,声明和赋值都是等号  = ,赋值语句本身不会返回任何结果
在 python3.8 中新增的海象运算符(the walrus operator):=,其表达式会赋值同时返回左值的引用。

连续赋值

python
c = 1
a = b = c = 1
print(a, b, c)

赋予相当于起别名,多个变量表示的会是同一个内存地址

内置函数id()

使用内置函数id()可以查看内存地址的表示;
布尔表达式中也可以连用比较==,多个值全等的时候将返回Ture

python
print(id(a) == id(b) == id(c))

当变量被修改的时候,内置函数id()也会重新指向。
对于可变的容器类型,其成员被修改,容器的id()将不会发生变化。

布尔表达式

布尔表达式是逻辑运算的计算式。
逻辑运算符优先级为:()> not > and > or 。同优先级进行从左往右先后计算。
二元逻辑运算符会先后将其两边的表达式结果,隐式地转化为bool类型后再参与逻辑运算

python
1 and True  # 相当于 bool(1) and True
# True

内置函数bool()显式地把其他类型转换为bool 类型
bool类型只有两个值:TrueFalse

  • 非零非空转换成布尔类型是 True
  • 0 ,None 等值转换成布尔类型是 False

值得注意的是:

与 JavaScript 不同,python 中如bool([])等空对象都是 False。
而 JavaScript 中只要是对象都是 true。
事实上,这是对象的魔术方法__bool__所定义的。

连续比较

比较运算符可以连续使用

python
if 2015 > y > 2018:
    pass

if 等分支语句需要换行缩进,推荐 4 空格。也可以是 tab,但是要一致。

只有一行语句时可以不换行。

短路法

在计算布尔表达式结果时往往只判断左边就既定了结果:
x or y 如果x==True,则返回 x
x and y 如果x==True,则返回 y
短路之后,逻辑运算符右侧的隐式进行类型转换将不会进行,直接返回:

python
0 or [] or 1 or 3
# 1
0 or [] or 3 or 1
# 3
1 and True and [] and 0
# []
1 and True and 0 and []
# 0

流程控制

python 中 流程控制相关代码块都不具备独立的命名空间
流程控制中的条件是布尔表达式,if while也能隐式地将结果转换为布尔值。

pass ...

pass 或者...表示空语句,一般在需要缩进的情况下起到占位作用。

...其实是个内置常量Ellipsis 还可用来自定义参数占位

if-elif-else

ifelifelse语句 可以用 elif 并列多个条件。elif 和 else 是可选的

python
if 条件1:
    # 条件满足就
    pass
elif 条件2:
    # 可选 上一个条件不满足,这个条件满足
    pass
else:
    # 可选 否则就
    pass

match-case

3.10 以上版本特性;某些条件下过多的 elif 可以写为 match-case

python
def http_error(status):
    match status:
        case 200 | 304:
            return "OK"
        case 404:
            return "Not found"
        case _ if _ > 499:
            return "Server Error"
        case _:
            return "unknow status"

while-else

终止循环的方式:

  • 改变条件,使其不成立。
  • break强行结束循环
python
count = 0
while count <= 5:
    print(count)
    count += 1
else:
    print("循环正常执行完")  # 可选

continue可以跳过本轮循环。

else 可选,循环正常执行完(不break),或第一次就不满足时进入 else 分支。

for-in-else

可以循环一个可迭代对象

python
for 成员变量 in 容器:
    # 循环体
    ...

例如,打印名单,这里以列表为例:

python
namelist = ["Aqua", "Shion", "Ayame"]
for name in namelist:
    print(name)

循环正常执行完(不break),或for in 空容器时进入 else 分支。

语句和表达式

在 python 中,a + b是表达式,a = b是语句

内置函数eval()exec()

exec可以将字符串或字节代码对象当作语句执行。
eval可以将字符串或字节代码对象当作表达式执行得到返回值。
如果使用eval执行的原代码块是语句而不是表达式将会抛出SyntaxError异常。
异常处理将在下一章讲到。

python
# 模拟python shell交互式
while 1:
    ex = input(">>> ")
    try:
        try:
            print(eval(ex))
        except SyntaxError as e:
            exec(ex)
    except Exception as e:
        print("Traceback (most recent call last):")
        print(e)

内置函数compile()

compile() 函数将一个字符串编译为字节代码对象。
mode 参数指定编译代码的种类。可以指定为 'exec', 'eval', 'single'

python
# 模拟python shell交互式
while 1:
    ex = input(">>> ")
    try:
        exec(compile(ex, "", "single"))
    except Exception as e:
        print("Traceback (most recent call last):")
        print(e)

两种模拟交互的方式略有区别,前者可以返回None值,但这往往不符合预期。