为什么我会收到此条件语句的语法错误?
Why am I getting a syntax error for this conditional statement?
我最近一直在练习在 Python 3.5.2 中使用 map()
,当我尝试 运行 模块时,它说用逗号分隔函数和 iterable
是 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)
是的,我知道我可以通过列表理解更清晰、更轻松地做完全相同的事情,但我认为值得我花时间至少学习如何正确使用 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 功能性代码的过程中感到困惑。
我最近一直在练习在 Python 3.5.2 中使用 map()
,当我尝试 运行 模块时,它说用逗号分隔函数和 iterable
是 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)
是的,我知道我可以通过列表理解更清晰、更轻松地做完全相同的事情,但我认为值得我花时间至少学习如何正确使用 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 功能性代码的过程中感到困惑。