2017-04-13 67 views
2

我是一个Perl人,目前正在学习Python。如果我在Perl名单,我可以将它的值(成员),以明确的变量,像这样:如何在分配显式变量时忽略某些元组成员?

my ($a, $b, $c) = ('one', 'two', 'three'); 

现在$a == 'one'$b == 'two'$c == 'three'。非常类似于Python。

如果我对例如第二个成员,我可以在Perl写:

my ($a, undef, $c) = ('one', 'two', 'three'); 

现在$a == 'one',并$c == 'three'。没有$b'two'只是被Perl抛弃。这避免了发明无用的变量(在这种情况下为$b)并污染了名字空间,我很欣赏。

Python中是否有类似的习语?

toople = (1, 2, 3) 
a, None, c = toople 

给出SyntaxError: cannot assign to None这听起来对我来说很合理。

有没有办法避免Python中的(无用的)变量b

除了命名空间污染之外,还有另一个问题值得关注:可读性和可维护性。当定义b时,潜在维护者必须搜索使用哪个b(如果有的话)。一种解决方案是命名约定,如_unused_b。这是解决方案吗?

+0

您是否考虑过减少右手边而不是解开整个元组? – rth

+0

@rth是的。但在我的情况下这是不可行的。我正在为第三方工具编写插件,我应该写的函数给了我一个包含N个元素的元组,但我只对其中的一些元素感兴趣。 – PerlDuck

+0

如果你保存你的元组,你可以操作它,就像这样'x =(1,2,3),A,B = x [:1] + x [2:]',不是吗?但我知道这并不好。 numpy可以做花哨的事情,但只有数字。 – rth

回答

2

既然你选择的位置或者采取特定元素

a, c = [ toople[i] for i in [0,2] ] 

或排除其他

a, c = [ item for i, item in enumerate(toople) if i not in [1] ] 

这些使用list comprehensionenumerate

的一种方式让人联想到Perl的undef的是使用_作为一次性变量,但正如在评论中指出的那样,这与国际惯例相冲突onalization,其中_可能正在使用中。请参阅answers in this post

+0

嘿zdim! :-)我不知道你也熟悉Python。虽然你的建议完全符合我的要求,但与Perl相比,它似乎过于复杂。但如果这是解决方案,我会考虑它。我的元组只有很少的元素(5 ... 15)。根据我的实际情况,我将使用您的解决方案或一些命名约定(如'_no_b')。 – PerlDuck

+0

嘿:)))有些方法可以在分配时“过滤”,但我不知道有什么与Perl的'undef' ...“占位符相等的东西(我怎么称呼它:)。 _list comprehensions_很好。使用连续的索引(范围),切片当然更好。 – zdim

+0

@PerlDuck我增加了另外一种方法,它排除了一小组特定的索引,并且注释了带有关于它的好页面的链接 – zdim