为什么我会收到此条件语句的语法错误?

Why am I getting a syntax error for this conditional statement?

我最近一直在练习在 Python 3.5.2 中使用 map(),当我尝试 运行 模块时,它说用逗号分隔函数和 iterableSyntaxError。这是代码:

eng_swe = {"merry":"god", "christmas":"jul", "and":"och", "happy":"gott",
       "new":"nytt", "year":"år"}

def map_translate(l):
    """Translates English words into Swedish using the dictionary above."""

    return list(map(lambda x: eng_swe[x] if x in eng_swe.keys(), l))

我注意到如果我像这样消除条件语句:

return list(map(lambda x: eng_swe[x], l))

它工作正常,但它牺牲了避免尝试将不在字典中的项目添加到列表中的能力。有趣的是,当我尝试使用带有 reduce() 的条件语句时也没有任何问题,如下所示:

from functools import reduce

def reduce_max_in_list(l):
    """Returns maximum integer in list using the 'reduce' function."""

    return reduce(lambda x, y: x if x > y else y, l)

是的,我知道我可以通过列表理解更清晰、更轻松地做完全相同的事情,但我认为值得我花时间至少学习如何正确使用 map(),即使我结束了永远不再使用它。

在您的第一个示例中,您没有指定如果条件 不是 真应返回什么。由于 python can't 从表达式中不产生任何结果,这是一个语法错误。例如:

a if b  # SyntaxError.
a if b else c  # Ok.

您可能会争辩说,在这种情况下隐式让步 None 可能很有用,但我怀疑此类提议是否会在社区中引起任何关注...(我不会投票给它 ;-)

您得到 SyntaxError 是因为您使用的是条件表达式,但没有提供必需的 else 子句。

The grammar 用于条件表达式(即表达式形式的 if 语句)总是 包含一个 else 子句:

conditional_expression ::=  or_test ["if" or_test "else" expression]
                                                    ^^

在您的 reduce 示例中,您 执行 提供它,因此没有出现任何错误。

虽然其他人对您的代码导致 SyntaxError 的原因的解释是完全准确的,但我回答的目的是帮助您实现目标 "to at least learn how to use map() correctly."

您在此上下文中使用 map 没有多大意义。正如您在回答中指出的那样,如果您使用列表理解会更清晰:

[eng_swe[x] for x in l if x in eng_swe]

如您所见,这看起来与您的地图表达式非常相似,但减去了一些卷积。通常,这表明您使用 map 不正确。 map(lambda... 几乎是一种代码味道。 (请注意,我是作为在 Python 中使用 map 的热心支持者这么说的。我知道很多人认为永远不应该使用它,但我不是那些人中的一员,只要它被正确使用。)

所以,您可能想知道,什么是使用 map 的好时机的例子?好吧,我能想到的一个用例是将 str 列表转换为 int 列表。例如,如果我正在读取存储在文件中的 table 数据,我可能会这样做:

with open('my_file.txt', 'r') as f:
    data = [map(int, line.split(' ')) for line in f]

这将给我留下 int 的二维数组,非常适合进一步的操作或分析。使 map 比您的代码更好地使用的原因是它使用了内置函数。我不是在写一个 lambda 明确供 map 使用(因为这是你应该使用列表理解的标志)。

回到您的代码,但是...如果您想按功能编写代码,您真的应该使用 filter,这与了解 map 一样重要。

map(lambda x: eng_swe[x], filter(lambda x: eng_swe.get(x), l))

请注意,我无法消除我版本中的 map(lambda... 代码味道,但至少我将其分解为更小的部分。 filter 查找可以翻译的单词,map 执行实际翻译。 (尽管如此,在这种情况下,列表理解可能更好。)我希望这个解释对您有所帮助,而不是让您在编写 Python 功能性代码的过程中感到困惑。