为什么这个Python程序给我报错?

2 投票
2 回答
955 浏览
提问于 2025-04-17 16:12

我正在上一个初学者编程课程,老师选择了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)

有没有人能告诉我我哪里出错了?请记住我们才刚开始,我还不太懂这些论坛里看到的高级编码技巧。

2 个回答

-1

这很简单。你在data()函数里声明了或者获取了'kilometers'的值,但你试图在calculate()函数中访问它。calculate()函数不知道'kilometers'是什么,因为'kilometers'只在data()函数的范围内可用。你应该在合适的地方定义'kilometers',然后再使用它。

kilometers=0.0

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

当你运行程序时,首先出现的错误信息是:

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行,也就是在calculate()函数中,你尝试使用的变量kilometers没有定义。

这是因为有个叫做作用域的概念:你在data()函数中定义的kilometers变量只在那个函数内部存在

所以,你需要把结果

  1. data()中拿出来,
  2. 放到calculate()中。

要解决第一个问题,你需要修改data(),让它返回一个值:

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

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

    kilometers = data()

接下来,你需要修改calculate(),让它像main()接受ans一样,接受kilometers作为参数,并返回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()。这很危险,如果可以的话,应该尽量避免。我就不告诉你怎么解决这个问题了,留给你自己去想办法。

撰写回答