python循环从0到x_0基础学Python之九:循环语句(下)

https://www.zhihu.com/video/963433302711132160

Hi 大家好,我是王可乐。上一节课里,可乐为大家介绍了 WHILE 循环语句,并且演示了如何使用 BREAK 和 CONTINUE 来控制循环语句的执行逻辑。

通过循环来重复执行一段逻辑是程序设计里面最常见的流程之一,在今天的课程里,可乐再为大家介绍一下另一个循环语句,FOR 语句。FOR 循环语句很多时候更加简洁,而且可以很优美地用在我们后面要为大家介绍的数组、字典以及可遍历对象上。今天我们只为大家简单介绍 FOR 循环语句的用法,在后面的课程中,可乐还会再为大家补充它的更多用法。

>>> largest = 0 # 首先定义一个变量叫 largest

>>> counts = [1, 5, 7, 2, 4, 9, 3, 3, 6] # 然后我们定义一个列表,它保存了一些正整数,我们假设这些数是一些计数值,我们要用 FOR 循环来找到其中的最大值

>>> for x in counts:

if x > largest:

... largest = x # 然后我们定义 if 子句,当 x 大于 largest 时,将 x 赋值给 largest

... # 回车,执行这个 FOR 循环

>>> print(largest)

9

我们先来看一下结果,输入 print(largest),可以看到,程序正确找出了最大值 9。在上面这段程序里,for x in counts 这句话的意思是,依次取出 counts 里面的数字,赋予给 x,然后以这个 x 值来执行 for 的循环体,直至取完所有 counts 数组里的数字。在循环体里,我们判断当前 x 的值是否大于当前的 largest,如果 x 更大,那就把 largest 更新成当前的最大值,否则就什么也不做。最终,程序一一检查了所有 counts 里的数字,找到了最大值 9。

下面再来看一个例子。这次我们重新实现一次前面从 1 加到 100 的代码,只是换成 FOR 语句:

>>> total = 0 # 首先,定义 total 变量,等于零

>>> for x in range(1, 101): # 然后,念,回车

... total += x # 然后是四个空格,输入循环体,total += x,回车

... # 再回车,执行这个循环体

>>> print(total)

5050

我们先来看一下结果,输入 print(total) 回车,答案是 5050。

在这个 FOR 循环里有一个新东西,range。这个看起来像是函数的东西,其实是一个对象。不过大家不用担心对象这个新名词,后面的课程中可乐还会为大家介绍。现在大家只需要知道,range(1, 101) 定义了一个 range 对象,而这个对象是可遍历的。也就是说,当我们用 for x in 去访问这个 range 时,range 对象会依次为我们提供 1,2,3 直到 100 总共 100 个数字,就像是我们在访问一个超长的,从 1 到 100 的数组一样。

range 还有很多其他的用法,这里大家只需要先学会这一种,使用两个参数来定义 range()。要注意,range(1, 101) 的第一个参数 1 是起始值,它包含在最终的序列里,而后一个参数结束值则不包含在最终的序列里。

这种 for x in 的循环定义看起来更加简洁清晰,对于访问数组、range 以及后面我们会讲到的字典以及其他可遍历对象来说,for x in 是一个很好的选择。

和 WHILE 循环类似,FOR 循环语句也支持后面添加一个 ELSE 子句,在 FOR 循环执行结束之后运行。同样地,FOR 循环也可以使用 break 和 continue 来控制循环的执行,而 for 循环被 break 终端执行时,如果有还有 else 语句,那么 else 语句也不会被执行,和 while 循环行为一样。

此外,就像循环体里面可以使用 IF 条件语句一样,循环体里面也可以再使用循环语句,并且内部循环的循环体里面还可以使用循环。这种代码称作多重循环,或者循环嵌套。我们再来看一个例子,这个例子中我们要找出一个字符串里是否有重复字符。例如字符串 'Hello' 里,l 就是里面的重复字符,因为它总共出现了两次。

我们先来想一下思路。给你任意一个字符串,该怎么判断里面是否有重复字符呢?最简单的想法,那就是一个字符一个字符的去找咯。

首先我们考虑第一个字符,去找整个字符串里除了它自己还有没有跟它一样的字符;如果有,那就得到结论字符串里有重复字符,如果没有那就继续考虑第二个字符,还是到整个字符串里面找是否有和它重复的字符;如果还没找到,那就一直重复下去;如果我们一直找到最后一个字符,也没有发现哪个字符在字符串里有重复字符,那就得出结论,整个字符串里都没有重复字符。思路有了,那么来写代码吧。

>>> s = "Don't panic!" # 首先我们来试一个短的字符串,Don't panic!

>>> for i in range(0, len(s)-1): # 然后,念代码,这里我们产生一个 i,它从字符串第一个下标 0 开始,一直到字符串长度减一,也就是字符串最后一个字符的下标;

... for j in range(i+1, len(s)-1): # 然后在循环体内,我们产生一个 j,它从当前 i 的后一个字符开始,直到最后一个字符

... if s[i] == s[j]: # 然后,我们判断两个字符 s[i] 和 s[j] 是否相同

... print('存在相同字符,下标 {} 和 {}'.format(i, j)) # 如果相同,那么我们就找到了相同字符,打印出来

... break

...

存在相同字符,下标2和8

>>>

第一次看到这样的代码,不要慌张,我们来人工推演一下:

在第一层循环里,我们使用下标 i 从头到尾依次遍历所有字符,代码开始运行是,i 的值是 0,指向字符 D

然后我们进入循环体,这时我们使用下标 j,从 i + 1,也就是下标 1 的第二个字符开始直到最后一个字符,最开始我们的 j 值为 1,也就是第二个字符 o

然后我们对比 D 和 o 是否相等,发现他们不相等,IF 语句里面的语句不执行,内层循环进入第二次运行,此时 j 值为 2,也就是字符 n

然后我们对比发现 D 和 n 也不相等,如此 j 从 1 增加到 11,因为所有字符和 D 都不相同,所以循环里的 IF 语句一直不成立

内层循环执行一遍之后,外层循环执行一步,此时 i 为 1,也就是字母 o

此时内层循环 j 从 o 的后一个字符开始向后一一比较,为什么前面的不比较了呢,因为在上一次循环时候,我们已经比较过 D 和 o 了

字符 o 向后一一比较的结果我们很容易能看出来,仍然是没有和 o 重复的字符,于是外层循环继续执行一步,对比字符 n 和后面的所有字符是否有相同

我们来查看一下执行结果,发现重复字符下标 2 和 8。确实是发现了上述字符串的第三个字符和第九个字符都是 n。

我们可以很容易看到,在这个双重循环里,对于外层循环的每一步,内层循环都要执行许多步。如果内层循环再嵌套一层循环,循环深度继续增加,程序执行的总步数也会飞快的增长。程序需要运行的步数显然直接影响了程序运行的速度,大部分时候我们都希望设计运行速度快的程序,因此就要非常慎重的考虑多重循环。

解决同一个问题可能会存在很多方法,不同的方法写出程序运行速度不同,在计算机领域我们使用复杂度来描述一个算法的效率,这是一个非常深刻的问题,我们会在后面的课程来介绍。

好了,今天的内容就到这里。学习完今天的内容,大家就已经掌握了 Python 编程中的全部主要流程控制方法。使用这些流程控制,你可以实现非常丰富的计算逻辑,让计算机帮你完成更加复杂的任务。

在下一节课程里,可乐会开始为大家介绍 Python 中的一些重要的内置数据结构,让你可以更加自由的表示和使用数据。那么,下期再见咯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值