带有 if/else 的内联函数:检查返回值并附加到条件列表,而无需调用函数两次



这个很难说。它来自试图理解内联函数。

这个问题是我问的另一个问题的衍生品:内联评估输入函数,以便将输入或占位符附加到列表中

我希望这段代码正常工作。这个想法是,在不调用两次的情况下评估函数的输出 - 如果它等于设定值,则应将选择附加到列表中:

import random
def returner():
choices = ['cat', 'dog']
return random.choice(choices)
list = []
list.append(returner() if returner() == 'dog' else 'got the cat in the bag')

问题是,上面我调用了该函数两次。如果是用户输入,提示用户两次就不会那么好。所以我想我可以做到:

list.append(x = returner() if x == 'dog' else 'got the cat in the bag')

可以做上面这样的事情吗?

如果你知道你在比较什么,你可以做

list = []
list.append("dog" if returner() == "dog" else "got cat in the bag")

否则你将不得不做

list = []
r = returner()
list.append(r if r == 'dog' else 'got the cat in the bag')

无论哪种情况,您实际上都可以通过更改这两行来使您的代码更加紧凑

list = []
list.append("dog" if returner() == "dog" else "got cat in the bag")

list = ["dog" if returner() == "dog" else "got cat in the bag"]

您可以推迟调用returner()并将其结果放在(1 元素(列表中,您可以使用:

import random
def returner():
choices = ['cat', 'dog']
return random.choice(choices)
l = [x if x == "dog" else 'got the cat in the bag' for x in [returner()] ]
print(l)

但我会犹豫这样做 - 事先存储它的(一个(结果的方法更干净:

choi = returner()
l = [choi if choi == "dog" else 'got the cat in the bag' ]

但是,如果您需要倍数,第一种方法是有效的:

l = [x if x == "dog" else 'got the cat in the bag' 
for x in [returner() for _ in range(20)] ]