为什么这个Python程序给我报错了?
为什么这个Python程序给我报错了?
我在一门初级编程课上,我们的教师选择了Python作为我们要使用的编程语言。他给了我们一个非常简单的作业,我将把作业内容和我写的代码贴出来。我感觉自己像个白痴,因为我不明白为什么这个代码不起作用。我一直遇到全局定义错误,而且如果我们问问题,老师看着我们就像是宇宙中的渣滓一样。
作业内容:
设计一个模块化的Python程序,要求用户输入一个以公里为单位的距离,然后将该距离转换为英里。程序应该循环等待新的输入,直到被运行程序的人停止。提示:输入零(0)公里可以用来停止程序。转换公式如下:英里 = 公里 * 0.6214。最少需要三个模块:
1. 输入
2. 计算
3. 打印
我写的代码如下:
def main(ans): while ans=='yes': data() calculate() words() def data(): print '请输入公里数' kilometers=input() return def calculate(): miles=kilometers*0.6214 print miles def words(): print '英里数为', print '请输入另一个数字?' ans='yes' main(ans)
有人能告诉我我做错了什么吗?请记住我们刚刚开始学习,我不懂这些论坛上看到的许多先进的编码技巧。
这个Python程序出现错误的原因是在data()函数中声明或获取了'kilometers'的值,而你试图从calculate()函数中访问它。calculate()函数不知道'kilometers'是什么,因为它是data()函数的局部变量。你应该定义kilometers并在需要的地方使用它。
解决方法是在calculate()函数之前声明kilometers并将其设置为全局变量,以便在整个程序中都可以访问它。
kilometers = 0.0 def data(): global kilometers # 其他代码... def calculate(): global kilometers # 其他代码...
然而,这是一个很糟糕的建议:初学者在不了解为什么这几乎总是一个坏主意的情况下不应该接触global关键字。在编写代码时,应该尽量避免使用全局变量,因为它们会增加程序的复杂性和维护难度。
为什么这个Python程序会给我一个错误?
当你运行程序时,第一个错误信息是这样的:
Traceback (most recent call last):
File "kilomiles.py", line 21, in
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()函数
1. 传递到calculate()函数中,
2. 从calculate()函数中返回。
为了解决第一个问题,你需要修改data()函数,使其返回值:
def data():
print 'Enter Kilometers Please'
kilometers = input()
return kilometers
现在,在你的main()函数中,你可以捕获它返回的值:
kilometers = data()
接下来,你需要修改calculate()函数,以便它像main()函数一样接受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()。这是危险的,如果可能的话,应该避免使用它。我会让你自己去解决如何修复这个问题。
对于你详细的解释和对新手的帮助,我给你加一分。看到对新程序员有粗鲁的评论和普遍的负面态度真是令人失望。当他们被这样对待时,我相信这些人会感到沮丧。我很高兴看到有这样的答案!