Python语法,用于从序列中返回单个未打包值或多个打包值

Python语法,用于从序列中返回单个未打包值或多个打包值,python,function,input,output,iterable-unpacking,Python,Function,Input,Output,Iterable Unpacking,这可能是一个伟大的python异端,但我正在寻找复制下面代码行为的语法,而不在函数“sign”中同时使用return和yield子句(edit此语法实际上不会产生下面的输出) 我不介意在函数内部构造一个临时序列,只要它在返回时自动解包。 理想情况下,符号函数应如下所示: def sign(*nums): for num in nums: yield sign_inner(num) 但是yield会创建一个生成器对象,如果是单个输入,则必须添加逗号或括号来解包: a, =

这可能是一个伟大的python异端,但我正在寻找复制下面代码行为的语法,而不在函数“sign”中同时使用return和yield子句(edit此语法实际上不会产生下面的输出)

我不介意在函数内部构造一个临时序列,只要它在返回时自动解包。 理想情况下,符号函数应如下所示:

def sign(*nums):
    for num in nums:
        yield sign_inner(num)
但是yield会创建一个生成器对象,如果是单个输入,则必须添加逗号或括号来解包:

a, = sign(3)
a
>>> 1
鉴于没有逗号:

a = sign(3)
a
>>> <generator object sign at 0x____________>
a=符号(3)
A.
>>> 

您是否可以始终从
签名
函数返回列表?在同一个函数中混合
返回
生成
通常不是一个好的做法。我在发布后发现它实际上不起作用。我想最好的反应是采用Hadi Farah的方法,根据输入大小返回不同的对象。@AmitWeisbord:on stackoverflow。另外,您真的不应该在那里使用元组:元组是不可变的,因此每个
+=
完全重新创建结果元组,使函数的时间复杂度为O(n^2),而不是使用列表时得到的O(n)。由于您可能没有处理大量的输入,在这种情况下,这在实践中并不重要,但是在这里使用tuple是一个好习惯,它只是一个错误的工具,简单明了。如果你坚持要得到一个元组,只需在最后转换一次。感谢你的支持,我会确保删除它。这似乎是我应用它的最优雅的解决方案:def sign(*nums):res=tuple()表示num中的num:res+=(sign_inner(num)),如果len(res)返回res[0]==1 else resIt是一个更优雅的解决方案,我不太擅长使用元组,但因为它可以工作。干得好
a, = sign(3)
a
>>> 1
a = sign(3)
a
>>> <generator object sign at 0x____________>
def sign_inner(num):
    return 1 if num>0 else -1 if num<0  else 0

def sign(*nums):
    results = []
    for num in nums:
        results.append(sign_inner(num))
    return results[0] if len(results)==1 else results 

A = sign(5,1,-5)
B = sign(5)
a, b, c = sign(5,1,-5)

print(A)
print(B)
print (a)
print (a,b,c)
>> [1,1,-1]
>> 1
>> 1
>> 1  1  -1