【问题标题】:Why is this Python program giving me an error?为什么这个 Python 程序给我一个错误?
【发布时间】:2013-02-17 22:23:22
【问题描述】:

我正在上初学者编程课程,我们的讲师选择 Python 作为我们要使用的语言。他给了我们一个非常非常简单的任务,我将发布,以及我想出的代码,我也会发布。我觉得自己像个该死的白痴,因为我不明白为什么这不起作用。我不断收到全局定义错误,如果我们提出问题,老师就会把我们视为宇宙的渣滓。

作业是:

设计一个模块化的 Python 程序,要求用户输入以公里为单位的距离,然后将该距离转换为英里。

程序应该循环输入新的输入,直到运行程序的人告诉它停止。

提示:零 (0) 公里的输入可用于停止程序

换算公式如下:英里 = 公里 * 0.6214

至少需要三个模块:

  1. 输入
  2. 计算
  3. 打印

而我想出的代码是:

def main(ans):
    while ans=='yes':
        data()
        calculate()
        words()

def data():
    print 'Enter Kilometers Please'    
    kilometers=input()
    return

def calculate():
    miles=kilometers*0.6214
    print miles

def words():
    print 'The number of miles is',
    print 'Enter another number?'

ans='yes'
main(ans)

谁能告诉我我做错了什么?请记住,我们才刚刚起步,我不知道我在这些论坛中看到的许多高级编码技术。

【问题讨论】:

  • 通读基本的 Python 教程。您在这里错过了一些关键概念。另外,您的讲师所说的“模块”是指功能吗?
  • 是的。导师说模块和功能是一样的。我知道我错过了一些东西,我会照你说的做。
  • @user2081458 听起来你的导师既无能又无能:functionsmodules 在 Python 中非常不同。

标签: python debugging python-2.7


【解决方案1】:

运行你的程序,我们得到的第一条错误信息是这样的:

Traceback (most recent call last):
  File "kilomiles.py", line 21, in <module>
    main(ans)
  File "kilomiles.py", line 4, in main
    calculate()
  File "kilomiles.py", line 13, in calculate
    miles=kilometers*0.6214
NameError: global name 'kilometers' is not defined

...这很有帮助:它告诉您在程序的第 13 行中尝试使用的变量 kilometerscalculate() 函数中没有定义。

这是因为 scope 的原因:您在 data() 函数中定义的 kilometers 变量只存在于该函数中

所以,你需要得到结果

  1. data(),和
  2. 转入calculate()

要解决第一个问题,您需要更改 data() 以便它返回值:

def data():
    print 'Enter Kilometers Please'
    kilometers = input()
    return kilometers

现在,在您的 main() 函数中,您可以捕获它返回的值:

    kilometers = data()

接下来,您需要更改calculate(),使其接受kilometers 作为参数,就像main() 接受ans 一样,并返回miles

def calculate(kilometers):
    miles = kilometers * 0.6214
    return miles

完成后,您可以更改main(),使其将kilometers 传递到calculate(),并从中捕获miles

    miles = calculate(kilometers)

最后,更改words() 使其接受miles 并返回ans

def words(miles):
    print 'The number of miles is', miles
    print 'Enter another number?'
    ans = input()
    return ans

... 再对main() 进行更改,以便将miles 传递到words(),并从中捕获ans

    ans = words(miles)

所以你的最终程序如下所示:

def main(ans):
    while ans == 'yes':
        kilometers = data()
        miles = calculate(kilometers)
        ans = words(miles)

def data():
    print 'Enter Kilometers Please'
    kilometers = input()
    return kilometers

def calculate(kilometers):
    miles = kilometers * 0.6214
    return miles

def words(miles):
    print 'The number of miles is', miles
    print 'Enter another number?'
    ans = raw_input()
    return ans

ans = 'yes'
main(ans)

该程序现在可以运行,但它确实存在一个问题,如果它成为一种习惯,它会再次困扰你:你使用的是input() 而不是raw_input()。那是dangerous,如果可能的话,你应该避免它。不过,我会留给你解决这个问题。

【讨论】:

  • +1 用于深入解释您的解释并认真帮助新手。当我看到粗鲁的 cmets 和对新程序员的普遍消极态度时,这令人失望。我敢肯定,当他们受到这种待遇时,这会让他们感到沮丧。我很高兴看到这样的答案!
【解决方案2】:

很简单。 U 在 data() 函数中声明或获取“公里”的值,并且您正试图从 calculate() 访问它。计算不知道什么是“公里”..因为它是数据()的本地范围。您应该定义公里并使用它。

kilometers=0.0

def date():
   global kilometers
   ...
   ...
def calculate():
   global kilometers
   ...

【讨论】:

  • 这是非常糟糕的建议:初学者不应该接触global,直到他们知道为什么它几乎总是一个坏主意。
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2014-07-31
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多