Python的表达式
python的表达式, 不受重视, 官方文档像坨屎一样
顺便说一句, 虽然本文大量吐槽, 但是请考虑python诞生的年代, 并请考虑python的初心(去除括号), 并请考虑这么多年python的坚持(对比ruby的各种妥协)
表达式为什么重要
- 表达式 = 字面量, 意思是必然有一个值的式子, 这个是functional的基础
- python本身的面向对象就像坨屎, 想要绕过这个屎一样的面向对象, 必然要搞明白表达式
- 为什么说python的面向对象是坨屎? 因为, 他集齐了吉祥三宝
- 除四害: class extend new this
- super, 代表继承, 定义不在本地, 导致无法把握
- this, 代表对象的定义在类上面, 也是, 定义不在本地(对照字面量定义)
- new, 代表从类->对象同上
- 没有默认return this, 导致, 无法链式调用
- 生命周期导致代码稀碎的, 无法把同一个业务的内容写在一起.
字符串
f'两位小数的字符串{8.198:.2f}'
元祖
- 特别注意, 括号并不是元祖的定义, 元祖的定义是逗号,
- 与其说括号可以省略, 不如说, 某些情况为了避免歧义所以加上了括号
- 单独的* 可以用来拆包
list
[x*y for x in range(10) for y in range(x, x+10)]
字典
- 可以做表达式
- ** 是拆包, 纯纯的有病和元祖的拆包形式不同
生成器和yield
# 一个可以next的玩意
(x*y for x in range(10) for y in range(x, x+10))
# 这个和上一个差不多, 都是惰性求值
def gen(): # defines a generator function
yield 123
取值
- 对象可以用点: aaa.bbb
- 集合数据都可以中括号: aaa[bbb]
- []可以支持切片[a:b]
- 函数可以调用 xxx(pp)
```python
#### 布尔运算
- python的布尔运算独具一格, 都是关键字, 没有符号
```python
a and b
a or b
not a
key判断
# in 判断, dic的key不存在时, 这个安全
a in b # 直接使用返回的是true/false
a not in b
# 搭配if/for
if a in b:
....
for a in b:
....
# 可以用get函数替代不少in的场景
age = ages.get(person, 0) # 可以直接给默认值0
# 这个和in究竟哪个更好, 就见仁见智了
# is 判断, dic的key不存在时, 不安全
float('nan') is None
None is None
# == 判断, dic的key不存在时, 不安全
'' == None # false
float('nan') != float('nan') # true
if条件表达式
# 特别神奇(神经病), 竟然是中置运算符
判断为真的值 if 判断条件 else 判断为假的值
赋值表达式
- 独具一格, 他家的赋值本身不是表达式, 赋值表达式才是
- python煞费苦心, 但是, 打破了functional基础假设: 万物皆有值
a = b # 这里不是表达式, 本身没有任何值
a := b # 这个才是表达式, 本身的值取决于等号右边的最终结果
# 但是赋值表达式还不能直接使用, 必须有应用场景, 例如下面这种判断场景
if matching := pattern.search(data):
do_something(matching)
# 循环里面的判断场景也能用
while chunk := file.read(9000):
process(chunk)
lambda表达式
lambda parameters: expression
# 等同于定义了一个匿名函数
def <lambda>(parameters):
return expression
运算符优先级
特别提示, 服了官方文档了, 这里面漏了很多内容……官方的意思, 恐怕是大家领悟一下就好了
运算符 | 描述 |
---|---|
(,) ,[,] , {key: value} , {,} |
元祖,列表,字典,集合 |
x[] , x[:] , x(arg) , x.att |
抽取,切片,调用,属性引用 |
await x |
await 表达式 |
** |
乘方 2**-1 为 0.5 |
+x , -x , ~x |
正,负,按位非 NOT |
* , @ , / , // , % |
乘,矩阵乘,除,整除,取余 %可以用作字符串格式化 |
+ , - |
加和减 |
<< , >> |
移位 |
& |
按位与 AND |
^ |
按位异或 XOR |
| |
按位或 OR |
in , not in , is , is not , < , <= , > , >= , != , == |
比较运算,包括成员检测和标识号检测 |
not x |
布尔逻辑非 NOT |
and |
布尔逻辑与 AND |
or |
布尔逻辑或 OR |
if – else |
条件表达式 |
lambda |
lambda 表达式 |
:= |
赋值表达式 |
最终感悟, 官方这个文档并不是开发文档, 其实是编译器设计规格说明书