最大值正常出来
我认为它只是因为你的第一个或最后一个值是序列的最大值。因为您完全重置了min 和max在每次迭代中.所以整个循环是没用的,任何迭代,但最后一次都没有效果。
初始化应该是外部循环,而不是它内部:
max=array[0]
for i in range(n):
if i>0:
if max<array[i]:
max=array[i]
min=array[0]
for i in range(n):
if i>0:
if min>array[i]:
min=array[i]
此时对索引的检查显然是不必要的:要么吃掉array[0] 与array[0] 的不必要比较(它本身无害),要么在迭代时跳过索引:
max=array[0]
for i in range(1, n):
if max<array[i]:
max=array[i]
min=array[0]
for i in range(1, n):
if min>array[i]:
min=array[i]
本质上,您编写了一个非常复杂的版本:
if array[0] < array[-1]:
max = array[-1]
else:
max = array[0]
if array[0] > array[-1]:
min = array[-1]
else:
min = array[0]
现在为了进一步改进,假设您正在尝试学习,我们将忽略 min 和 max 已经是内置函数,因此整个事情是多余的(尽管您应该不是将您自己的变量命名为与内置变量相同,因为这会造成混淆):
-
n 没用,因为它没有针对array 进行检查,并且array 有自己的长度,n 只能在超过len(array) 时触发不必要的错误,或者如果它小于len(array),则跳过项目。 n 可能有用,例如输入是在经过验证的input() 调用循环中收集的,但事实并非如此。
- 良好的错误处理可能会检查数组的长度是否至少为 1,否则脚本会崩溃(尽管在转换为整数之前还需要检查各个输入值是否有效,所以...)
- 您可以在同一个循环中提取最小值和最大值,无需循环两次(在这种情况下可能不是很重要)。
- 但是 Python 对迭代器也有很好的支持,所以你应该避免在不必要的时候显式索引,这里没有。
我的看法,仍然在努力学习的范围内,将是:
array=list(map(int,input().split))
low = high = array[0]
for candidate in array[1:]:
if candidate > high:
high = candidate
if candidate < low:
low = candidate
print(f"{low} ... {high}")
另一个有趣的替代方法是对数组进行排序并获取已排序数组的第一个和最后一个元素:
array=list(map(int,input().split))
low, *_, high = sorted(array)
print(f"{low} ... {high}")
尽管它的缺点是它仅适用于长度为 2+ 的数组,而原始数组适用于“单例”数组。