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

Python阶乘函数两处问题求助:语法错误与大小写判断失效

让我们一步步解决你遇到的两个问题:

1. 语法错误与逻辑问题

你修改后的print语句缺少了右括号,这直接导致了语法报错。除此之外还有个隐藏的逻辑bug:在while循环中你不断将number减1,循环结束后number的值会变成0,这时候用它来打印的话,输出会变成Factorial of 0 is xxx,显然不符合预期。

解决方法是先把用户输入的数字保存到一个独立变量中,循环时修改复制后的变量即可:

def fact():
    original_num = int(input('Please enter a number: '))
    number = original_num  # 复制一份用于循环操作,保留原始输入值
    tmp = 1
    while number > 0:
        tmp *= number
        number -= 1
    # 修复括号问题,同时用原始输入值展示
    print("Factorial of %d is %d" % (original_num, tmp))
    # 后续代码...

2. 大写Y无法触发重试的问题

你的判断条件if ('y' or 'Y') in ask:逻辑是错误的。在Python中,('y' or 'Y')会先计算逻辑表达式——因为'y'是真值,逻辑或运算会直接返回第一个真值,所以这个条件等价于if 'y' in ask:,自然大写Y不会触发重试分支。

有两种简洁的修复方式:

  • 方式一:直接检查输入是否在指定的大小写列表中
    if ask in ['y', 'Y']:
    
  • 方式二:将输入转为小写后判断(更简洁,还能兼容用户不小心输入空格的情况,比如Y)
    if ask.strip().lower() == 'y':
    

完整修复后的代码

# Find factorial of a number...
def fact():
    original_num = int(input('Please enter a number: '))
    number = original_num
    tmp = 1
    while number > 0:
        tmp *= number
        number -= 1
    print("Factorial of %d is %d" % (original_num, tmp))
    ask = input('Do you want to try again... [y/n]: ')
    if ask.strip().lower() == 'y':
        fact()
    else:
        print('Thank you for using my tool. Good bye')

fact()

内容的提问来源于stack exchange,提问作者Nafi Shahriyar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:23:35