12.原来for循环也可以与else搭配,但需要注意break情况-for循环(二)

本节将探讨嵌套for循环、break、continue,还有for-else(for循环也可以与else搭配的!)

返回到for循环内容,我们看看与for循环相关的其他高级功能,比如,嵌套for循环、中途break退出整个for循环,以及仅终止当前循环的continue指令等。

1.嵌套for循环

for r in range(1,10):
    for c in range(1,r+1):
        print(f'{c}×{r}={c*r:<2d}',end=' ')
    print("")

上述代码的输出结果如下所示,是一个非常漂亮规整的乘法口诀表。

1×1=1
1×2=2  2×2=4
1×3=3  2×3=6  3×3=9
1×4=4  2×4=8  3×4=12 4×4=16
1×5=5  2×5=10 3×5=15 4×5=20 5×5=25
1×6=6  2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7  2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8  2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9  2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

简单分析一下上面的四行代码:

  • 从上述代码的缩进关系可以看得出来,第2个for循环完全包含在第1个(外层)for循环内,与第2个print函数所在行是并列关系,两者均包括于外层for循环的程序块中;
  • 对于这种嵌套for循环,外层for循环每执行一次循环,紧贴着的内层for循环却要完整地执行所有循环,以此类推,还可以继续嵌套第3层、第4层for循环…
  • 在上述例子中,外层for循环用于乘法口诀表在“行”上的控制(r变量标识第r行),内层for循环用于在每行内部“列”上的控制(c变量标识第c列,一个完整的乘法算式代表一列);
  • 外层for循环从r=1、2、3一直循环至9;内层for循环每次循环的次数跟所在行数(即r)相关,比如,第1行(此时r=1),只循环一次(c=1),只打印一列(即:1×1=1),第2行(此时r=2),循环两次(c=1、2),打印两列(即:1×2=2 2×2=4),依次类推,所以c的循环序列为range(1,r+1);
  • 对于内层for循环中的print函数,输入了两个参数,第1个参数是一个采用f-string格式化的字符串,为了整齐划一,对乘法结果采用了左对齐、统一按2个字符的宽度;第2个参数,采用的是关键字参数(以后函数章节会详细讲解),参数名为“end”,传入的参数值为一个空格字符串,要是不传入该参数,默认情况下,每一次print函数调用,都会在结尾(即“end”处)多输出一个换行符(相当于输出了一个“\n”字符串),导致打印换行了,要是主动传入该参数的话,每次print调用则在结尾处输出一个我们通过“end”关键字参数传入的空格字符串(正好用于每列间隙),而不再是默认的换行符了;
  • 内层的for循环把当前行完整打印输出完毕后,我们则需要换行了,这正是上述代码中第二个print的作用,虽然看似打印的是空字符串,但实际的输出正如上面讲到的,print函数默认会多输出一个换行符,正好满足了我们的要求。

2.break与continue

当break关键字包含在for循环程序块中时,break指令会直接终止当前整个循环的执行,需要注意的是,若存在多层for循环嵌套,此时终止的只是包含break的最内层for循环(紧贴break的for循环);当continue关键字包含在for循环程序块中时,continue指令会提前结束本轮循环,直接开始下一轮循环。这两个指令通常配合if-else语句一块使用,如下所示。

for n in range(1,3):
    print('*'*10+f'第{n}次外部循环'+'*'*10)
    for i in range(1,11):
        if i > 5:
            print(f'i={i},>5,break退出整个内层for循环')
            break
        if i % 2 != 0:
            print(f'i={i},奇数,直接返回到内层for循环行,continue下一个i')
            continue
        print(f'i={i},成功找到一个小于等于5的偶数!')

上述代码的输出结果如下所示:

**********第1次外部循环**********
i=1,奇数,直接返回到内层for循环行,continue下一个i
i=2,成功找到一个小于等于5的偶数!
i=3,奇数,直接返回到内层for循环行,continue下一个i
i=4,成功找到一个小于等于5的偶数!
i=5,奇数,直接返回到内层for循环行,continue下一个i
i=6,>5,break退出整个内层for循环
**********第2次外部循环**********
i=1,奇数,直接返回到内层for循环行,continue下一个i
i=2,成功找到一个小于等于5的偶数!
i=3,奇数,直接返回到内层for循环行,continue下一个i
i=4,成功找到一个小于等于5的偶数!
i=5,奇数,直接返回到内层for循环行,continue下一个i
i=6,>5,break退出整个内层for循环

简单解释一下上述代码:

  • 采用两层了for循环嵌套(其中,外层for循环2轮),从输出的结果可以证明:内层for循环中的break只会终止内层紧贴其的for循环,对外层for循环不影响;
  • 内层for循环本应该从i=1、2到10,共循环10轮,可是当i=6时,大于5了,执行至break语句时,终止了整个内层for循环的执行,然后继续该for循环以外的其他指令的执行;
  • 内层for循环过程中,当出现i为奇数(即i除以2余数不为0时),会遇到continue语句,会终止本轮for循环下面其他语句的执行(即:不会执行“成功找到一个小于等于5的偶数!”那行的print指令),直接返回到该for循环(内层for循环)的首行,从队列中取下一个i的值,执行下一轮循环;
  • 所以,在内层for循环过程中,只有i小于等于5且为偶数时(即确保不会进入break、continue分支时),才会执行至打印“成功找到一个小于等于5的偶数!”

3.for-else搭配

直接看下述代码即可,所有关于代码的解释及输出均以注释的形式融入在代码中了。所谓代码中的“注释”,是用作给程序开发者们看的,Python程序在执行时,解释器会忽略所有的注释行。有两种注释的方法:

  • 单行注释一般采用以“#”开头,“#”及本行内“#”后面的所有内容会被作为注释;
  • 对于多行注释,一般包含在三引号里面(采用三个紧连着的单引号 ‘’’ 或者三个紧连着的双引号 “””),对于单引号或者双引号的选择,注释的首尾必须保持一致(要么首尾都是三个单引号,或者首尾都是三个双引号),另外,要是注释内容里面本身包含了三个紧连着的单引号,则应选择三个双引号把其注释起来,反之同理。
# 如下代码所示,range(1,1)返回的是一个空队列(列表),
# 因此不会进入for下面的程序块,
# 而是直接跳入到else下面的程序块。
for i in range(1,1):
    print("1.进入for分支!")
else:
    print("1.进入else分支!")
""" 输出结果为: 1.进入else分支! """

# 如下代码所示,因range(1,3),
# 会进入for下面的程序块2次(i=1、2),
# 队列穷尽后,进入else下面的程序块。
for i in range(1,3):
    print(f'2.进入for分支:i={i}')
else:
    print(f'2.进入else分支!')
""" 输出结果为: 2.进入for分支:i=1 2.进入for分支:i=2 2.进入else分支! """

# 如下代码所示,因range(1,3),
# 会进入for下面的程序块2次(i=1、2),
# 且在最后一次会执行continue,
# 但并不影响在队列穷尽后,进入else下面的程序块。
for i in range(1,3):
    print(f'3.进入for分支:i={i}')
    if(i>=2):
        print('3.continue')
        continue
else:
    print(f'3.进入else分支!')
""" 输出结果为: 3.进入for分支:i=1 3.进入for分支:i=2 3.continue 3.进入else分支! """

# 如下代码所示,因range(1,3),
# 会进入for下面的程序块2次(i=1、2),
# 在第2次时会执行break,
# break直接会跳出整个for循环,
# 连带else也会忽略。
for i in range(1,3):
    print(f'4.进入for分支:i={i}')
    if(i>=2):
        print('4.break')
        break
else:
    print(f'4.进入else分支!')

""" 输出结果为: 4.进入for分支:i=1 4.进入for分支:i=2 4.break """

简单总结一下for-else语句:

  • “for”关键字应与其对应的“else”垂直对齐,此时的“else”是“for”语句中的“else”,而不是“if”语句中的“else”,再一次证明了在Python编程时,对齐与缩进的重要性,一不小心多了几个空格或者少了几个空格,直接导致程序逻辑的错误。
  • 当for语句完成其所有队列(列表,应该用“迭代对象”更准确,以后章节会讲到,这里仅为了大家容易理解)的循环,或者for语句中的队列(列表)为空时,若存在else子句,才会执行else子句(即:要么是空/无循环、要么完成了所有循环);但是,若在循环过程中因为break指令导致了提前退出循环,else子句不会被执行。
  • 一句话,仅当执行break导致从for循环意外退出时,才不会进入for循环的else分支,除此之外,在for循环正常穷尽完毕列表后(包括列表为空),都会进入for循环的else分支。在else分支里可以安排for循环正常执行完毕后的收尾工作。
  • 特别说明一下,for循环的else处理分支一般使用的比较少,了解并能看懂相关代码即可。

青少年、零基础、初学者Python编程从入门到精通,“老马带小马 一块学Python”编程系列

    原文作者:Python编程老马
    原文地址: https://blog.csdn.net/weixin_43838715/article/details/103108770
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞