Python while循环调用自定义函数报NameError的修复方法
问题根因
直接触发NameError的核心原因是while循环条件逻辑完全错误:
- 你定义了
quit = 'stop',Python中所有非空字符串的布尔值为True,因此while not quit等价于while False,循环体从始至终不会执行。 - 循环不执行意味着
firstname、lastname两个变量从未被赋值,后续循环外调用formatted_name(firstname,lastname)时,解释器找不到这两个变量的定义,直接抛出NameError。
除此之外代码还有3处逻辑bug:
- 退出判断位置不合理:就算循环正常运行,当前逻辑是先要求用户输入lastname,再判断firstname是否为
stop,用户想退出时还必须多输入一次lastname,交互逻辑错误。 - 姓名拼接顺序错误:
formatted_name函数中带中间名的拼接逻辑为firstName + lastName + middleName,不符合常规英文名「名+中间名+姓」的排列顺序。 - 输出逻辑位置错误:格式化姓名、打印结果的逻辑放在循环外,即使用户输入
stop触发break,代码还是会尝试把stop当成有效姓名处理,输出错误结果。
修复方案
调整循环逻辑、修正拼接顺序、把输入处理和输出逻辑放到循环内部即可,修复后完整代码如下:
def formatted_name(firstName, lastName, middleName=''): if middleName: # 修正姓名顺序:名 + 中间名 + 姓 full_name = f"{firstName} {middleName} {lastName}" else: full_name = f"{firstName} {lastName}" return full_name.title() prompt = 'Please enter your first and last name below' prompt += '\nEnter stop to quit' exit_word = 'stop' # 用无限循环+内部break的结构替代原来错误的循环条件 while True: print(prompt) firstname = input('Enter your first name: ') # 输入退出关键词直接终止循环,不需要再输入姓氏 if firstname == exit_word: break lastname = input('Enter your last name: ') # 仅当输入有效姓名时才执行格式化和打印 fullName = formatted_name(firstname, lastname) print(f"Formatted full name: {fullName}\n")
修改点说明
- 废弃原来错误的
while not quit判断,改用while True构建稳定的交互循环,从根源解决变量未定义的问题。 - 把退出判断移到firstname输入之后,匹配用户输入
stop就立刻退出的交互预期。 - 修正函数内中间名的拼接顺序,符合姓名排列规范。
- 把姓名格式化、打印逻辑移到循环内部,仅处理有效输入,避免退出时执行无效逻辑。
内容的提问来源于stack exchange,提问作者Simsii
相关产品推荐
相关产品推荐

