这是大学作业的代码。它现在已经通过了,所以不要害怕给我错误的分数,例如。我想知道有什么可以做得更好,或者是一些低效率的代码,或者是糟糕的实践。
def main():
import time
while True:
try:
num1 = int(input("Pick a number between 10 and 30: "))
except ValueError:
print("That's not a number!")
continue
if num1 > 30 or num1 < 10:
print("Not Valid!")
continue
break
while True:
try:
hue = str(input("Pick a colour; Red, Green, Blue: "))
except ValueError:
print("Letters not numbers!")
continue
if (hue == "Red") or (hue == "red") or (hue == "Green") or (hue == "green") or (hue == "Blue") or (hue == "blue"):
break
print("Generating File")
time.sleep(3)
numbers ='no', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen', 'Twenty', 'Twentyone', 'Twentytwo', 'Twentythree', 'Twentyfour', 'Twentyfive', 'Twentysix', 'Twentyseven', 'Twentyeight', 'Twentynine', 'Thirty'
text_one = hue +' bottle%s\nHanging on the wall'
text_two = "And if one " + hue + " bottle\nShould accidentally fall\nThere'll be"
text_three =' \n'
with open(numbers[num1] + ' ' + hue + ' Bottles.txt', 'w') as a:
for l in range(num1, 0, -1):
a.write(numbers[l]+ ' ')
if l == 1:
a.write(text_one % '' +'\n')
else:
a.write(text_one % 's' +'\n')
a.write(numbers[l] + ' ')
if l == 1:
a.write(text_one % '' + '\n')
else:
a.write(text_one % 's' + '\n')
a.write(text_two + ' ')
a.write(numbers[l-1] + ' ')
if (l - 1) ==1 :
a.write(text_one % ''+'\n')
else:
a.write(text_one % 's'+'\n')
a.write('\n' + '\n')
if __name__ == '__main__':
main()这应该保存到一个文件夹中,并从它保存的Python文件中运行,而不是在IDE中运行。
发布于 2015-06-17 06:31:14
一个好的起点是把你的主要方法分解成小块的工作。然后,您可以集中精力改进每个部分中的代码。
目前,您的主要方法做了很多事情,它读取用户输入,建立一首歌并将其写到一个文件中。下面是您如何重写它的方法:
def main():
num_bottles = get_num_bottles_from_user()
hue = get_hue_from_user()
song = build_song(num_bottles, hue)
out_filename = create_out_filename(num_bottles, hue)
write_song_to_file(song, out_filename)如果它发出的所有调用都在类似的抽象级别上,则该函数更容易读取。主要的方法不是像输入读取或文件写入这样的低级操作,而是讲述一个故事。
发布于 2015-06-17 05:58:38
在代码中间导入包被认为是一种不好的做法,很少有例外。导入文件的顶部。
另一个不好的做法是在变量名中使用数字,比如num1。
我会发现这是一种更简单、更自然的验证和退出输入循环的方法:
if 10 <= num1 <= 30:
break
print("Not Valid!")检查hue是否是支持的颜色之一的更简单的方法:hue.lower() in ('red', 'green', 'blue')
在这段代码中,以及后面的行中,我不知道这是一个小L还是一个大i,最好避免使用变量名这样的字母。在一般情况下,避免使用单字变量名也是很好的。
L的范围(num1,0,-1):
发布于 2015-06-17 09:06:31
在初学者程序中,在进行一些验证时接受输入是非常常见的,但是您编写了两个类似的while True循环。我会以代码长一点为代价,写一些更一般的代码,然后写:
from general_input import general_input
def main():
num1 = general_input("Pick a number between 10 and 30: ",
type_=int, set_=range(10,30+1))
hue = general_input("Pick a colour; Red, Green, Blue: ",
set_=("red", "blue", "green"),
cap_sensitive=False)其中,general_input是一个函数,它通过打印有意义的消息来处理所有可能格式错误的输入情况。
您也有两次完全相同的代码,所以使用一个循环:
for _ in range(2):
a.write(numbers[l]+ ' ')
if l == 1:
a.write(text_one % '' +'\n')
else:
a.write(text_one % 's' +'\n')https://codereview.stackexchange.com/questions/93809
复制相似问题