@Mikhail,我理解您对此的想法,这与其说是“我的代码不起作用”的问题,不如说是“为什么 Python 会这样做?”。我也被它绊倒了一段时间,让我绊倒的是我认为它就像一个赋值语句,例如:
my_greeting = "Good morning" if is_morning else "Good Evening"
这完全是字面意思:“如果……给我“早安”,否则给我“晚安”并将其绑定到 my_greeting”。像这样的赋值语句很常见,在其他类似 C 的语言中,它们甚至有专门用于此的四元运算符。然而,这在列表推导中是不一样的。
列表推导(在 Python 中)的查看(和阅读)应该略有不同。
time_of_day = ["AM", "AM", "PM", "AM"]
def is_morning(x):
return True if x == "AM" else "False"
my_greetings = ["Good Morning" if is_morning(x) else "Good Evening" for x in time_of_day]
现在我们需要以不同的方式“阅读”它,因为逻辑略有不同。我总是从右手边开始(我知道应该从左到右阅读,但我想知道我们首先处理的是什么)。所以我会读到:
1. from the sequence 'time_of_day', draw x
2. for each x in 'time_of_day' give me "Good Morning", otherwise "Good Evening" (based on the predicate)
更简单的描述是:
my_even_numbers = [x if not (n % 2) else "Odd" for x in range(1, 100)]
它从 range(1, 100) 中提取 x,并测试它是否是偶数。
现在真正令人讨厌的是,我在逻辑上完全同意你的看法!阅读 : 对我来说更有意义[x from xs, if (conditions...)]
,这就是其他语言(如 Haskell)做事的方式。但不是 Python。长话短说,语法就是语法,我们必须遵守它:)
为了比较,这是一个使用 Haskell 的类似示例,我认为它更符合您描述您的想法的方式(表达式,后跟条件):
myGreeting x = if x == "AM"
then "Good Morning"
else "Good Evening"
或作为仅响应“AM”的列表理解:
timeOfDay = ["AM", "AM", "PM", "AM"]
goodMorning = [(myGreeting x) | x <- timeOfDay, x == "AM"]