:=
操作数的具体含义是什么?
有人能解释一下如何阅读这段代码吗?
node := root, cost = 0
frontier := priority queue containing node only
explored := empty set
更新的答案
在这个问题的上下文中,我们正在处理伪代码,但从Python 3.8开始,:=
实际上是一个允许在表达式中分配变量的有效运算符:
# Handle a matched regex
if (match := pattern.search(data)) is not None:
# Do something with match
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
process(chunk)
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]
详见PEP 572。
原始答案
您发现的是伪代码
伪代码是操作的非正式高级描述计算机程序或其他算法的原理。
:=
实际上是赋值运算符。在Python中,这只是=
。
要将这个伪代码翻译成Python,您需要了解被引用的数据结构,以及更多的算法实现。
关于伪码的一些注意事项:
:=
是赋值运算符或Python中的=
=
是相等运算符或Python中的==
- 有某些款式,您的里程数可能会有所不同:
Pascal风格
procedure fizzbuzz
For i := 1 to 100 do
set print_number to true;
If i is divisible by 3 then
print "Fizz";
set print_number to false;
If i is divisible by 5 then
print "Buzz";
set print_number to false;
If print_number, print i;
print a newline;
end
C样式
void function fizzbuzz
For (i = 1; i <= 100; i++) {
set print_number to true;
If i is divisible by 3
print "Fizz";
set print_number to false;
If i is divisible by 5
print "Buzz";
set print_number to false;
If print_number, print i;
print a newline;
}
请注意大括号用法和赋值运算符之间的差异。
PEP572提出支持Python中的:=
运算符,以允许在表达式中进行变量赋值。
Python 3.8中提供了此语法。
此符号:=
是Python中的赋值运算符(通常称为Walrus运算符alrus运算符压缩了我们的代码,使其更短。
这里有一个非常简单的例子:
# without walrus
n = 30
if n > 10:
print(f"{n} is greater than 10")
# with walrus
if (n := 30) > 10:
print(f"{n} is greater than 10")
这些代码是相同的(并且输出相同的东西),但正如您所看到的,带有walrus运算符的版本只压缩在两行代码中,以使内容更加紧凑。
现在,你为什么要使用海象操作符
首先,不要觉得有义务。
我自己甚至很少用这个。我只是使用walrus运算符来压缩我的代码,主要是在使用正则表达式时。
您也可以找到自己的使用案例。重要的是,当你遇到这样的问题时,你对它有一个大致的想法,并知道什么时候它会有所帮助。
这就是我如何在更高层次上解释海象操作员。希望你有所收获。
问题中的代码是伪代码;其中:=
表示分配。
不过,对于未来的访问者来说,以下内容可能更为相关:Python的下一个版本(3.8)将获得一个新的运算符:=
,允许赋值表达式(详细信息、激励性示例和讨论可以在PEP 572中找到,该版本于2018年6月底暂时接受)。
有了这个新的操作符,你可以写这样的东西:
if (m := re.search(pat, s)):
print m.span()
else if (m := re.search(pat2, s):
…
while len(bytes := x.read()) > 0:
… do something with `bytes`
[stripped for l in lines if len(stripped := l.strip()) > 0]
而不是这些:
m = re.search(pat, s)
if m:
print m.span()
else:
m = re.search(pat2, s)
if m:
…
while True:
bytes = x.read()
if len(bytes) <= 0:
return
… do something with `bytes`
[l for l in (l.strip() for l in lines) if len(l) > 0]
10月14日3.8发布快乐!
有一种新的语法
:=
,它将值分配给变量,作为更大表达式的一部分。它被亲切地称为"海象操作员",因为它长得像海象的眼睛和獠牙。在本例中,赋值表达式有助于避免调用
len()
两次:if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
Python 3.8中的新增功能-赋值表达式
:=
也称为海象算子。我们可以使用这个walrus操作符来赋值,同时进行条件检查。
例如:
没有海象操作员:
a = 10
if a == 10:
print("yes")
使用海象操作员:
if (a := 10) == 10:
print("Yes")
所以,我们不仅可以在语句中使用变量a
,也可以在语句之后使用。它将简单地将新值分配给变量并启用条件检查。