def add_one(num):
return num + 1
numbers = [1,2,3,4,-2,45,6]
>>> result2 = [(value := add_one(num)) for num in numbers if value > 0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
NameError: name 'value' is not defined
**第三种情况:**全局变量为正时
def add_one(num):
return num + 1
numbers = [1,2,3,4,-2,45,6]
value = 1
result3 = [(value := add_one(num)) for num in numbers if value > 0]
>>> result3
[2, 3, 4, 5, -1]
**情况4:**全局变量设置为negitive时
def add_one(num):
return num + 1
numbers = [1,2,3,4,-2,45,6]
value = -1
result4 = [(value := add_one(num)) for num in numbers if value > 0]
>>> result4
[]
4条答案
按热度按时间nxagd54h1#
PEP 572包含了许多细节,特别是第一个问题。我将尝试简要地总结/引用PEP中最重要的部分:
基本原理
在解析中允许这种形式的赋值,例如列表解析和lambda函数,传统的赋值是禁止的。这也可以促进交互式调试,而无需代码重构。
推荐用例示例
a)获取条件值
例如(在Python 3中):
可以变成:
类似地,从the docs:
在本例中,赋值表达式有助于避免两次调用len():
B)简化列表解析
例如:
可以变成:
语法和语义
在任何可以使用任意Python表达式的上下文中,都可以出现一个named expression。其形式为
name := expr
,其中expr
是任何有效的Python表达式,name是一个标识符。这样的命名表达式的值与合并的表达式相同,但附加的副作用是为目标分配该值
与常规赋值语句的区别
除了是一个表达式而不是语句之外,PEP中还提到了几个不同之处:表达式赋值从右到左,逗号周围的优先级不同,并且不支持:
eyh26e7m2#
下面是我最喜欢的几个例子,说明赋值表达式可以使代码更简洁,更易于阅读:
if
语句之前:
之后:
无限
while
语句之前:
之后:
PEP中还有其他很好的例子。
h43kikqp3#
更多的例子和理由,现在3.8已经正式发布。
命名表达式的结果是编程的重要部分,允许使用描述性名称代替较长的表达式,并允许重用。目前,此功能仅在语句形式中可用,因此在列表解析和其他表达式上下文中不可用。
来源:LicensedProfessional's reddit comment
处理匹配的正则表达式
不能使用2-argiter()简单重写的循环
重用计算成本高的值
在解析筛选子句及其输出之间共享子表达式
9fkzdhlc4#
什么是:= operator?
简单来说,:=是一个表达式+赋值运算符。它执行一个表达式,并将该表达式的结果赋值给单个变量。
为什么需要:=运算符?
一个简单有用的例子是减少解析中的函数调用,同时保持可编辑性。
让我们考虑一个列表解析,如果结果大于0,则加1并过滤,而不使用:=操作符。2这里我们需要调用add_one函数两次。
案例1:
结果和预期的一样,我们不需要调用add_one函数来调用两次,这显示了**:=运算符的优点
在使用列表解析时要小心使用walarus:=运算符
下面的案例可能有助于您更好地理解:=**运算符的用法
案例2:
**第三种情况:**全局变量为正时
**情况4:**全局变量设置为negitive时