我创建了一个函数,它使用两个字典,curr_stats和weekly_result。如果weekly_result中有任何不在curr_stats中的键,则函数应该只打印invalid_msg,而不改变curr_stats。
但是,我代码第5行的if语句似乎不起作用。它应该触发下一个if语句,因此不会发生curr_stats的变异。
def update_standings(curr_stats, weekly_result):
invalid = 0
point_counter(weekly_result)
for team in weekly_result:
if team in curr_stats == False:
invalid = invalid + 1
if invalid > 0:
print(invalid_msg)
else:
for team in weekly_result:
curr_stats[team] = curr_stats[team] + weekly_result[team]发布于 2017-03-19 21:02:53
在Python中,优先,包括in。正在发生的是比较链,一种特殊的形式,用于测试传递关系,如数学课中的关系:
if x_min < x < x_max:
...正如PawełKordowski在他的评论中指出的那样,上述比较链主要相当于:
if x_min < x and x < x_max:
...(有一个不同:“等效”代码可能计算两次x,而比较链则精确地计算一次x。)
在您的例子中,比较链是:
if team in curr_stats == False:
......which (主要)相当于:
if team in curr_stats and curr_stats == False:
...只有当curr_stats包含team且curr_stats为空时,这才是正确的.这不应该发生的。
代码的问题在于== False --部分原因是它将比较转化为比较链,但最主要的原因是您根本就不需要它。Python提供了not关键字,用于当您想要布尔值相反的时候。你的条件陈述应改为:
if team not in curr_stats:
invalid = invalid + 1最后一个建议是:通过摆脱invalid计数器并在找到无效的team后立即返回,这个函数可以变得更短。(一旦您发现weekly_result是无效输入,您可能并不关心它是否“更无效”。)我还使用dict.items简化了最终的for循环:
def update_standings(curr_stats, weekly_result):
point_counter(weekly_result)
for team in weekly_result:
if team not in curr_stats:
print(invalid_msg)
return
for team, result in weekly_result.items():
curr_stats[team] += resulthttps://stackoverflow.com/questions/42884411
复制相似问题