Python &引用;:=&引用;语法和赋值表达式:什么和为什么?
介绍为Python3.8实现的赋值表达式(通俗称为Walrus运算符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值 赋值表达式的语法、语义和语法规范究竟是什么 “添加赋值表达式”中的一个类似想法以前被拒绝了,为什么要引入这个新的(似乎相当激进的概念)?包含了许多细节,特别是第一个问题。我将尝试简要总结/引用政治公众人物计划中最重要的部分: 基本原理 在理解中允许这种形式的赋值,例如列表理解,以及禁止传统赋值的lambda函数。这还可以促进交互式调试,而无需代码重构 推荐的用例示例 a) 获取条件值 例如(在Python 3中): 可以成为: 同样,来自: 在本例中,赋值表达式有助于避免调用len() 两次: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函数。这还可以促进交互式调试,而
- 不指定给单个名称的分配:
- 可拆卸包装/拆包
- 内联类型批注:
- 不支持扩充分配:
下面是我最喜欢的几个例子,说明赋值表达式可以使代码更加简洁易读:
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]