Python &引用;:=&引用;语法和赋值表达式:什么和为什么?

Python &引用;:=&引用;语法和赋值表达式:什么和为什么?,python,python-3.x,python-3.8,python-assignment-expression,walrus-operator,Python,Python 3.x,Python 3.8,Python Assignment Expression,Walrus Operator,介绍为Python3.8实现的赋值表达式(通俗称为Walrus运算符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值 赋值表达式的语法、语义和语法规范究竟是什么 “添加赋值表达式”中的一个类似想法以前被拒绝了,为什么要引入这个新的(似乎相当激进的概念)?包含了许多细节,特别是第一个问题。我将尝试简要总结/引用政治公众人物计划中最重要的部分: 基本原理 在理解中允许这种形式的赋值,例如列表理解,以及禁止传统赋值的lambda函数。这还可以促进交互式调试,而

介绍为Python3.8实现的赋值表达式(通俗称为Walrus运算符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值

赋值表达式的语法、语义和语法规范究竟是什么

“添加赋值表达式”中的一个类似想法以前被拒绝了,为什么要引入这个新的(似乎相当激进的概念)?

包含了许多细节,特别是第一个问题。我将尝试简要总结/引用政治公众人物计划中最重要的部分:

基本原理

在理解中允许这种形式的赋值,例如列表理解,以及禁止传统赋值的lambda函数。这还可以促进交互式调试,而无需代码重构

推荐的用例示例

a) 获取条件值

例如(在Python 3中):

可以成为:

同样,来自:

在本例中,赋值表达式有助于避免调用len() 两次:

  • 不指定给单个名称的分配:
  • 可拆卸包装/拆包
  • 内联类型批注:
  • 不支持扩充分配:

下面是我最喜欢的几个例子,说明赋值表达式可以使代码更加简洁易读:

if
语句 之前:

match=pattern.match(行)
如果匹配:
返回匹配。组(1)
之后:

如果匹配:=模式匹配(行):
返回匹配。组(1)
无限
while
语句 之前:

为True时:
数据=f.read(1024)
如果没有数据:
打破
使用(数据)
之后:

而数据:=f.read(1024):
使用(数据)

现在3.8已经正式发布,还有一些例子和理论

命名表达式的结果是编程的一个重要部分,允许使用描述性名称代替较长的表达式,并允许重用。目前,此功能仅在语句形式中可用,因此在列表理解和其他表达式上下文中不可用

资料来源:

处理匹配的正则表达式

无法使用2-arg iter()简单重写的循环

重复使用计算成本高昂的值

在理解筛选器子句及其输出之间共享子表达式


是否有关于该主题的有机提问可以通过链接到此参考问题来结束?如果一个问题涉及到公共副本的来源,那么这个问题可能会变得“过于宽泛”,这当然是有道理的。这应该重新讨论。这绝对不是“太宽”。这是一个非常具体的主题,也是一个非常好的参考问题。虽然它不应该太字面化,因为我相信Python可能在某些方面有所不同,这是Go最好的特性之一,整个Go文档都提供了一个历史视角:在PEP 572获得批准之前,Python开发人员进行了长时间的热烈讨论。这似乎就是圭多辞去BDFL职务的原因。赋值表达式有许多有效的用例,但也很容易被误用,从而降低代码的可读性。我现在正在测试它,它不是唯一的区别,这里只列出了一个,我的观点是,这可能是一个非常好的规范问答,但它需要一个严肃的问题polish@Adelin我想知道如果alpha版本将在2019年发布,您将如何测试它。@JC-您可以随时构建来测试Python的最新版本。Python开发人员就是这样做的,但是任何好奇的人也可以做同样的事情,特别是好的例子:它们展示了C有时比Python更清晰、更优雅的一面,我想他们永远不会解决这个问题
command = input("> ")
while command != "quit":
    print("You entered:", command)
    command = input("> ")
while (command := input("> ")) != "quit":
    print("You entered:", command)
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
x = y = z = 0  # Equivalent: (z := (y := (x := 0)))
# No equivalent
a[i] = x
self.rest = []
# Equivalent needs extra parentheses

loc = x, y  # Use (loc := (x, y))
info = name, phone, *rest  # Use (info := (name, phone, *rest))

# No equivalent

px, py, pz = position
name, phone, email, *other_info = contact
# Closest equivalent is "p: Optional[int]" as a separate declaration
p: Optional[int] = None
total += tax  # Equivalent: (total := total + tax)
if (match := pattern.search(data)) is not None:
    # Do something with match
while chunk := file.read(8192):
   process(chunk)
[y := f(x), y**2, y**3]
filtered_data = [y for x in data if (y := f(x)) is not None]