Python 将一个项(单例)的元组减少为其值

Python 将一个项(单例)的元组减少为其值,python,Python,是否有一种内置的方法可以将a降低到其(唯一)值 我可以使用以下函数实现这一点: def foo(tup): if len(tup) == 1: return tup[0] return tup 这会将单例减少到其值,并保留非单例元组,如下所示: >>> x = (3, ) >>> foo(x) 3 >>> x = (3, 4) >>> foo(x) (3, 4) 但这似乎是一个相当低级的任

是否有一种内置的方法可以将a降低到其(唯一)值

我可以使用以下函数实现这一点:

def foo(tup):
    if len(tup) == 1:
        return tup[0]
    return tup
这会将单例减少到其值,并保留非单例元组,如下所示:

>>> x = (3, )
>>> foo(x)
3
>>> x = (3, 4)
>>> foo(x)
(3, 4)

但这似乎是一个相当低级的任务,我敢打赌它已经潜伏在Python标准库的某个地方。这种功能让我想起了,但这给我们留下了一个
数组
,这可能不是我们想要的。

它可以作为一项低级任务通过,但不是你经常做的事情;没有理由为此专门使用内置设备。没有直接函数来执行此操作,但是您可以使用三元条件平铺执行此操作:

x = tup[0] if len(tup) == 1 else tup

有一种内置的方法可以从一个元组中提取单个项。这样就可以访问它的第一个索引,即
tpl[0]

但是,没有内置的方法将一个元组提取到它的单个值中,而保留所有其他元组。如果你仔细想想,这将是一种危险的操作:

您需要检查它的长度这一事实意味着您可能不知道它是一个元组还是一个大小不同的元组。这意味着您也无法知道函数的返回值是什么:它可以是一个元组(除1以外的任何大小),也可以是其他东西(即一个元组的值)。这使得函数非常脆弱,因为它不再具有明确的返回类型

虽然像
len(x)
这样的东西对于一个元组
x
可以很好地工作,但是如果
x
是一个元组,并且里面的元素不是序列,那么
len(foo(x))
可能就不会工作了。或者
list(x)
将元组转换为列表;但是
list(foo(x))
会将其转换为列表,或者将其中的任何内容转换为列表

所以,如果你仔细想想,你的函数并没有多大意义。这可能就是为什么没有“只有一个值时解包”函数的原因

也就是说,您可以解压任意长度(大于0)的元组的第一个值。也许这就是你真正想要做的:

>>> x = 1,
>>> y = 2, 3
>>> z = 4, 5, 6
>>> a, *_ = x
>>> a
1
>>> b, *_ = y
>>> b
2
>>> c, *_ = z
>>> c
4
如果您知道元组只有一个元素,您可以将其展开

value, = x

但是没有内置的方法也可以检查

没有内置的方法。。。例如,如果有一个空元组,会发生什么情况?它仍然是一个空元组还是一个回退值,例如
None
?(更不用说,如果您期望的元组有时可能不是-嗯…)另一方面,任务可能太短且太简单,无法为其提供库函数。在使用此处的值来确定是否有元组或值时,是否不需要使用特殊逻辑?你用这个干什么?你为什么要这么做?看起来像是一场灾难。你是什么?他们说了什么。在不同时间返回不同类型的函数通常很难使用。对元组调用
len
非常便宜,而且比必须调用
isinstance
来确定函数实际返回的类型更简单。当然,我们通常会尽量避免调用
isinstance
,因为这会干扰duck-typing。但是,如果这种方法更具可读性,并且只有在封装在函数中时才可重用,这是有争议的。@schwobasegll几乎没有一行代码不符合争议的条件。除了它是由GvR写的。