试图在Python中创build一个打印计算器程序,程序输出0无限

我试图用Python 2.7.8来制作这个打印计算器程序,但是每当我运行它时,它都会输出:

0 0 0 0 

等等。 它无限地做到这一点,永不止步。 我真的很感激任何帮助。 这是我的代码。 谢谢!

 import msvcrt # Windows only! def getch(): return msvcrt.getch() def putch(ch): msvcrt.putch(ch) total = 0 pendingOp = 0 print "*** Calculator ***" while True: ch = getch() if ch == "q": break # quit if ch == "c": # clear the display total = 0 pendingOp = 0 elif ch == "a" or "s" or "m" or "d": # add, subtract, multiply, divide pendingOp = ch elif (ch >= "0" and ch <= "9"): newNumber = int(ch) if pendingOp == 0: total = newNumber else: if pendingOp == "a": total = total + newNumber elif pendingOp == "s": total = total - newNumber elif pendingOp == "m": total = total * newNumber elif pendingOp == "d": total = total / newNumber pendingOp = 0 print total 

你的问题是,由于某种原因,你没有一个控制台。

Python的msvcrt.getch是MSVCRT函数_getch一个简单的包装器。 虽然那里的文件说“没有错误的回报”,但这不是真的。 如果没有应用程序的控制台,这些函数立即返回,返回-1(转换为适当的类型,这意味着你得到'\xff'getchu'\uffff'getwch – 这正是你看到)。

那么,为什么没有控制台呢?

最常见的原因是你在一些GUI IDE(如IDLE或PyWin)中运行应用程序,而不是从cmd shell(又名“DOS提示符”)运行应用程序。 你不能在IDLE中使用msvcrt 。*

还有其他的可能性,比如明确的关闭或者从控制台上分离出来,但是我怀疑这些在这里是相关的。

那么,你能做什么?

那么,如果你使用IDLE,它实际上是模拟Tkinter GUI上的命令行输入。 这种模拟不能提供任何方式来一次输入一个字符,一次只能输入一个字符。 所以,你可以在这里使用raw_input而不是msvcrt.getch

理论上你可以挂钩IDLE模拟输入,但是这比为你的应用程序构建你自己的Tkinter GUI(或者Qt或者Win32或者其他GUI)要少得多。

或者,也可以停止在IDLE中运行程序。 打开一个cmd窗口,用python myscript.py (或C:\Python27\python D:\mystuff\myscript.py或其他)运行程序。 如果你不知道如何在Windows上使用shell,那么现在是学习的好时机。


*嗯,你可以通过ctypeswin32api调用Windows API函数来明确地分配一个控制台。 但是如果你这样做的话,它会弹出一个单独的cmd shell窗口让你输入,它仍然不会影响IDLE的输入。

欢迎来到不同字符串编码之间转换的奇妙世界。 该特定的API返回一个不同于Python的普通字符串UTF编码的字节字符串,两者不会进行比较。 尝试例如, if ch == b'q'

另一个解决方案是直接获取宽字符:

 def getch(): return msvcrt.getwch() 

对我来说,一个问题是Ctrl-C返回(显然是在Windows上),即使我的Python的API文档说不应该。

更新:

abarnert的答案似乎是根本原因。 我离开这个答案,因为字符串编码问题导致在控制台上运行的Python 3相同的症状,并在一般情况下是一个类似的有趣的头痛的原因。