2016-08-01 83 views
0

如何使用可选的输出参数编写函数。 在示例如何在Python中使用可选输出参数编写函数

1)mat = ReadBinFile(filename)
2)[mat,titles] = ReadBinFile(filename)

如果我完成与

return mat,titles 

的 “ReadBinFile” 函数I在第一示例

具有元组中的 “垫”

谢谢你的帮助

+0

这是什么情况?如果你不想要第二个元组元素,就忽略它。 – mhawke

+0

你不能这样做。无论如何,这不是一个好主意。只需解压缩结果并丢弃任何不需要的元素。 – BrenBarn

+0

在元组上使用生成器具有潜在的降低时间的优点(如果每个元素需要一段时间才能获得) –

回答

-1

有两种方法可以做到这一点。一个是接受一个决定返回值的参数。第二,(更有趣的)是返回一个生成器。

def ReadBinFile(filename): 
    yield mat 
    yield titles 

mat,titles = ReadBinFile(filename) 

这将让你只获得第一个或获得第n个返回值。

+1

这不起作用。如果你使用'mat = ReadBinFile(filename)','mat'将会获得生成器本身,而不是第一个产生的值。 – BrenBarn

+0

我不认为有一种方法可以完成你想要做的事情。在Python中,您不能更改语法,但可以获得功能性结果。我非常肯定,这提供了您所需要的所有功能。 –

0

如果不向函数指示需要哪种返回类型,或者屏蔽函数名称(请参阅我的注释),则无法执行此操作。

让我来证明一下为什么。

在Perl中,我们可以通过测试调用的上下文来做到这一点。第一个(单一返回值)是标量上下文,第二个是列表上下文。我们可以使用名为wantarray的函数进行测试(谷歌“python wantarray” - 其他搜索引擎可用)。由于这个原因,许多Perl不常见,如果不是唯一的话。

Python不能像那样工作,尽管与其他语言相比,内省可以被用于极端。转让形式为:

name = object 

其中name是无类型的参考。所以:

mat = ReadBinFile(filename) 

即使通过一些偷偷摸摸的手段,我们考察了字节码,我们就无法知道应该什么类对象mat的引用方式。 A listtupleintbirdplane

的语法告诉你:

[mat,titles] = ReadBinFile(filename) 

是一个谜。虽然有效,但它没有实际区别:

mat,titles = ReadBinFile(filename) 

哪一个当然是元组。那么,我们如何才能知道:

mat = ReadBinFile(filename) 

应该是一个tuple,一个list,或任何物体mat的类应该参考一下。

毕竟,在我看来,不同类的返回对象是一个可疑的练习,即使在Perl中。有一些例外情况,例如在某些情况下返回None。为什么怀疑?因为代码变得难以阅读,修改和支持。

相关问题