为什么这个Python程序给我报错?
我正在上一个初学者编程课程,老师选择了Python作为我们要学习的语言。他给了我们一个非常简单的作业,我会把作业内容和我写的代码都贴出来。我觉得自己真是个笨蛋,因为我搞不懂为什么我的代码不工作。我总是收到一个全局定义错误,而老师看我们提问时的眼神就像我们是宇宙的垃圾一样。
作业内容是:
设计一个模块化的Python程序,要求用户输入一个以公里为单位的距离,然后将这个距离转换为英里。
程序应该循环询问用户输入,直到运行程序的人告诉它停止。
提示:输入零(0)公里可以用来停止程序。
转换公式如下:英里 = 公里 * 0.6214
至少需要三个模块:
- 输入
- 计算
- 打印
而我写的代码是:
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 个回答
这很简单。你在data()函数里声明了或者获取了'kilometers'的值,但你试图在calculate()函数中访问它。calculate()函数不知道'kilometers'是什么,因为'kilometers'只在data()函数的范围内可用。你应该在合适的地方定义'kilometers',然后再使用它。
kilometers=0.0
def date():
global kilometers
...
...
def calculate():
global kilometers
...
当你运行程序时,首先出现的错误信息是:
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
变量只在那个函数内部存在。
所以,你需要把结果
- 从
data()
中拿出来, - 放到
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()
。这很危险,如果可以的话,应该尽量避免。我就不告诉你怎么解决这个问题了,留给你自己去想办法。