python-3.8.0 新特性之赋值表达式

python-3.8.0 新特性之赋值表达式python

赋值表达式的语法是这样的“ name := expression ”,形式上看和赋值语句 “ = ” 差很少,就做用上来看也雷同。也就是说 “:=” 不是必不可少的,它只是一个锦上添花的新语法。sql

 

一、例子express

假设咱们要对列表中的元素个数进行判断,当其大于 3 个的时候打印出提示信息,用老的语法咱们能够这样写。socket

#!/usr/bin/env python3

if __name__ == "__main__":
    ls = [1,2,3,4,5]
    if len(ls) > 3: # 第一次计算 len(ls)
        print(f"ls is too long ({len(ls)} elements,expected < 3)") # 第二次计算 len(ls)

能够看到在上面的代码中咱们重复的计算了 len(ls) ,虽然 python 内部对于 len(ls) 会有一些优化操做,可是咱们并不想重复本身,要优化办法也是有的把 len(ls) 前置一下就行。优化

#!/usr/bin/env python3

if __name__ == "__main__":
    ls = [1,2,3,4,5]
    n = len(ls) # 第一次计算 len(ls)
    if n > 3:
        print(f"ls is too long ({n} elements,expected < 3)") # 直接使用变量 n ,省去了一次计算过程

 

二、用新特性重写spa

感受说什么都是在注水,直接上代码code

#!/usr/bin/env python3

if __name__ == "__main__":
    ls = [1,2,3,4,5]
    if (n:=len(ls)) > 3: # 只要计算一次
        print(f"ls is too long ({n} elements,expected < 3)") # 直接使用赋值表达式中的 n 一样也省去了一次计算

 

三、两种写法的比较对象

优劣分析blog

# 写法 一 
#!/usr/bin/env python3

if __name__ == "__main__":
    ls = [1,2,3,4,5]
    n = len(ls)
    if n > 3:
        print(f"ls is too long ({n} elements,expected < 3)")

# 写法 二
#!/usr/bin/env python3

if __name__ == "__main__":
    ls = [1,2,3,4,5]
    if (n:=len(ls)) > 3:
        print(f"ls is too long ({n} elements,expected < 3)")

 

python 这门语言最好的一个地方就在于它的一致性,无论是专家仍是初生牛犊,只要一看到他人的代码大体就能够猜到他接下来想作什么,长此以往同一类型的问题就有了最 pythonic 的写法了。element

第一种写法当咱们看到 “n = len(ls)” 时即不能回答做者想要用 n 来作什么?也不能回答“后面的代码必定会用到 n 吗?”这样的问题,要解答这些问题都要要求咱们往下看代码。

第二种写法当咱们看到 “if (n:=len(ls)) > 3:” 一来咱们直接能够看出这个 if 依赖于 n 的值,二来后面的代码也很是有可能会用到 n ,若是不用的话直接写成 “if len(ls) > 3:” 不就好了吗? 

总结:把正确的属性用在正确的地方是能够提升代码可读性的。

 

四、:= 与 = 的关系

看官方的意思 “:=” 是做为 “=” 的一个补充而存在的,并非想用 “:=” 替换掉 “=”,下面看一下它两是互补的一个例子

#!/usr/bin/env python3

if __name__ == "__main__":
    x = 5
    print(f"x = {x}")

    y := 5 # SyntaxError: invalid syntax
    print(f"y = {y}")
    #这样的写法是会报语法错误的,我以为这里体现了官方的两个重要的思想
    # 一、能够用 "=" 解决的事就不要用 ":=" 防止引发混乱
    # 二、对于一个给定的问题最 pythonic 的写法一般只有一种

    (z := 5)
    print(f"z = {z}")

 

五、新写法带来的最佳实践

# 一 简化 os.fork 
if pid := os.fork():
    # Parent code
else:
    # Child code

# 二 直接到把 socket 对象的 read buffer 读完为止
while data := sock.recv(8192):
    print("Received data:", data)

 

转自

https://www.sqlpy.com/blogs/books/2/chapters/10/articles/51

相关文章
相关标签/搜索