无需if/else在函数内处理y/n输入并解决变量作用域问题
不用if/else实现分支逻辑,解决变量作用域问题
首先解决你原代码里的核心问题:return_from_add只在y分支里定义,n分支调用时会直接报错。要让变量在所有逻辑分支都能访问,必须提前在函数的局部作用域最外层定义它,而不是在分支内部赋值。
接下来是不用if/else的实现方案,用字典映射处理函数的方式,把输入值和对应的逻辑绑定,代码结构更清晰:
def run_main_prgm_2(): # 提前定义共享变量,确保所有分支都能访问 return_from_add = None other = 'Invalid Response' no = 'n' yes = 'y' # 把y对应的逻辑封装成函数 def handle_add_person(): nonlocal return_from_add return_from_add = add_person() return yes # 把n对应的逻辑封装成函数 def handle_index_person(): search_full_name1 = input("Type in a fullname for indexing\n- ") index_person(return_from_add, search_full_name1) return no # 用字典做输入值到处理函数的映射 action_map = { 'y': handle_add_person, 'n': handle_index_person } while True: y_n = input('Would you like to add a new person to the address book? y/n \n - ') # 从字典里取出对应的处理函数,没有则走无效响应逻辑 action = action_map.get(y_n) if action: return action() else: return other
方案优势
- 变量
return_from_add在函数最外层定义,通过nonlocal让内部处理函数可以修改它,彻底解决作用域问题 - 用字典替代if/else分支,后续要加新的输入选项(比如'm'修改联系人),只需要在字典里加新的键值对,不用改分支判断逻辑
- 核心逻辑拆分成独立函数,代码可读性和维护性更好
如果觉得嵌套函数麻烦,也可以直接把逻辑写在字典的value里(适合逻辑简单的场景):
def run_main_prgm_2(): return_from_add = None other = 'Invalid Response' no = 'n' yes = 'y' action_map = { 'y': lambda: (globals().update({'return_from_add': add_person()}), yes)[1], 'n': lambda: (index_person(return_from_add, input("Type in a fullname for indexing\n- ")), no)[1] } while True: y_n = input('Would you like to add a new person to the address book? y/n \n - ') action = action_map.get(y_n) return action() if action else other
不过这种写法可读性稍差,更推荐第一种嵌套函数的方式。
内容的提问来源于stack exchange,提问作者realtime
相关产品推荐
相关产品推荐

