2016-03-25 2 views
1

Мне было интересно, был ли способ сделать этот код более эффективным? Просто заявляю, что я новичок в питоне и программировании в целом. Любые советы были бы замечательными. Спасибо заранее.В любом случае я мог бы сделать это более эффективным?

Вот где я получил задание от: http://www.101computing.net/how-old-is-your-cat/

Программа просто переносит возраст кошки в человеческие года форму.

convertedAge = 0 
stage = 0 

question = input("Is you cat under 1 year old?.. Y/N") 

if ((question.lower() == "y") or (question.lower() == "yes")): 
    ageOfCat = int(input("How old is your cat (in months)?")) #cat < 1 year old 
    if 1 <= ageOfCat <= 2: 
    convertedAge = "9 to 10 months" 
    elif ageOfCat == 3: 
    convertedAge = "2 to 3 years" 
    elif ageOfCat == 4: 
    convertedAge = "5 to 6 years" 
    elif ageOfCat == 5: 
    convertedAge = "8 to 9 years" 
    elif ageOfCat == 6: 
    convertedAge = "10 years" 
    elif 7 <= ageOfCat <= 8: 
    convertedAge = "13 years" 
    elif 8 <= ageOfCat <= 11: 
    convertedAge = "14 years" 
    print("In human years your cat is the equivalent of " + str(convertedAge) + " old.") 
else: 
    ageOfCat = int(input("How old is your cat (in years)?")) #cat > 1 year old 
    if ageOfCat == 1: 
    convertedAge = 15 
    elif ageOfCat == 2: 
    convertedAge = 15 + 9 
    else: 
    convertedAge = 15 + 9 + ((ageOfCat-2) * 4) 
    print("In human years your cat is the equivalent of " + str(convertedAge) + " years old.") 
+0

Вы должны рассмотреть случай ввода «ответ» не Y или N, «ageOfCat» не является целым числом. – GAVD

+0

Чтобы быть справедливым, вопрос касался эффективности, хотя и не обрабатывал крайние случаи. – Bahrom

ответ

4

Ну для начала, вы можете попробовать использовать словарь, чтобы устранить все те, если/иначе блоки:

convertedAges = { 
    1: "9 to 10 months", 
    2: "9 to 10 months", 
    3: "2 to 3 years", # and so on 
} 

Затем использовать словарь:

convertedAge = convertedAges[ageOfCat] 

Честно говоря, вы должны сосредоточиться на удобочитаемости, особенно если вы только начинаете. Как ваша первая if может быть просто

if question.lower() in "yes": # "y" is in "yes", so is "yes" (a string is a substring of itself) 

Если вы начинаете видеть себя повторять одни и те же (или очень похожие) линии снова и снова, остановитесь и подумайте о том, что вы пытаетесь достичь.

+1

Хорошо спасибо. Я не видел словарь раньше, что-то для исследования, я думаю: D – Conor

+1

Не беспокойтесь, удачи! Это действительно забавный язык и отлично подходит для новичков! – Bahrom

+0

Просто посмотрел на ваше редактирование. Это здорово, честно подумал, что ты должен сделать это так, как я это сделал. Еще раз спасибо: D – Conor

3

Вы можете использовать list вместо этого if структуры:

if ((question.lower() == "y") or (question.lower() == "yes")): 
    ageOfCat = int(input("How old is your cat (in months)?")) #cat < 1 year old 
    ages = [None, 
      '9 to 10 months', 
      '9 to 10 months', 
      '2 to 3 years', 
      '5 to 6 years', 
      '8 to 9 years', 
      '10 years', 
      '13 years', 
      '13 years', 
      '14 years', 
      '14 years', 
      '14 years'] 
    convertedAge = ages[ageOfCat] 

И тогда вы можете отправить несколько аргументов в print() вместо конкатенации (и вам не нужно бросать строки как строки):

print("In human years your cat is the equivalent of", convertedAge, "old.") 

И вы можете добавить к convertedAge для пожилых кошек:

else: 
    ageOfCat = int(input("How old is your cat (in years)?")) #cat > 1 year old 
    convertedAge = 15 
    if ageOfCat > 1: 
     convertedAge += 9 
    if ageOfCat > 2: 
     convertedAge += (ageOfCat-2) * 4 
print("In human years your cat is the equivalent of", convertedAge, "years old.") 
+0

ах, используя список, даже не приходил мне в голову, но я думаю, он работает, так как возраст целых чисел, хороший! – Bahrom

+0

Спасибо за ответ. Так что было бы лучше использовать: словарь или список, в данном случае? – Conor

+0

В этом случае список, вероятно, будет лучше, если ваши возрасты всегда целые. Он использует индексы списка для поиска значений. '[1, 2, 3] [0]' даст вам 1 (потому что 1 является 0-м элементом), 1 даст вам 2 и так далее. Однако, если вы начнете посещать периоды с плавающей точкой (1.5) и т. Д., Вам, вероятно, придется пересмотреть этот подход. Словарь позволяет вам искать ключ, '{1: 2} [1]' даст вам 2. – Bahrom