2017-04-13 54 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