首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10瓶绿瓶作业

10瓶绿瓶作业
EN

Code Review用户
提问于 2015-06-17 04:38:39
回答 5查看 2.3K关注 0票数 3

这是大学作业的代码。它现在已经通过了,所以不要害怕给我错误的分数,例如。我想知道有什么可以做得更好,或者是一些低效率的代码,或者是糟糕的实践。

代码语言:javascript
复制
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中运行。

EN

回答 5

Code Review用户

发布于 2015-06-17 06:31:14

一个好的起点是把你的主要方法分解成小块的工作。然后,您可以集中精力改进每个部分中的代码。

目前,您的主要方法做了很多事情,它读取用户输入,建立一首歌并将其写到一个文件中。下面是您如何重写它的方法:

代码语言:javascript
复制
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)

如果它发出的所有调用都在类似的抽象级别上,则该函数更容易读取。主要的方法不是像输入读取或文件写入这样的低级操作,而是讲述一个故事。

票数 8
EN

Code Review用户

发布于 2015-06-17 05:58:38

在代码中间导入包被认为是一种不好的做法,很少有例外。导入文件的顶部。

另一个不好的做法是在变量名中使用数字,比如num1

我会发现这是一种更简单、更自然的验证和退出输入循环的方法:

代码语言:javascript
复制
    if 10 <= num1 <= 30:
        break
    print("Not Valid!")

检查hue是否是支持的颜色之一的更简单的方法:hue.lower() in ('red', 'green', 'blue')

在这段代码中,以及后面的行中,我不知道这是一个小L还是一个大i,最好避免使用变量名这样的字母。在一般情况下,避免使用单字变量名也是很好的。

L的范围(num1,0,-1):

票数 6
EN

Code Review用户

发布于 2015-06-17 09:06:31

在初学者程序中,在进行一些验证时接受输入是非常常见的,但是您编写了两个类似的while True循环。我会以代码长一点为代价,写一些更一般的代码,然后写:

代码语言:javascript
复制
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是一个函数,它通过打印有意义的消息来处理所有可能格式错误的输入情况。

您也有两次完全相同的代码,所以使用一个循环:

代码语言:javascript
复制
for _ in range(2):
    a.write(numbers[l]+ ' ')
    if l == 1:
        a.write(text_one % '' +'\n')
    else:
        a.write(text_one % 's' +'\n')
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/93809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档