You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:27:29