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

时间:2016-07-17 03:37:35

标签: python python-3.x lambda syntax-error map-function

我最近在Python 3.5.2中使用map()进行练习,当我尝试运行模块时,它表示将函数和iterable分开的逗号是{{1 }}。这是代码:

SyntaxError

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

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) ,即使我最终也不会再次使用它。

3 个答案:

答案 0 :(得分:4)

在第一个示例中,如果条件不是,则不指定应返回的内容。由于python 无法从表达式中产生任何内容,因此这是语法错误。 e.g:

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

你可能会认为在这种情况下隐含地产生None可能是有用的,但我怀疑这种提议会在社区中产生任何牵引力......(我不会&#39 ;投票给它; - )

答案 1 :(得分:4)

您正在获取SyntaxError,因为您在没有提供强制性else子句的情况下使用条件表达式。

The grammar用于条件表达式(即表达式中的if语句) 始终 包含else子句:

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

在您的reduce示例中,执行提供它,因此不会引发任何错误。

答案 2 :(得分:1)

虽然其他人对您的代码导致SyntaxError的原因的解释完全准确,但我的答案的目标是帮助您实现“至少学习如何正确使用map()”。

在这种情况下使用map没有多大意义。正如你在答案中所指出的那样,如果使用列表理解,那将会更加清晰:

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

正如您所看到的,这看起来非常类似于您的地图表达式,减去了一些卷积。通常,这表示您错误地使用mapmap(lambda...几乎是一种代码味道。 (请注意,我说这是在Python中使用map的热心支持者。我知道许多人认为它永远不会被使用,但我不是那些人之一,只要它被正确使用。)

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

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代码时感到困惑。