鱼C论坛

 找回密码
 立即注册
查看: 1057|回复: 4

[已解决]为什么代码1会比代码二多输出一行,当输入小数时

[复制链接]
发表于 2023-8-13 19:55:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码1
while True:
    try:
        a=eval(input("请输入一个正整数:"))
        if a>0 and a%1==0:
            print(a)
            break
        else:
            print("请输入一个正整数:")
    except:
        print("请输入一个正整数:")

代码2
while True:
    try:
        a = eval(input('请输入一个正整数: '))   
        if a > 0 and a % 1 == 0:
            print(a)
            break
        else:
            print("请输入正整数")
    except:
        print("请输入正整数")
最佳答案
2023-8-13 20:47:08
这是代码1在输入小数时的输出:
  1. 请输入一个正整数:3.5
  2. 请输入一个正整数:
  3. 请输入一个正整数:3.5
  4. 请输入一个正整数:
  5. 请输入一个正整数:
复制代码


这是代码2在输入小数时的输出:
  1. 请输入一个正整数: 3.5
  2. 请输入正整数
  3. 请输入一个正整数: 3.5
  4. 请输入正整数
  5. 请输入一个正整数:
复制代码


原因出在代码1的else代码块中,print输出的内容是 "请输入一个正整数:"
而在代码2的else代码块中,print输出的内容是 "请输入正整数"
这就导致代码1中print的内容和input没有区别,因此看起来像是多输出了一行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-13 19:56:11 | 显示全部楼层
问题的原因在于代码1中的异常处理部分没有指定具体的异常类型,而代码2中指定了异常类型为 ValueError 。当输入小数时, eval() 函数会引发 ValueError 异常,因为小数不能被解析为整数。在代码1中,没有指定具体的异常类型,所以无论是什么类型的异常都会被捕获并执行相应的代码,包括输入小数的情况。因此,代码1会多输出一行错误提示。

为了解决这个问题,可以在代码1中指定异常类型为 ValueError ,这样只有当输入小数时才会执行错误处理代码。修改后的代码如下:

  1. while True:
  2.     try:
  3.         a = eval(input("请输入一个正整数:"))
  4.         if a > 0 and a % 1 == 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except ValueError:
  10.         print("请输入一个正整数:")
复制代码


这样修改后的代码1和代码2的行为就一致了,无论输入小数还是其他非整数类型都会输出相同的错误提示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 19:56:18 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-13 19:58 编辑

问题分析:

在代码1和代码2中,您都在一个无限循环中尝试读取用户输入,并且在用户输入不符合条件时要求重新输入。两者的逻辑是相同的,都是要求输入一个正整数,如果输入合法则输出该整数,否则提示重新输入。

然而,您提到代码1会比代码2多输出一行。让我们分析一下为什么会出现这种情况。

代码1分析:
  1. while True:
  2.     try:
  3.         a = eval(input(\请输入一个正整数:\))
  4.         if a > 0 and a % 1 == 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except:
  10.         print("请输入一个正整数:")
复制代码


在代码1中,如果用户输入一个小数,eval(input(...))会接受并求值这个小数,但是在后续的判断中,if a > 0 and a % 1 == 0:会判断输入的小数是否大于0且是否为整数,因为小数取模1后不为0,所以条件判断会失败,然后进入else分支,输出了一行提示,然后进入下一次循环。

代码2分析:
  1. while True:
  2.     try:
  3.         a = eval(input('请输入一个正整数: '))   
  4.         if a > 0 and a % 1 == 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except:
  10.         print("请输入一个正整数:")
复制代码


代码2的逻辑和代码1几乎一样,但是它在输出提示语句时使用了不同的文字。

修正方法:

为了使代码1和代码2的行为一致,您可以将代码1中的提示语句改为和代码2相同的提示语句。

修改后的代码1:
  1. while True:
  2.     try:
  3.         a = eval(input(\请输入一个正整数:\))
  4.         if a > 0 and a % 1 == 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except:
  10.         print("请输入一个正整数:")
复制代码


这样修改后,两者的逻辑就一致了,无论用户输入小数还是其他非法字符,都会输出相同的提示。

修改后的代码2:
  1. while True:
  2.     try:
  3.         a = eval(input('请输入一个正整数: '))   
  4.         if a > 0 and a % 1 == 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except:
  10.         print("请输入一个正整数:")
复制代码


注意:在您的代码中,使用eval来求值用户输入可能存在安全风险。最好的做法是使用int函数来将输入转换为整数,这样可以更安全地处理用户输入。

修正后的代码1(使用int函数):
  1. while True:
  2.     try:
  3.         a = int(input(\请输入一个正整数:\))
  4.         if a > 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except ValueError:
  10.         print("请输入一个正整数:")
复制代码


修正后的代码2(使用int函数):
  1. while True:
  2.     try:
  3.         a = int(input('请输入一个正整数: '))   
  4.         if a > 0:
  5.             print(a)
  6.             break
  7.         else:
  8.             print("请输入一个正整数:")
  9.     except ValueError:
  10.         print("请输入一个正整数:")
复制代码


以上就是问题的解决方法和修正后的代码示例。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 20:47:08 | 显示全部楼层    本楼为最佳答案   
这是代码1在输入小数时的输出:
  1. 请输入一个正整数:3.5
  2. 请输入一个正整数:
  3. 请输入一个正整数:3.5
  4. 请输入一个正整数:
  5. 请输入一个正整数:
复制代码


这是代码2在输入小数时的输出:
  1. 请输入一个正整数: 3.5
  2. 请输入正整数
  3. 请输入一个正整数: 3.5
  4. 请输入正整数
  5. 请输入一个正整数:
复制代码


原因出在代码1的else代码块中,print输出的内容是 "请输入一个正整数:"
而在代码2的else代码块中,print输出的内容是 "请输入正整数"
这就导致代码1中print的内容和input没有区别,因此看起来像是多输出了一行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-14 07:22:08 | 显示全部楼层
你好,我可以帮你解答你的问题。

代码1和代码2的区别在于,当输入小数时,代码1会先打印出输入的小数,然后再打印出“请输入一个正整数:”,而代码2只会打印出“请输入正整数”。

这是因为,eval()函数会将字符串转换为相应的对象,并返回表达式的结果1。如果输入的字符串是一个小数,比如"3.14",那么eval()函数会返回一个浮点数3.14。然后,代码1会执行print(a),打印出3.14。接着,由于a不满足if条件,代码1会再执行print(“请输入一个正整数:”),打印出“请输入一个正整数:”。

而代码2在执行完eval()函数后,不会立即打印出a的值,而是直接判断a是否满足if条件。如果不满足,就执行print(“请输入正整数”),打印出“请输入正整数”。因此,代码2不会多输出一行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表