ループの内部を印刷するm
と、これはかなり明白になります。または、対話型ビジュアライザーまたはデバッガーのみを使用してテストすることもできます。
あなたの値が であるとしましょう2, 4, 6, 8, 10, 12, 14, 16, 18, 20
。並べ替えると、次のようになります。
m = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
n = max(m) = 20
n = int(n) = 20
並べ替えの定義により、リストの最後の値でなければならないため、これmax
は役に立ちません(とにかくループでそれに依存しているようです)。
また、int
は誤解を招きます。数値が数値ではなく文字列であってもコードが機能するように見えますが、実際には機能sorted
しません。max
'10'
'2'
しかし、どちらもあなたの大きな問題ではありません。最初n
は偶数なので、ループに入ります。ループの最初のことは次のとおりです。
m=[m[:-1]]
…これを行う:
m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]
したがって、次の 2 行でこれを行います。
n = [2, 4, 6, 8, 10, 12, 14, 16, 18] # the max of a 1-element list is that element
n = int([2, 4, 6, 8, 10, 12, 14, 16, 18])
そしてブーム、あなたの例外があります。
m
の最後の要素以外のすべてに設定したい場合はm
、単にm = m[:-1]
. それらの余分な括弧をその周りに投げると、 の最後の要素を除くすべての要素からなるリストである 1 つの要素からなる に設定m
されます。list
m
説明で「奇数を含む変数を入力すると、正しい答えが得られます」と言っているにもかかわらず、それは真実ではないことに注意してください。最大値が奇数の場合にのみ機能するため、最初からループに入ることはありません。
これを修正した後もコードは実際にはまだ壊れていますが、これで自分でデバッグする方法がわかったと思います。
一方、これを解決するためのPython的な方法は、高レベルの英語の説明を高レベルのPythonに直接翻訳しようとすることです. で最大の奇数を見つけるにはどうすればよいm
ですか?
最初に の奇数を取得しますm
。
odds = (n for n in m if n % 2)
(関数を作成すると、これはより読みやすくなる可能性がありますodd
。また、その場合はfilter
、ジェネレーター式を使用することをお勧めします。)
次に、最大値を取得するには:
max_odd = max(odds)
もちろん、オッズがない場合を処理する必要があります。にチェックを入れることでできますif odd:
。しかし、Python では、通常、許可よりも許しを求めるほうがよいため、プログラム全体を次に示します。
m = [a, b, c, d, e, f, g, h, j, k]
odds = (n for n in m if n % 2)
try:
print max(odds), 'is the largest odd number'
except ValueError:
print 'There are no odd numbers'