第7节,比较三个数的大小

如果你想培养自己的编程思维,请从这些简单的事情着手,不要试图去看那些高难度的算法,也不要尝试通过具体的项实践来提升锻炼编程的思维,在你还没有学会走路之前,跑对你来说是一项只存在于幻想中的动作。

你刚刚已经学过了比较2个数的大小,似乎比较3个数的大小已经是手到擒来之事,然而看完我的文章,一定会让你别有一番收获。

def max_of_three_int(x, y, z):
    pass

在继续阅读教程之前,请先自己尝试实现这个函数,对比我的方法和你自己实现的方法,学习效果会更好

1 暴力比较法

def max_of_three_int(x, y, z):
    if x > y:
        if x > z:
            return x
        else:
            return z
    else:
        if y > z:
            return y
        else:
            return z


max_int = max_of_three_int(4, 6, 8)
print(max_int)

我的代码里出现了if 嵌套,如果你的思维已经开始混乱,请看我画的程序流程图

这种写法,考验一个人的逻辑是否足够的清晰,先从两个数中找出最大的一个,然后用这个最大的数值去和第3个数值进行比较。

2. 争夺宝座法

尽管这种方法普遍的用于算法,但似乎并没有专门为它起一个含义贴切的名字,我大胆称其为争夺宝座法,如果你在其他教程里看到更准确的描述,请分享给我,在这种方法里,我声明创建一个变量max_int, 让它等于3个数值中的任意个,接下来,剩余的两个数值与max_int进行比较,就好比要争抢宝座,谁赢了,谁就做上去,在逻辑上,谁的数值更大,便将谁赋值给max_int

def max_of_three_int(x, y, z):
    max_int = x
    if y > max_int:
        max_int = y

    if z > max_int:
        max_int = z

    return max_int

max_int = max_of_three_int(4, 6, 8)
print(max_int)

接下来画出程序的流程图

受此方法启发,我们来实现从列表中找出最大值,注意,不要使用max内置函数

lst = [8, 6, 1, 7, 4]

max_value = lst[0]   # 先让lst[0] 登上宝座
# 接下来,剩余的数值争抢这个宝座
for item in lst:
    if item > max_value:
        max_value = item

print(max_value)

你或许已经注意到,在遍历列表的过程中,lst[0] 和max_value进行比较,但max_value本就等于lst[0],这有必要么?从逻辑上讲,是没有必要的,但从代码实现上看,这是最舒服的一种写法,仅仅多了一次比较而已,没什么大不了,如果想减少一次比较,就必须这样写

lst = [8, 6, 1, 7, 4]

max_value = lst[0]   # 先让lst[0] 登上宝座
# 接下来,剩余的数值争抢这个宝座
for i in range(1, len(lst)):
    if lst[i] > max_value:
        max_value = lst[i]

print(max_value)

这样写的确避免了lst[0] 与 max_value进行比较,但是代码写起来不舒服,可阅读性降低,为了减少一次比较而付出如此大的代价是不值得的。

3. 前人栽树后人乘凉

前面的章节里,已经实现了两个数的比较,为何不结束max_value函数呢?

def max_value(x, y):
    if x > y:
        return x
    return y


def max_of_three_int(x, y, z):
    max_int = max_value(x, y)
    max_int = max_value(max_int, z)
    return max_int


max_int = max_of_three_int(4, 6, 8)
print(max_int)

编写函数的目的之一就是代码复用,新的功能借助之前已经实现的函数来实现,

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案