Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从if-else语句返回2个字符串的Python方法_Python - Fatal编程技术网

从if-else语句返回2个字符串的Python方法

从if-else语句返回2个字符串的Python方法,python,Python,有没有一种类似蟒蛇的方法可以做到以下几点?在一个有两个单词word1和word2的世界中,我想返回相反的一个,最好是一行 我目前正在做以下工作,但感觉不对劲: def get_other_word(word): if word == word1: return word2 else: return word1 我是这样想的,但它抛出了一个错误: def get_other_word(word): word_choices = [word1

有没有一种类似蟒蛇的方法可以做到以下几点?在一个有两个单词
word1
word2
的世界中,我想返回相反的一个,最好是一行

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

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]

您在第一个代码块中所做的一切都很好。当然,有一些“更聪明”的方法来满足你的要求,但它们是不透明的,难以阅读


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

相比之下,生成并调用一个匿名lambda,或者将所有内容填充到一个dict或数组中以便提取,只是为了将所有内容放在一行上,实际上会使代码速度变慢。执行一次,这不会有什么大不了的,但如果每秒调用此代码数千次,它可能会累加起来


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

你可以将三元运算符用于一行:

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

对于第二个代码块:

def get_other_word(word):
    word_choices = [word1, word2]
    return word_choices.remove(word)[0]
list.remove
在适当的位置修改
列表,并返回
None
,因此您必须首先保存引用,最佳表达方式如下:

def get_other_word(word):
    word_choices = [word1, word2]
    word_choices.remove(word)
    return word_choices[0]
您还可以使用
False
对应
0
True
对应
1
这一事实,并为
列表
编制所需值的索引,该值恰好是一行:

return word2 if word == word1 else word1
def get_other_word(word):
    return [word1, word2][word == word1]
结果:

>>> word1 = 'apple'
>>> word2 = 'banana'
>>> get_other_word('apple')
'banana'
您的第一个版本没有任何错误或“不和谐”,第二个版本不起作用的原因是
word\u选项。删除(word)
是一个就地操作(它修改列表并返回
None
):

这意味着,它不会返回任何内容,而实际上您正在执行的
None[0]
操作无效

您可以这样修复第二个版本:

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

但是,你的第一个版本中的两个if语句更清晰,如果你要深入到本质,就稍微好一点,因为它没有建立一个列表。

他明确要求使用一行程序。他明确要求使用pythonic,一行程序非常适合炫耀,但通常都是糟糕且不可读的代码。“pythonic”听起来很主观。lambda函数很清楚,也许“pythonic”就足够了。但是pythonic并不是“主观的”。有一个关于“Python的禅宗”的标准化文档,我链接了这个文档,在确定某个东西是否是“Pythonic”与否。好吧,好吧,伙计们,在我们进入一场不必要的火焰之战之前,让我把事情弄清楚——我错误地认为会有一种理想的、python的、简单的方法来实现我的目标。所以,他们的答案各不相同,因为我的问题并不完美。我认为你的困惑来自于认为“较短的代码”更像Python,Python的禅宗基本上鼓励干净、清晰、编写良好的代码。一句话很少是这些事情中的任何一个。没错,我对你的回答发表了评论。我在考虑C++三元运算符,简单地想,一定有类似的东西,但是似乎没有。更少的行并不总是转换为更好或更快的代码。不管它有多漂亮,机器都会对它进行优化,而一个简单的
if-then-else
(尽管在python中有4行代码)将转化为比lambda/dict/array方法快得多的调用。“Ternaries无论如何都是垃圾”——主要是基于意见的,需要引用,等等:PI猜测人们喜欢这样放弃否决票。我仍然将此保留在这里,因为它回答了前面提到的问题,我没有发现任何错误或不可读的地方。Python中没有真正使用ternaries,部分原因是它们重载了逻辑和赋值,部分原因是它们在Python中的语法不可读。尽可能不要使用它们。这个问题要求“pythonic”,而他们不是,因此,投票结果是否定的。@legostrmtroopr,别自高自大了。“没有真正使用”。上述内容特别是用来增加可读性的语法糖。