Pythonic方式从if-else语句返回2个字符串

时间:2016-05-01 07:01:05

标签: python

是否有pythonic方式来执行以下操作?在一个有2个单词word1word2的世界中,我想要返回相反的单词,最好使用单行

我目前正在做以下工作,但感觉不对:

def get_other_word(word):
    if word == word1:
        return word2
    else:
        return word1

我在考虑这样的事情,但它引发了一个错误:

def get_other_word(word):
    word_choices = [word1, word2]
    return word_choices.remove(word)[0]

4 个答案:

答案 0 :(得分:2)

来自PEP20 - The Zen of Python

Explicit is better than implicit.
Simple is better than complex.

你在第一个代码块中正在做的事情很好。肯定有更聪明的"如何做你所要求的,但它们将是不透明的,难以阅读。

为了进一步说明为什么使用if-then-else块是最好的方法,这并不需要在解释器上创建任何额外的对象,并且执行速度非常快。

相比之下,制作和调用匿名lambda,或者将所有内容填充到dict或数组中,只是为了将所有内容都放在一行上,实际上会使代码更慢。执行一次,这不会是一个大问题,但如果这个代码每秒被调用数千次,它可能会加起来。

复杂性不是你的朋友,让人们可以阅读的代码与使机器的代码可读同样重要。

答案 1 :(得分:1)

没有任何错误或" unpythonic"关于你的第一个版本,你的第二个版本不起作用的原因是因为word_choices.remove(word)是一个就地操作(它修改了列表并返回None):

>>> help([].remove)
Help on built-in function remove:

remove(...)
    L.remove(value) -- remove first occurrence of value.
    Raises ValueError if the value is not present.

这意味着,它不会返回任何内容,并且您正在执行None[0],这不是有效的操作。

您可以修复第二个版本:

def get_other_word(word):
    word_choices = [word1, word2]
    word_choices.remove(word)
    return word_choices[0]

但是,你的第一个带有两个if语句的版本更清晰,如果你要深入了解细节,那就更好了,因为它没有建立一个列表。

答案 2 :(得分:-1)

对于您的第二个代码块:

def get_other_word(word):
    word_choices = [word1, word2]
    return word_choices.remove(word)[0]

list.remove就地修改list并返回None,因此您必须先保存参考,最好表达如下:

def get_other_word(word):
    word_choices = [word1, word2]
    word_choices.remove(word)
    return word_choices[0]

您还可以使用False对应0True对应1的事实,并将list索引为所需的值,确实恰好是一个单行:

def get_other_word(word):
    return [word1, word2][word == word1]

结果:

>>> word1 = 'apple'
>>> word2 = 'banana'
>>> get_other_word('apple')
'banana'

答案 3 :(得分:-2)

您可以使用三元运算符进行单行运算:

return word2 if word == word1 else word1