【问题标题】:why does my code works in IDLE but not when I save the file and double click the file?为什么我的代码在 IDLE 中有效,但在我保存文件并双击文件时无效?
【发布时间】:2015-07-18 22:13:11
【问题描述】:

代码如下:

# Critter Caretaker
# A virtual pet to care for

class Critter(object):
    """A virtual pet"""
    def __init__(self, name, hunger = 0, boredom = 0):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom

    def __pass_time(self):
        self.hunger += 1
        self.boredom += 1

    @property
    def mood(self):
        unhappiness = self.hunger + self.boredom
        if unhappiness < 5:
            m = "happy"
        elif 5 <= unhappiness <= 10:
            m = "okay"
        elif 11 <= unhappiness <= 15:
            m = "frustrated"
        else:
            m = "mad"
        return m

    def talk(self):
        print("I'm", self.name, "and I feel", self.mood, "now.\n")
        self.__pass_time()

    def eat(self, food = 4):
        print("Brrupp. Thank you.")
        self.hunger -= food
        if self.hunger < 0:
            self.hunger = 0
        self.__pass_time()

    def play(self, fun = 4):
        print("Whee!")
        self.boredom -= fun
        if self.boredom < 0:
            self.boredom = 0
        self.__pass_time()


crit_name = input("What do you want to name your critter?: ")
crit = Critter(crit_name)
choice = None
while choice != "0":

    print \
            ("""
            Critter Caretaker

            0 - Quit
            1 - Listen
            2 - Feed your critter
            3 - Play with your critter
            """)

    choice = input("Choice: ")
    print()

    # exit
    if choice == "0":
        print("Good-bye.")

    # listen to your critter
    elif choice == "1":
        crit.talk()

    # feed your critter
    elif choice == "2":
        crit.eat()

    # play with your critter
    elif choice == "3":
        crit.play()

    # some unknown choice
    else:
        print("\nSorry, but", choice, "isn't a valid choice.")


input("\n\nPress the enter key to exit.")

当我在 IDLE 中运行它时,它工作得很好,但是当我保存文件并双击文件时,它不能正常运行。例如,当我从“0” - “3”中选择一个有效选项时,它会打印 - “不是一个有效的选择”。但即使它不是一个有效的选择,它也应该打印“对不起,但是 - 不是一个有效的选择”。

对不起我的英语。如果您对我的英语感到困惑,请告诉我。

顺便说一句,我目前正在从 Michael Dawson 的一本名为“Python Programming for Absolute Beginner”的书中学习 Python。我应该读完这本书还是应该找到另一种学习 Python 的方法?

【问题讨论】:

  • 你是不是不小心把 Python 2 和 Python 3 搞混了?
  • print('choice type', type(choice)放在input("Choice: ")之后的行。如果choice 是一个整数,它总是会比较不等于字符串,所以你所有的 if elif 表达式都是 False
  • @msw 假设程序是为 python 3 设计的,input() 将默认为字符串
  • @user3636636 当然,但与其猜测他看到的是哪个解释器,不如直接询问更准确。从 IDE 迁移到命令行时,人们经常会遇到这种版本偏差。是的,sys.version 是获取信息的另一种方式,我只是认为询问数据本身更简单。

标签: python


【解决方案1】:

与在其他地方访问的版本相比,您的 IDLE 安装具有不同的 Python 版本。

您可以做的一件事是在脚本顶部添加版本检查以查看您正在运行的版本:

import sys
print(sys.version)

您可以做的另一件事是尝试使用字符串语法输入诸如"3" 之类的选项,看看它是否有效。如果是这样,当您尝试从 IDLE 外部运行时,您正在运行 Python 2 版本。

如果你从 Python 3 升级到 Python 2,主要的问题是 input() 函数的行为。 Python 3 的 input 函数与 Python 2 中的 raw_input 函数相同。

在 Python 2 中,input 只是尝试执行您输入的任何内容,就好像它是有效的 Python 代码一样。在 Python 3 中,input 只是将您输入的任何内容存储为字符串。

所以在 Python 2 中:

choice = input("Choice: ")
Choice: 3
print(choice)
3

使choice 成为整数3。这将在您的检查中比较为假,因为3 == "3" 将始终为假。 (因为任何与整数和字符串的比较都是假的)

但是 Python 3 中的相同代码有点不同:

choice = input("Choice: ")
Choice: 3
print(choice)
"3"

这里的代码符合您的预期。希望这能解释在 IDLE 中使用 Python 3.x 的代码将如何工作,而在 Python 2.x 中运行的代码则不能。

【讨论】:

  • 没有任何作用。即使我选择“3”。我可以在命令提示符下更改 python 版本吗?
  • @JohnCruz 当您从命令提示符运行它时,您的 python 版本是什么?我们需要这些信息。转到命令提示符并键入python,这应该会进入交互式 shell 并为您提供有关版本的信息。
  • 当我在命令提示符下键入 python 而不是 python 命令行时,它会输出('python' 不是内部或外部命令、可运行程序或批处理文件。)我应该更改目录什么的?目录是 C:\Users\Acer。
  • 所以我安装 python 3.4 并将它的整个功能安装在命令路径中,当我输入 python 时它会返回 python 3.4。我注意到的另一件事是,当我双击我的保存文件时,命令行的图标不是我计算机的基本命令行,而是 python 命令行。我的电脑里安装了两个python版本,分别是3.4和3.2。如果您不明白我在上面说的内容,请告诉我。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2020-11-14
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多