Python—for循环

for循环

语法结构
for 临时变量 in 序列:
    语句块
for循环与while循环不同, while循环的条件是自定义的,自行控制循环条件,for循环是一种轮询机制,是对一批内容进行逐个处理
所以,理论上讲,Python的for循环无法构建无限循环(被处理的数据集不可能无限大)

python中for循环常用于遍历列表,元组,字符串以及字典等序列中的元素

上述语句的执行过程:如果序列中包含表达式,就会先计算求出表达式的值,然后依照序列值的顺序,依次赋值给变量然后执行语句块

而且之前也说过了,在python中,缩进是一个判断语句层级的重要指标,for循环也一定要注意语句之间的缩进问题,还有序列之后的

如果for循环的序列是一个字符串的时候,则会将字符串里的字符依次赋给变量

如果for循环的序列是一个列表的时候,就会把列表里的数据依次赋给变量

这样讲可能还是有点抽象,用一个python内置的len函数可以简单认识

len函数

首先介绍一下,len函数的作用是返回对象的长度和个数

我们就可以利用len函数求出两个不同序列的长度来演示为什么会出现以上情况

可以很明显的看出fruits列表的长度是3

变量letter的长度就是其中包含字符串的长度6

所以对于for循环来说处理的方式也是不一样的

range函数

for语句经常跟range函数连用,range函数是一个python内置函数可以创建一个整数列表

函数语法
range(start, stop[, step])

参数说明:

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);

  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

  • step:步长,表示每次相加的值,默认为1。例如:range(0, 5,2) 输出的值为[0,2,4]

如果要加上步长,就不能省略参数哦

range函数还可以结合len函数使用

后续补充

for循环实例

简单理解了for循环的结构规则,我们可以进一步利用例题了解for循环

利用for循环统计字符

实验要求:
用户随机输入一段字符串和要查找的字符
利用 for循环遍历字符串计算指定字符出现的次数

可以尝试自己做,然后再看咱写的基础答案

分隔线

执行理论:
  • 首先要在循环外定义一个整数型变量用来累加计数

  • 然后利用for循环遍历字符串,嵌套if语句判断来完成

利用for循环输出九九乘法表

先前我们已经利用while循环输出过一次九九乘法表,基础的逻辑已经知晓

分隔线

执行理论:

  • 首先我们是不是需要先定义一个外层for循环控制九九乘法表的行数

  • 其次我们要定义一个内层循环控制输出内容

还是一样,九九乘法表的逻辑是:第一个乘数做变化,第二个乘数是当前的行数

那么根据range函数的性质,我们第内层循环j就要定义为(1,x+1)

当x等于3时,y的序列参数就有[1,2,3],符合逻辑

接下来就是格式化输出了

课后编程训练——输出水仙花数

水仙花数:指的是一个三位的十进制数,其各位数字的立方和正好等于该数字本身

执行理论:
  • 首先我们需要利用for循环遍历所有的三位十进制数,也就是(100-999)

  • 然后取出十进制数的个位、十位和百位

  • 最后利用if语句进行乘方相加判断是否等于本身

如何取位

在python中取出各位数字有一个很简单的记忆方法:例有一个多位数x

  • 个位 = x // 1 %10

  • 十位 = x // 10 %10

  • 百位 = x // 100 % 10

  • 千位 = x // 1000 % 10

  • ……

分隔线

count = 0
for x in range(100,1000):
    a = x % 10
    #个位
    b = x // 10 % 10
    #十位
    c = x // 100 % 10
    #百位
    if (a**3+b**3+c**3) == x:
        # '**'表示乘方,判断是否等于本身
        print(x)
        count += 1  #计数
print("一共有%d个水仙花数"%count)

课后编程训练——百马百担

题目要求:
现有100匹马需驮100担货,其中大马驮3担,中马能驮2担,两匹小马驮1担
问一百匹马中有大马,中马,小马各多少
执行理论:
  • 首先给了常量信息:100匹马和100担货,大马驮3担,中马能驮2担,两匹小马驮1担

  • 那么我们就可以从中得知 大马,中马和小马的最大值

  • 然后利用for循环嵌套这个三个值去遍历寻找能够同时满足100匹马和100担货的情况并输出

分隔线

huo = 100
ma = 100
count = 0 #计数
'''
首先定义常量值,之后如果想要改值,可以直接更改
不用去程序中一个个找到后更改
更加便捷
'''
for big in range(0,(huo//3)):
    #马匹最大值,就是整除它能驮的担数
    for medium in range(0,(huo//2)):
        for small in range(0,huo):
            if (huo == big * 3 + medium *2 + small * 0.5) and (ma == big + medium + small):
                '''
                判断,如果它们驮的担数和等于货物总量
                并且马匹的数量等于规定的总数量
                输出
                '''
                count += 1
                #计数
                print("第%d种方法是:大马:%d\t中马:%d\t\t小马:%d"%(count,big ,medium,small))
                '''\t是输出间隔制表符,至于第二个为什么要写两个,其实我也不晓得
                    但是加了才间隔正常,估计是制表符的一些性质
                '''

总结:这一题需要三个for循环,不要怕做题出错,要跟着自己的思路做下去,实践出真知

编程题——利用for循环输出一个正立实心等腰三角形

执行理论:
  • 首先我们使用*来填充等腰三角形

  • 然后我们可以看这个我自己在word绘制的一个三角,一开始想的是:第一行是一个,第二行是两个,第三行三个,但是发现做出来有点麻烦,后面采用这种形式,每行都是奇数,好做

  • 我们可以定义两个for循环,一个控制行数,一个控制输出内容

我们再回想一下range函数的性质,它不包含结束值,也就是说range(1,4)=[1,2,3]

接着看结果图的第二行,第三行……,可以发现刚好等于它当前行数的两倍少一个

分隔线

但是这个时候会发现出现了问题,它的输出结果并不像我们想象的那样直接是一个等腰三角形,而是左对齐输出的,在查找了资料之后,好像大部分人用的都是再加个循环打印空格的方式来输出

那第一行想要居中所需要的空格是不是取决于最后一行的长度?

看下图,如果有四行,第一行需要在中心输出,也就是一共需要三个空格,第二行需要两个空格

那简单逻辑得出的结果:空格所需数=最大行-当前行

首先,我们通过input()函数获取用户输入的等腰三角形行数,并将其转换成整数类型。接着,我们使用range()函数创建一个从1到num的数字序列,该序列会被for循环遍历num次,即打印num行等腰三角形。

在外层的for循环中,我们使用变量x表示当前正在打印的行数。在内层的第一个for循环中,我们使用变量z控制当前行左侧的空格数,这里需要注意的是,等腰三角形左侧的空格数是与行数相关的,具体来说,第一行左侧的空格数是num-1个,第二行是num-2个,以此类推。因此,我们可以使用num-x来计算当前行左侧的空格数。

在内层的第二个for循环中,我们使用变量y控制当前行中间的星号数。由于等腰三角形每一行的星号数是与行数相关的,因此我们可以使用x+x来计算当前行中间的星号数。第九行一共就是17个星号,也就是2倍的行号少1

最后,我们使用print()函数输出当前行,并通过设置end参数为空字符串来避免自动换行,然后使用另一个print()函数来输出一个空字符起到换行的作用,使得下一行等腰三角形能够与当前行隔开。

调试

在程序有BUG/缺陷,需要修复时,我们可以通过编译器自带的断点调试功能实现程序的单步可视化执行。对于我们这些初学者而言,断点调试还有另外一个用途:帮助理解程序背后的逻辑

这里咱们基于Visual Studio Code编辑器简单实践一下调试的功能

断点

关于断点我了解的不太多,在VC code中可以理解为是在程序的执行过程中设置了一个节点

当程序运行到这个节点时会中断执行,之后的程序由用户决定是否执行并且开始记录程序内变量变化

实践

这是一段求两数的最大公约数和最小公倍数的python代码,还有一点bug,只做个演示,见谅

m = int(input("请输入整数m:"))
n = int(input("请输入整数n:"))

'''
判断两数中的最大和最小值
因为最大公约数的取值范围不可能超过两数的最大值
最小公倍数的取值范围不可能超过两数的乘积
'''
if m > n:       
    max = m
    min = n
else:
    max = n
    min = m
#最大公约数
for x in range(1,max+1):
    if(m % x == 0) and (n % x ==0):  #最大公约数的判断条件是能被两数同时整除的最大数
        result = x
print("%d和%d的最大公约数为:%d"%(m,n,result))

#最小公倍数 (1)
beishu = int((m * n)/result)
print("%d和%d的最小公倍数为:%d"%(m,n,beishu))
#最小公倍数 = 两数的乘积 / 最大公约数

在鼠标移动到VC code列标的左边都会出现一个浅红色的点,这个就是设置断点的位置,点击就可以设置断点,再次点击可以取消,一个程序可以设置多个断点

还有在进行调试之后程序左边的四个记录框的作用

  • 变量区:可以监视断点后变量的变化

  • 监视区:可以自定义监视程序中某个值的变化

与正常的程序运行不动,程序并没有一口气从头执行到尾,而是暂停在了第28行的断点处。图中的黄色箭头所指的行是接下来准备执行的代码行,然后我们点击下一步(也就是第三个按钮)

然后下方的终端就会出现输入框,我们输入完之后,点击下一步程序会继续执行

然后左侧的变量框中也会记录我们程序中的变量值变量的变化

当我们把鼠标放在变量上停顿一会,也会出现当前变量的值

需要注意的是这里的黄框的意思是准备要执行的步骤,也就是还没有执行,所以这里的x的值还是上次循环的值,要进行下一步之后才看得到x值的变化

简单的演示就到这里,可以去实践慢慢熟悉

for…else

2023年6月5日,今天又了解到一个新的知识点(其实之前也了解过,只不过没太在意)突然出现,搞得我一下子还反应不过来——关于else的用法

在 Python 中,for…else 语句用于在循环结束后执行一段代码

语法:
for item in iterable:
    # 循环主体
else:
    # 循环结束后执行的代码

当循环执行完毕(即遍历完 iterable 中的所有元素)后,会执行 else 子句中的代码,如果在循环过程中遇到了 break 语句,则会中断循环,此时不会执行 else 子句。同理在while循环中也适用

这是我在做题中遇见的,就以题来展示功能:

判断101-200之间有多少个素数,并输出所有素数。

素数,就是只能被1和本身整除的数

初始思路:
首先,需要利用for x in (101,201),循环遍历100到200之间的数据
然后,再用一个新的for y in range(2,x)循环,使用外层x依次向内层y取余,如果为0,执行break
else,如果x取余到x-1都不为0的话,说明为素数,执行print
#初始代码
count = 0
for x in range(101,201):
    for y in range(2,x):
        if x % y == 0:
            break
        else:
            print(x,end='  ')
            count += 1
            if count % 10 == 0:
                print()

print('\n一共包含{}个素数'.format(count))

输出后就是这样,他会将每个奇数,输出特别多次,因为偶数向2取余都为0,一开始还不知道是什么问题,我就又子啊print后新加了一个break,结果输出的是全部奇数

这是因为,奇数向2取余都不为0,所以就会直接执行同if对应的else里的语句,达不到我们想要的结果

Python—for循环

其实我们的目的是:两个for循环进行试除,利用外层for循环取值,依次向内层for循环里面的所有值取余,全试除完都不为0才进行输出为素数的操作

所以我们这里的else不能同if对齐,应该作为内层for循环遍历后所执行的代码

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月13日
下一篇 2023年12月13日

相关推荐