流程控制
逻辑运算符
与数据库 sql 语句相似
成员运算符:
in
后面讲列表了会讲比较运算符:
==
>
>=
<
<=
<>
!=
对于None
的判断除了比较运算符,更推荐用is None
和is not None
,其他情况不用 is
在 python3 中,是否不等于<>
被取消了,想要使用需要开启实验性/兼容语法pythonfrom __future__ import barry_as_FLUFL
逻辑运算符:
and
or
not
位运算符:
|
&
~
^
>>
<<
内置模块operator
里的函数与运算符映射。
赋值运算符
赋值运算符 =
用于给变量赋值。
在 python 中,声明和赋值都是等号 =
,赋值语句本身不会返回任何结果
在 python3.8 中新增的海象运算符(the walrus operator):=
,其表达式会赋值同时返回左值的引用。
连续赋值
c = 1
a = b = c = 1
print(a, b, c)
赋予相当于起别名,多个变量表示的会是同一个内存地址
内置函数id()
使用内置函数id()
可以查看内存地址的表示;
布尔表达式中也可以连用比较==
,多个值全等的时候将返回Ture
print(id(a) == id(b) == id(c))
当变量被修改的时候,内置函数id()
也会重新指向。
对于可变的容器类型,其成员被修改,容器的id()
将不会发生变化。
布尔表达式
布尔表达式是逻辑运算的计算式。
逻辑运算符优先级为:()
> not
> and
> or
。同优先级进行从左往右先后计算。
二元逻辑运算符会先后将其两边的表达式结果,隐式地转化为bool
类型后再参与逻辑运算
1 and True # 相当于 bool(1) and True
# True
内置函数bool()
会显式地把其他类型转换为bool
类型bool
类型只有两个值:True
和False
- 非零非空转换成布尔类型是
True
- 0 ,None 等值转换成布尔类型是
False
值得注意的是:
与 JavaScript 不同,python 中如bool([])
等空对象都是 False。
而 JavaScript 中只要是对象都是 true。
事实上,这是对象的魔术方法__bool__
所定义的。
连续比较
比较运算符可以连续使用
if 2015 > y > 2018:
pass
if 等分支语句需要换行缩进,推荐 4 空格。也可以是 tab,但是要一致。
只有一行语句时可以不换行。
短路法
在计算布尔表达式结果时往往只判断左边就既定了结果:x or y
如果x==True
,则返回 xx and y
如果x==True
,则返回 y
短路之后,逻辑运算符右侧的隐式进行类型转换将不会进行,直接返回:
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
if
…elif
…else
语句 可以用 elif 并列多个条件。elif 和 else 是可选的
if 条件1:
# 条件满足就
pass
elif 条件2:
# 可选 上一个条件不满足,这个条件满足
pass
else:
# 可选 否则就
pass
match-case
3.10 以上版本特性;某些条件下过多的 elif 可以写为 match-case
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
强行结束循环
count = 0
while count <= 5:
print(count)
count += 1
else:
print("循环正常执行完") # 可选
continue
可以跳过本轮循环。
else 可选,循环正常执行完(不break
),或第一次就不满足时进入 else 分支。
for-in-else
可以循环一个可迭代对象
for 成员变量 in 容器:
# 循环体
...
例如,打印名单,这里以列表为例:
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 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 shell交互式
while 1:
ex = input(">>> ")
try:
exec(compile(ex, "", "single"))
except Exception as e:
print("Traceback (most recent call last):")
print(e)
两种模拟交互的方式略有区别,前者可以返回None
值,但这往往不符合预期。