python的表达式, 不受重视, 官方文档像坨屎一样
顺便说一句, 虽然本文大量吐槽, 但是请考虑python诞生的年代, 并请考虑python的初心(去除括号), 并请考虑这么多年python的坚持(对比ruby的各种妥协)

表达式为什么重要

  • 表达式 = 字面量, 意思是必然有一个值的式子, 这个是functional的基础
  • python本身的面向对象就像坨屎, 想要绕过这个屎一样的面向对象, 必然要搞明白表达式
  • 为什么说python的面向对象是坨屎? 因为, 他集齐了吉祥三宝
    1. 除四害: class extend new this
  • super, 代表继承, 定义不在本地, 导致无法把握
  • this, 代表对象的定义在类上面, 也是, 定义不在本地(对照字面量定义)
  • new, 代表从类->对象同上
    1. 没有默认return this, 导致, 无法链式调用
    2. 生命周期导致代码稀碎的, 无法把同一个业务的内容写在一起.

字符串

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
ifelse 条件表达式
lambda lambda 表达式
:= 赋值表达式

最终感悟, 官方这个文档并不是开发文档, 其实是编译器设计规格说明书