2017-08-20 9 views
-1

私のPythonコードに問題があります。私がプログラムを書くことになっているという疑問は私のコードと同様に下にあります。私のコードは、ステップごとに異なる入力値で実行するとWing IDEで正常に動作しますが、私のコードをチェックするシステムにサブミットすると、以下に示すようなエラーが発生します。助けを前にありがとう。私のコードは以下の通りです。Pythonの文字列とif文

def activity_level_from_steps(steps): 
    """Takes an amount of steps and returns the level of exercise it equals""" 
    steps = int(steps) 
    if steps < 1: 
     level = 'alive?' 
    elif steps >= 1 and steps < 5000: 
     level = 'sedentary' 
    elif steps >= 5000 and steps < 7500: 
     level = 'very low' 
    elif steps >= 7500 and steps < 10000: 
     level = 'low' 
    elif steps >= 10000 and steps < 12500: 
     level = 'active' 
    else: 
     level = 'very active' 

    return level 

私は

enter image description here

私のコードをチェックし、システムが私に

enter image description here

+3

'elif 1 <= steps <5000:'はコードを単純化し、同じ方向に比較を保つという利点もあります。実際の[mcve]の一部として質問と出力をテキスト形式で入力してください。 – jonrsharpe

+0

あなたのコードは間違ったインデックスです(def)後にスペースを入れてください。 –

答えて

0

まずを与え、あなたがする必要がありますというエラーを解決するために必要なのです質問インデントがPythonでは重要なので(tm)、関数本体を適切にインデントします。

第2に、returnステートメントは、elseと同じレベルでインデントされています。つまり、戻り値はelse句が実行されたときにのみ呼び出されます。何も返さない関数はデフォルトでNoneを返すので、関数は他のすべてのケースではNoneを返すように表示されます。

def activity_level_from_steps(steps): 
    """Takes an amount of steps and returns the level of exercise it equals""" 
    steps = int(steps) 

    if steps < 1: 
     level = 'alive?' 
    elif steps >= 1 and steps < 5000: 
     level = 'sedentary' 
    elif steps >= 5000 and steps < 7500: 
     level = 'very low' 
    elif steps >= 7500 and steps < 10000: 
     level = 'low' 
    elif steps >= 10000 and steps < 12500: 
     level = 'active' 
    else: 
     level = 'very active' 

    return level 

各elifのが唯一のあなたの活動の階段の次のステップを確認する必要がありますので、これはまた、簡素化することができます。

if steps < 1: 
     level = 'alive?' 
    elif steps < 5000: 
     level = 'sedentary' 
    elif steps < 7500: 
     level = 'very low' 
    elif steps < 10000: 
     level = 'low' 
    elif steps < 12500: 
     level = 'active' 
    else: 
     level = 'very active' 
+0

私はあなたの言っていることを理解しています。私の戻りラインはどこでインデントされるべきですか?私は自分のデフと同じレベルでインデントしますか? – Hoist

+0

上記の例で行ったように、メイン関数本体と同じレベルでインデントします。 'def'と同じレベルでインデントした場合、それは関数に属するのではなく、それ以外のスコープに属します。 – MatsLindh

0

MatsLindhあなたがカバーされますが、スタイルや読みやすさについての一般的な発言としていますより多くのDRYと設定とロジックの分離のために、このようなパターンを考えてみてください。

step_levels = [ 
    (1, 'alive?'), 
    (5000, 'sedentary'), 
    (7500, 'very low'), 
    (10000, 'low'), 
    (12500, 'active'), 
    (None, 'very active'), 
] 

def activity_level_from_steps(steps): 
    steps = int(steps) 
    for step, level in step_levels: 
     if steps < step: 
      break 
    return level 
+0

ブレークの代わりに、ただすぐに 'return level'を使うことができます。これは、関数の中で 'ブレーク'します。 –

+0

しかし、あなたは2つのreturn文を持っています。または、人工的な最後のステップを選択する必要があります。 – schwobaseggl

+0

ああ、それは私の悪いです。 step_levelsを少し変更して後退した場合はうまくいくと思います。また、 'None'はバグです。' activity_level_from_steps(10 ** 10) 'はTypeErrorを発生させます。 –