我最近在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)
,即使我最终也不会再次使用它。
答案 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]
正如您所看到的,这看起来非常类似于您的地图表达式,减去了一些卷积。通常,这表示您错误地使用map
。 map(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代码时感到困惑。