2016-03-25 12 views
1

Ich habe mich gefragt, ob es einen Weg gibt, diesen Code effizienter zu machen? Ich sage nur, dass ich für Python und Programmierung als Ganzes ein bisschen neu bin. Irgendwelche Tipps wären toll. Danke ist Fortschritt.Wie könnte ich das effizienter machen?

Hier ist, wo ich bekam die Aufgabe aus: http://www.101computing.net/how-old-is-your-cat/

Das Programm gerade überträgt die Alte Katze in Menschenjahre Form.

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

Sie sollten berücksichtigen, dass die Eingabe "Antwort" nicht Y oder N ist, "ageOfCat" ist keine Ganzzahl. – GAVD

+0

Um fair zu sein, ging es bei der Frage um Effizienz, nicht um Edge-Fälle. – Bahrom

Antwort

4

Gut für den Anfang, könnten Sie versuchen, ein Wörterbuch mit allen zu beseitigen if/else Blöcke:

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

Dann das Wörterbuch verwenden:

convertedAge = convertedAges[ageOfCat] 
Ehrlich

, sollten Sie konzentrieren Sie sich auf Lesbarkeit, besonders wenn Sie gerade erst anfangen. Wie Sie Ihre erste könnte if nur

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

sein, wenn Sie beginnen, sehen Sie sich die gleichen wiederholen (oder sehr ähnliche) Zeilen immer und immer wieder, stoppen und darüber nachdenken, was Sie versuchen zu erreichen.

+1

Alles klar, danke. Ich habe noch nie ein Wörterbuch gesehen, etwas zu erforschen, denke ich: D – Conor

+1

Keine Sorge, viel Glück! Es ist eine wirklich lustige Sprache und ideal für Anfänger! – Bahrom

+0

Ich habe nur deine Bearbeitung angeschaut. Das ist großartig, ehrlich gesagt, du musst es so machen wie ich es gemacht habe. Nochmals vielen Dank: D – Conor

3

können Sie einen list anstelle dieser if Struktur:

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] 

Und dann können Sie mehrere Argumente zu print() statt verketten (und Sie brauchen nicht zu werfen Strings als Strings) senden:

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

Und Sie können auf die convertedAge für ältere Katzen hinzufügen:

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

ah, mit einer Liste ist mir nicht einmal vorgekommen, aber ich denke, es funktioniert seit Ewigkeiten alle Ganzzahlen, nett! – Bahrom

+0

Danke für die Antwort. Was wäre also besser zu benutzen: ein Wörterbuch oder eine Liste, in diesem Fall? – Conor

+0

In diesem Fall wäre eine Liste wahrscheinlich besser, solange Ihr Alter immer ganzzahlig ist. Er verwendet Listenindizes, um die Werte nachzuschlagen. '[1, 2, 3] [0]' würde Ihnen 1 geben (weil 1 das 0. Element ist), 1 würde Ihnen 2 geben und so weiter. Wenn Sie jedoch in Float-Zeitalter (1.5) usw. gehen, müssen Sie wahrscheinlich diesen Ansatz überdenken. Dictionary ermöglicht es Ihnen, einen Schlüssel nachzuschlagen, '{1: 2} [1]' würde Ihnen 2 geben. – Bahrom

Verwandte Themen