以下是我在Python 2.7中构建的一个简单的密度转换计算器的(半)完成版本,作为一个学习练习。我是Python的新手,还在摸索。前提是,用户选择将密数转换为度,反之亦然。用户输入所选单位的方位角,并将其转换为另一个单位。如果用户选择了一个无效的菜单选项,他就会收到这样的通知。如果他输入的方位角超出了范围(1-360度,1-6400米),他将得到通知,必须重新开始。问题是,如果用户输入一个无效的方位角,比如365度,他就会被踢回菜单。是否有一种方法可以返回到if/else循环的前一步?我搜索了论坛和文档,这似乎是不可能的。另外,由于我是Python新手,如何使这段代码更高效?我是否需要在函数定义中使用if和elif语句,或者我可以将它们组合在一起而不会产生错误或冗余输出?我没有成功地做到这一点。欢迎所有意见,并感谢。
#Mil-Deg.py
#Simple Mils / Degrees Conversion Calculator
#6 JAN 2013
#Note: 6400 mils / 360 degrees in a circle. 17.78 mils to one degree.
import sys
import math
import winsound
#Define menu function
def menu():
print
print " Mils / Degrees Conversion Calculator"
print "-" * 38
print
print "Options: "
print "1. Degrees to Mils"
print
print "2. Mils to Degrees"
print
print "3. Quit"
print "-" * 20
print
return input ("Choose your option: ")
print
#Define mils to degrees function
def m2d(a):
if a <= 6400 and a >= 1: #get user input within given range
b = 17.78
c = round((a / b),0) #convert and round to nearest degree
if c > 359 or c < 1: #change 0 degrees to 360
c = 360
#Output
print
print a, "mils =", int (c), "degrees"
else:
print
print a, "mils =", int (c), "degrees"
elif a > -1 and a < 1: #change 0 mils to 6400
a = 6400
b = 17.78
c = round((a / b), 0) #math, same as above
if c > 359 or c < 1: #0 to 360, same as above
c = 360
#Output
print
print 6400, "mils =", int (c), "degrees"
else:
print
print a, "mils =", int (c), "degrees"
else:
#warning, mulligan
winsound.Beep(440, 500)
print
print "*** There are only 6400 mils in a circle. Try again. ***"
print
print "-" * 38
print
#define degrees to mils function
def d2m(b):
if b <= 360 and b > 0: #get user input within given range
a = 17.78
c = round((b * a),0) #convert and round to nearest mil
if c >= 6400: #set limit to 6400 mils
c = 6400
#Output
print
print b, "degrees =", int (c), "mils"
else:
print
print b, "degrees =", int (c), "mils"
elif b > -1 and b < 1: #change 0 to 360 degrees
b = 360
a = 17.78
c = round((b * a),0) #math, same as above
if c >= 6400:
c = 6400
#Output
print
print 360, "degrees =", int (c), "mils"
else:
print
print b, "degrees =", int (c), "mils"
else:
#warning
winsound.Beep(440, 500)
print
print "*** There are only 360 degrees in a circle. Try again. ***"
print
print "-" * 38
print
#Begin program
loop = 1
choice = 0
while loop == 1:
choice = menu() #Menu function call
if choice == 1: #If user chooses degrees to mils:
#Output
print
print "Enter your azimuth in degrees (1 - 360)"
print
d2m(input("Degrees: ")) #function call
elif choice == 2: #If user chooses mils to degrees:
#Output
print
print "Enter your azimuth in mils (1 - 6400)"
print
m2d(input("Mils: ")) #function call
elif choice == 3: #If user chooses quit, exit program
loop = 0
elif choice != 1 and choice != 2 and choice != 3: #if user makes invalid menu choice:
#warning
winsound.Beep(440, 500)
print
print
print
print choice, "is not a valid choice."
print
print "Please choose from the available options."
print
print
print
print "-" * 38
print
print "Thank you for using Mil-Deg.py"
print
print
我整理了一下你的代码,并做了以下更改:
- 修复了打印语句 修正了你的方法名。方法名应该是描述性的。字符可以自由键入,所以不要吝啬键入完整的单词。
- 你的方法是打印输出和复制逻辑,所以我清理他们只是返回值代替。这样你就可以在以后的其他程序中使用这些方法。
- 增加了一个辅助方法来检查用户的输入(以停止重复/复制粘贴相同的代码)
- 我使用了字符串的
format
函数,以便于打印计算。
结果如下:
import sys
import math
import winsound
#Define menu function
def menu():
'''This function prints the main menu''' # this is a docstring for your method
print "nMils / Degrees Conversion Calculator"
print "-" * 38
print "nOptions: "
print "1. Degrees to Milsn"
print "2. Mils to Degreesn"
print "3. Quitn"
print "-" * 20
print "n"
#Define mils to degrees function
def mils_to_degrees(a): # use method names that make sense
'''This function takes mils and converts them into degrees'''
b = 17.78
c = round((a / b),0) #convert and round to nearest degree
if c > 359 or c < 1: #change 0 degrees to 360
c = 360
return (a,int(c))
#define degrees to mils function
def degrees_to_mils(b):
'''This method converts degrees to mils'''
a = 17.78
if b == 0:
b = 360
c = round((b * a),0) #math, same as above
if c > 6400: #set limit to 6400 mils
c = 6400
return (b,c)
def check_input(user_input):
'''Checks if the input is a number'''
try:
converted_number = int(user_input)
except ValueError:
return -1
return converted_number
#Begin program
loop = True
while loop:
menu()
choice = int(raw_input("Choose your option: "))
if choice not in [1,2,3]:
winsound.Beep(440, 500)
print choice, "is not a valid choice.n"
print "Please choose from the available options.n"
menu()
choice = int(raw_input('Choose your option: '))
if choice == 1:
print "nEnter your azimuth in degrees (0 - 360)n"
degrees = check_input(raw_input('Degrees: '))
if degrees > 360 or degrees < 0:
print 'Please enter a value between 0 and 360'
else:
result = degrees_to_mils(degrees) # function call
print '{} degrees = {} mils'.format(*result)
print "-" * 38
elif choice == 2: #If user chooses mils to degrees:
print "nEnter your azimuth in mils (1 - 6400)n"
mils = check_input(raw_input('Mils: '))
if mils > 6400 or mils < 1:
print 'Please enter a value between 1 and 6400'
else:
result = mils_to_degrees(mils) #function call
print '{} mils = {} degrees'.format(*result)
print "-" * 38
elif choice == 3:
loop = False
print "n"
print "-" * 38
print "nThank you for using Mil-Deg.pynn"
正如Ashwini在评论中提到的,你的if-else
条件块实际上不是一个循环,所以使用while循环应该回答你的问题的程序流部分。
在elif和一般优雅方面,考虑使用函数字典处理多个选项的方法;对于这里的少量选项,当然没有必要这样做,但它可能会让您练习Python如何将字典和函数作为类处理。
在风格上,我建议使用换行转义序列n
代替所有这些无关的打印语句。