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

时间:2013-02-17 22:23:23

标签: python debugging python-2.7

我在初学者编程课程中,我们的教师选择Python作为我们要使用的语言。他给了我们一个非常简单的任务,我将发布,以及我提出的代码,我也将发布。我觉得这个该死的白痴,因为我无法理解为什么这不起作用。我不断得到一个全局定义错误,如果我们提出一个问题,老师会看着我们,就像我们是宇宙的败类一样。

作业是:

  

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

     

程序应循环新输入,直到被运行程序的人告知停止。

     

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

     

转换公式如下:Miles =公里* 0.6214

     

至少需要三个模块:

     
      
  1. 输入
  2.   
  3. 计算
  4.   
  5. 打印
  6.   

我提出的代码是:

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 个答案:

答案 0 :(得分: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

...这非常有用:它告诉您,未尝试在kilometers函数中尝试在程序的第13行中使用的变量calculate()

这是因为名为scope的内容:您在kilometers函数中定义的data()变量仅存在于该函数中。

所以,你需要得到结果

  1. data()
  2. 加入calculate()
  3. 要解决其中的第一个问题,您需要更改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 :(得分:-1)

简单。你在data()函数中声明或获得'km'的值,并且你试图从calculate()访问它。 calculate不知道什么是'km'..因为它是data()的本地范围。您应该定义公里并使用它。

kilometers=0.0

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