1

我有一个程序可以问我行星离太阳有多远。唯一的问题是,无论我给出什么答案,它总是显示为正确的。这是我的代码的链接:http: //pastebin.com/MimECyjm

如果可能的话,我想要一个更简单的答案,因为我还不太精通 python

有问题的代码:

mercury = "57.9"
mercury2 = "57900000"

def Mercury():
    ans = raw_input("How far is Mercury from the sun? ")
    if mercury or mercury2 in ans:
        print "Correct!"
        time.sleep(.5)
        os.system("cls")
        main()
    else:
        print "Incorrect!"
        Mercury()
4

3 回答 3

6

问题是你有:

if mercury or mercury2 in ans:

这个 if 语句将是Trueifmercury评估为True(它总是如此)或 when mercury2 in ansis True

mercury是一个非空字符串 ( mercury = "57.9"),其计算结果为True. 例如,尝试bool("57.9")查看 Python 总是计算True非空字符串。如果字符串为空,则为False.

所以无论用户回答什么,你的代码总是会说它是正确的。这是你可以写的:

if mercury in ans or mercury2 in ans:

但写起来可能更好(见下面评论中的讨论):

if ans in [mercury, mercury2]:
于 2012-08-14T16:17:16.943 回答
6

你有这个:

if mercury or mercury2 in ans:

而不是这个:

if ans in (mercury, mercury2):

但是你有一个更深层次的问题。像这样的代码

def Mercury():
    ans = raw_input("How far is Mercury from the sun? ")
    if mercury or mercury2 in ans:
        print "Correct!"
        time.sleep(.5)
        os.system("cls")
        main()
    else:
        print "Incorrect!"
        Mercury()

最终会导致stackoverflow。这是因为您正在调用函数,但从未从它们返回!

您应该重组代码以使用while循环

您还应该考虑从程序中删除一些重复项

例如,您可以使用这样的功能

def main():
    while True:    
        print "Planetary Distance from the Sun"
        time.sleep(.5)
        rand = random.randint(1,1)
        if rand==1:
            ask_planet_distance("Mercury", mercury, mercury2)
        elif rand==2:
            ask_planet_distance("Venus", venus, venus2)
        ...


def ask_planet_distance(planet_name, distance1, distance2):
    while True:
        ans = raw_input("How far is {} from the sun? ".format(planet_name))
        if ans in (distance1, distance2):
            break
        else:
            print "Incorrect!"
    print "Correct!"
    time.sleep(.5)
    os.system("cls")

您可以通过将行星数据存储在一个list

于 2012-08-14T16:19:36.963 回答
3

问题在于您的 if 语句条件。

例子:

if ans == venus or venus2:

这应该是:

if ans == venus or ans == venus2:
于 2012-08-14T16:18:02.173 回答