我理解了Python中逗号运算符的简单概念。例如,
x0, sigma = 0, 0.1
表示x0=0,sigma=0.1。但我获得了一个代码,其中有一行如下所示。
y, xe = np.histogram(np.random.normal(x0, sigma, 1000))
其中 y 和 xe 的输出如下。
y
Out[10]: array([ 3, 17, 58, 136, 216, 258, 189, 87, 31, 5], dtype=int64)
xe
Out[11]:
array([-0.33771565, -0.27400243, -0.21028922, -0.146576 , -0.08286279,
-0.01914957, 0.04456364, 0.10827686, 0.17199007, 0.23570329,
0.2994165 ])
我不知道如何读取 y, xe 表达式。我可以查什么来理解它在说什么?
x0, sigma = 0, 0.1
是语法糖。有些事情正在幕后发生:
0, 0.1
隐式创建两个元素的元组。x0, sigma =
将该元组解压到这两个变量中。numpy.histogram
的文档,您会发现它返回以下两件事:
hist : array
The values of the histogram. See density and weights for a description of the possible semantics.
bin_edges : array of dtype float
Return the bin edges (length(hist)+1).
您的
y, xe = ...
分别解压两个返回数组的元组。这就是为什么你的 y
被分配给 numpy int64 数组,而你的 xe
被分配给 numpy float 数组。
逗号形成一个tuple,在Python中看起来就像一个不可变的列表。
Python 具有解构赋值,这在其他一些语言中也有,例如现代 JavaScript。简而言之,一次赋值可以将多个左侧变量映射到相同数量的右侧值:
foo, bar = 1, 2
这相当于一次性完成
foo = 1
和bar = 2
。这可用于交换值:
a, b = b, a
您可以在右侧使用元组或列表,如果长度匹配,它将以相同的方式解压缩(解构):
a, b = [1, 2]
# same effect as above:
xs = [1, 2]
a, b = xs
# again, same effect using a tuple:
ys = 1, 2
a, b = ys
您可以从函数返回元组或列表,并立即解构结果:
def foo():
return (1, 2, 3) # Parens just add readability
a, b, c = foo() # a = 1; b = 2; c = 3
我希望这能回答您的问题。 histogram 函数返回一个解包的 2 元组。
这可能是您的解决方案:
def func():
return 'a', 3, (1,2,3) # returns a tuple of 3 elements (str, int, tuple)
x1, x2, x3 = func() # unpacks the tuple of 3 elements into 3 vars
# x1: 'a'
# x2: 3
# x3: (1,2,3)
您的问题归结为:调用函数
np.histogram
时返回什么,以及如何将它们解包为两个变量?
涉及逗号的赋值称为并行赋值。如果赋值的右侧是单个变量(例如列表或元组),则该功能称为解包赋值。
在您的情况下,
np.histogram
返回两个元素的元组(都是数组),然后将元组解压为两个变量,y
和xe
。