2016-03-25 21 views
1

このコードをより効率的にする方法があるのだろうかと思っていましたか?ちょうど私がPythonとプログラミング全体にちょっと新しいと言っているだけです。あらゆるヒントは素晴らしいだろう。ありがとうございます。プログラムは、ちょうど人間の年の形式に猫の年齢を転送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

ケース入力 "answer"は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

あなたは、代わりにそのif構造のlist使用することができます。

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

関連する問題