Python中逗号运算符的含义

问题描述 投票:0回答:4

我理解了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 表达式。我可以查什么来理解它在说什么?

python python-3.x
4个回答
12
投票

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 数组。


11
投票

逗号形成一个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 元组。


0
投票

这可能是您的解决方案:

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)

0
投票

您的问题归结为:调用函数

np.histogram
时返回什么,以及如何将它们解包为两个变量?

涉及逗号的赋值称为并行赋值。如果赋值的右侧是单个变量(例如列表或元组),则该功能称为解包赋值。

在您的情况下,

np.histogram
返回两个元素的元组(都是数组),然后将元组解压为两个变量,
y
xe

© www.soinside.com 2019 - 2024. All rights reserved.