有人可以帮助下面的代码片段吗?
(e, x), y = d
yhat = atom_count @ w + b
baseline_val_loss = [0.0 for _ in range(epochs)]
我正在寻找上述三行的口头解释,因为我从未在shell脚本中看到这些语法。我正在学习的代码是位于https://dmol.pub/applied/QM9.html
一本书的一部分。
(1)(e, x), y = d
你在这里所做的实际上是解包将变量d
中的值放入元组(e, x)
和变量y
中。这只适用于d
与左侧的格式相同的情况。
例如,假设d = ((3, 3), 4)
。然后:
d = ((3, 3), 4)
(e, x), y = d
print(e) # prints 3
print(x) # prints 3
print(y) # prints 4
更简单的例子是:
a, b = 2, 3
print(a) # prints 2
print(b) # prints 3
(x, y, z) = (10, 20, 30)
print(x) # prints 10
print(y) # prints 20
print(z) # prints 30
唯一的区别是,在你的例子中,你使用的是一个元组,因此你需要正确地解包所有的值。
(2)yhat = atom_count @ w + b
@
运算符是用于矩阵乘法的运算符,在Python 3.5中添加。
在这里你本质上声明了一个变量yhat
,它等于矩阵atom_count
和w+b
的矩阵乘法。例如:
import numpy as np
A = np.array([
[1, 2],
[3, 4]
])
B = np.array([
[4, 5],
[6, 7]
])
print(A @ B) # prints [[19 22]
# [43 50]]
(3)baseline_val_loss = [0.0 for _ in range(epochs)]
这叫做列表推导式。这是一种初始化列表的方法,而不是编写冗长的for
循环。这里你正在初始化一个名为baseline_val_loss
的列表,其中epochs
为零。
如果您有epochs = 10
,那么您将得到一个包含10个零的python列表。range
函数创建一个从0到epochs - 1
的列表。你可以使用_
作为变量来迭代,因为你根本不关心当前的循环值;你不能用它做任何事。