1.引言
在之前,我们已经学习了如何使用 max()
和 min()
函数来比较大小,这些函数对于处理简单的数据集非常方便。然而,当我们面对大量数据时,仅仅依靠这两个函数可能并不足够。在这种情况下,我们可以借助循环结构,通过逐个元素的比较来实现相同的目标。现在,让我们来看一下如何使用循环来找到数据中的最大值和最小值。
2.寻找最大值
largerst_so_far = -1
print('before', largerst_so_far)
for the_num in [10,40,13,4,73,19]:
if the_num > largerst_so_far:
largerst_so_far = the_num
print(largerst_so_far, the_num)
print('after', largerst_so_far)
#before -1
#10 10
#40 40
#40 13
#40 4
#73 73
#73 19
#after 73
我们创建了一个名为largerst_so_far(目前最大)的变量,并赋值为-1(你应该有所注意到集合中的数字都为正数),随后我们会创立一个迭代变量the_num,这个变量会依次通10,40,13,4,73,19,将这一区域的代码运行6次,我们第一次遇到的数字是10,这可比-1大多了,所以依照循环,我们将largerst_so_far=-1更新为the_num=10,即largerst_so_far=10,继续40>10,更新,再往下,哦哦13<40,所以不更新,同样的4不更新,73更新,19不更新,输出73,我们顺利的找到了集合当中的最大值,也就是73,这很容易吧,你可以通过删去,或者运用‘#’,使得输出的结果更加清爽
顺利找到了最大值,那我们又该如何寻找最小值呢?还有一种情况,如果集合里面全是负数我们该怎么处理呢?请你先试着修改上方最大值的代码,试一下自己能否解决这个问题
3.寻找最小值
首先让我们对代码做一些修改,把>换成<,把large换成small,做到这一步你已经很棒了,让我们来试运行一下,结果是4吗?
smallest_so_far = -1
print('before', smallest_so_far)
for the_num in [10,40,13,4,73,19]:
if the_num < smallest_so_far:
smallest_so_far = the_num
print(smallest_so_far, the_num)
print('after', smallest_so_far)
#before -1
#-1 10
#-1 40
#-1 13
#-1 4
#-1 73
#-1 19
#after -1
显然,结果不是4,我提供的代码是错的,初始值是-1,比集合中的任何一个数都要小,所以输出的值是-1,那我们错在哪里?
首先smallest代表不了任何东西,如同我之前提及的一样它没有意义,可以是x可以是y可以是任何东西,仅仅改变变量名没有任何用,我们代码中真正错误的地方在于“-1”,那么什么值合适呢?100?那如果集合中都是三位数呢?1,000?10,000?听着就很麻烦对吧
4.空类型值(None Type)
-1并不是一个有意义的值,它更像是一个旗帜(flag)告诉我们还没有进行循环,现在让我们引入None类型,None类型函数只有一个常量,也就是它自己None,我们可以把它理解为什么都不是什么都没有,让我们尝试把初始值设定为None,正如它的名字一样,我们还没有见到过任何一个数字呢
smallest_so_far = None
print('before', smallest_so_far)
for the_num in [10,40,13,4,73,19]:
if smallest_so_far is None:
smallest_so_far = the_num
elif the_num < smallest_so_far:
smallest_so_far = the_num
print(smallest_so_far, the_num)
print('after', smallest_so_far)
#10 10
#10 40
#10 13
#4 4
#4 73
#4 19
#after 4
首先我们让程序判断smallest_so_far是不是等于None(is的使用要比==更加的严格,我们一般只在判断对错的情况下用is、is not),好的是的,我们将其更新赋值为the_num,之后的代码更加的智能,None意味着这是第一次的循环,而在后面第二次第三次的循环中,if永远不成立,我们转而执行elif的指令,直到找到最小值4,直到完成对集合的循环