为何dictionary.get()会触发字典所有条目输出?Python代码问题
问题:Python字典中所有print语句被执行,而非仅匹配key的语句
问题说明
你编写的Python代码意图通过dictionary.get()方法根据匹配的key执行对应print语句,但实际运行时所有字典条目的print语句均被执行,而非仅匹配key的语句。
原代码
miles_between_oil_change = 7500 miles_warning = 500 miles_notify = miles_between_oil_change - miles_warning def validInput(initial_mileage, final_milege): if initial_mileage > final_milege: return False return True """ 返回值说明: 0 - 用户无需更换机油 1 - 用户需要尽快更换机油 2 - 用户需要立即更换机油 """ def userToBeNotified(initial_mileage, final_mileage): miles_travelled = final_mileage - initial_mileage if miles_travelled < miles_notify: return 0 elif miles_travelled > miles_notify: return 2 else: return 1 def readInput(): previous_mileage = int(input('输入上次换机油时的里程数: ')) current_milege = int(input('输入当前里程数: ')) return previous_mileage, current_milege def main(): previous_mileage, current_milege = readInput() if not validInput(previous_mileage, current_milege): print('输入无效 - 当前里程数小于上次换机油时的里程数') exit() user_notification = userToBeNotified(previous_mileage, current_milege) switcher = { 0: print("用户无需更换机油"), 1: print("用户需要尽快更换机油"), 2: print("用户需要立即更换机油"), } switcher.get(user_notification) if __name__ == "__main__": main()
实际输出
输入上次换机油时的里程数: 5000 输入当前里程数: 13000 用户无需更换机油 用户需要尽快更换机油 用户需要立即更换机油
期望输出
输入上次换机油时的里程数: 5000 输入当前里程数: 13000 用户需要立即更换机油
问题原因
创建switcher字典时,每个key对应的value是print()函数的调用结果,而非可执行的函数或待打印的字符串。Python在定义字典时会立即执行所有print()调用,导致三个语句全部输出。
解决方案
有两种常见修正方式:
方式1:字典存储字符串,获取后再打印
将字典的值改为待打印的字符串,通过switcher.get()拿到对应字符串后,再调用print()输出:
def main(): previous_mileage, current_milege = readInput() if not validInput(previous_mileage, current_milege): print('输入无效 - 当前里程数小于上次换机油时的里程数') exit() user_notification = userToBeNotified(previous_mileage, current_milege) switcher = { 0: "用户无需更换机油", 1: "用户需要尽快更换机油", 2: "用户需要立即更换机油", } print(switcher.get(user_notification))
方式2:字典存储lambda函数,获取后执行
将字典的值改为lambda匿名函数,获取到对应函数后再执行:
def main(): previous_mileage, current_milege = readInput() if not validInput(previous_mileage, current_milege): print('输入无效 - 当前里程数小于上次换机油时的里程数') exit() user_notification = userToBeNotified(previous_mileage, current_milege) switcher = { 0: lambda: print("用户无需更换机油"), 1: lambda: print("用户需要尽快更换机油"), 2: lambda: print("用户需要立即更换机油"), } notify_func = switcher.get(user_notification) if notify_func: notify_func()
内容的提问来源于stack exchange,提问作者Rahul B
相关产品推荐
相关产品推荐

