如果您打印出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
(and max
) 将'10'
视为小于'2'
,依此类推。
但这些都不是你的大问题。因为你的第一个n
是偶数,你会进入循环,循环中的第一件事是这样的:
m=[m[:-1]]
......这将做到这一点:
m = [[2, 4, 6, 8, 10, 12, 14, 16, 18]]
因此,接下来的两行执行此操作:
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]
. 将那些额外的括号放在它周围设置为由m
一个list
元素组成的,它本身就是由除最后一个元素之外的所有元素组成的列表m
。
请注意,尽管您在描述中说了什么,“我输入的变量包含奇数它给了我正确的答案”,但这不是真的。它仅在您的最大值为奇数时才有效,因此您从一开始就不会进入循环。
修复此问题后,您的代码实际上仍然损坏,但希望现在您知道如何自己调试。
同时,解决这个问题的pythonic方法是尝试将您的高级英语描述直接翻译成高级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'