Python学习日志07-基础语法学习06

Python学习日志07-基础语法学习06

亓翎_Re-TikaRa Lv4

for循环语句

  在Python中,for循环语句是一种十分重要的程序结构。其特点是,在给定条件成立时,反复执行某段代码,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。
  for循环的基本结构如下:

1
2
for iterating_var in sequence:
statements

  上述语法中各参数解释如下:

  • iterating_var:表示循环变量
  • sequence:表示遍历对象,通常是元组、字典和列表等
  • statements:表示for语句中的循环体,他的执行次数就是遍历对象中值的数量

  for循环的逻辑关系如下

stateDiagram
  direction TB
  [*] --> s1
  s1 --> s2
  s2 --> s3
  s3 --> s4
  s4 --> s1:返回到输入开始下一轮
  s3 --> s5
  s5 --> s6
  s6 --> [*]
  s1:输入
  s2:算法
  s3:判断是否符合范围
  s4:符合
  s5:不符合
  s6:结束循环,输出最终结果

  比如我们以简单的一个倒计时来说,此时的要求有以下几点:

  • 允许用户输入一个数字,表示倒计时的时长;比如输入300,则表示倒计时300秒。
  • 倒计时的时长以秒为单位,每秒输出一次倒计时的剩余时间。
  • 当倒计时结束后,输出“倒计时结束”,并且发出铃声。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import time  # 导入时间模块,用于控制程序暂停
import winsound # 导入 winsound 模块,用于播放声音

def countdown(t):
"""
def countdown(t):是 Python 中定义一个函数的方式。具体来说:

- def 是定义函数的关键字。
- countdown 是函数的名称,表示这个函数的作用或功能。
- (t) 括号内的 `t` 是函数的参数,表示调用此函数时需要传入一个值,通常这个值会被用作函数内部操作的数据。
这行代码定义了一个名为 `countdown` 的函数,该函数接受一个参数 `t`。

countdown:倒计时函数。

参数:
t (int): 倒计时的总秒数。

此函数会从给定的总秒数开始倒数,每秒更新一次控制台输出,直到倒计时结束。
结束时,它会在控制台打印消息并播放提示音。
"""
for remaining in range(t, 0, -1): # 使用 for 循环从 t 到 1 进行倒计时
# 计算剩余时间的分钟数和秒数
mins, secs = divmod(remaining, 60)

# 将剩余时间格式化为 MM:SS 的形式
timer = '{:02d}:{:02d}'.format(mins, secs)

# 在控制台上打印当前时间,使用 '\r' 来在同一行上更新输出
# '\r' 是回车符,它会将光标移回到行首,这样每次打印都会覆盖前一次的输出
print(timer, end="\r")

# 暂停程序执行 1 秒钟,模拟每秒的倒计时
time.sleep(1)

# 当循环结束后,倒计时已经完成
print('倒计时结束') # 在控制台上打印倒计时结束的消息

# 播放提示音,频率为 1000 Hz,持续时间为 1000 毫秒(1 秒)
winsound.Beep(1000, 1000)

if __name__ == "__main__":
# 检查当前模块是否是主程序入口
# 这是为了确保当这个脚本被直接运行时,下面的代码才会被执行
# 如果这个脚本被其他脚本导入,下面的代码不会被执行
t = int(input("请输入倒计时时长(秒):")) # 提示用户输入倒计时时长,并将输入的字符串转换为整数

# 调用 countdown 函数,开始倒计时
countdown(t)

  简单的运行效果如下,当结束时,就会发出“哔~~”的声音。下面的这个是gif,没有声音,想要试试的同学可以复制上面的代码,然后运行一下。
recording.gif
  其中最重要的便是countdown函数,然后利用for循环定义一个变量remaining,从你输入的数字开始,每秒减一,一直到0,然后发出声音,然后关闭程序。详细的每部分说明如下:

  1. 导入模块

    • import time: 导入 time 模块,用于控制程序暂停。
    • import winsound: 导入 winsound 模块,用于播放声音。
  2. 定义 countdown 函数

    • def countdown(t): 定义一个名为 countdown 的函数,接受一个参数 t,表示倒计时的总秒数。
    • for remaining in range(t, 0, -1): 使用 for 循环从 t1 进行倒计时。range(t, 0, -1) 生成一个从 t1 的递减序列。
    • mins, secs = divmod(remaining, 60): 使用 divmod 函数计算剩余时间的分钟数和秒数。divmod(a, b) 返回一个元组 (a // b, a % b),即商和余数。
    • timer = '{:02d}:{:02d}'.format(mins, secs): 使用字符串格式化方法将剩余时间格式化为 MM:SS 的形式。'{:02d}' 表示至少两位数字,不足两位时前面补零。
    • print(timer, end="\r"): 在控制台上打印当前时间,使用 \r 回车符将光标移回到行首,这样每次打印都会覆盖前一次的输出。
    • time.sleep(1): 暂停程序执行 1 秒钟,模拟每秒的倒计时。
  3. 倒计时结束

    • print('倒计时结束'): 当循环结束后,倒计时已经完成,在控制台上打印倒计时结束的消息。
    • winsound.Beep(1000, 1000): 播放提示音,频率为 1000 Hz,持续时间为 1000 毫秒(1 秒)。
  4. 主程序入口

    • if __name__ == "__main__": 检查当前模块是否是主程序入口。如果是,则执行下面的代码。
    • t = int(input("请输入倒计时时长(秒):")): 提示用户输入倒计时时长,并将输入的字符串转换为整数。
    • countdown(t): 调用 countdown 函数,开始倒计时。

  此时的这个程序逻辑如下:

流程图详细说明

stateDiagram
  direction TB
  [*] --> s7
  s7 --> s8
  s8 --> s9
  s8 --> s10
  s9 --> s1
  s1 --> s11
  s11 --> s12
  s12 --> s13
  s13 --> s14
  s14 --> s15
  s15 --> s16
  s16 --> s17
  s16 --> s18
  s18 --> s20
  s17 --> s19
  s20 --> s22
  s19 --> s21
  s21 --> s23
  s23 --> s24
  s24 --> s25
  s26 --> s27
  s24 --> s26
  s7:导入音频和倒计时模块
  s8:检查当前程序是否为主程序入口
  s9:是,开始运行
  s10:否,退出
  s1:提示用户输入倒计时时长
  s11:读取用户输入并转换成整数类型
  s12:调用countdown函数
  s13:进入函数
  s14:初始化t为用户输入的值
  s15:初始化 t 为用户输入的值
  s16:for 循环开始 (从 t 到 1)
  s17:计算分钟数和秒数
  s18:t 已经为 0
  s20:打印“倒计时结束”
  s19:格式化时间为MM:SS
  s22:播放提示音
  s21:打印时间到控制台
  s23:暂停程序执行 1 秒钟
  s24:减少 t 的值 (t = t - 1)
  s25:返回 for 循环顶部
  s26:跳出循环
  s27:结束
  1. 开始

    • 程序启动。
  2. 导入模块

    • 导入 timewinsound 模块,用于控制程序暂停和播放声音。
  3. 检查主程序入口

    • 使用 if __name__ == "__main__": 检查当前模块是否是主程序入口。
    • 如果是,继续执行;否则,程序结束。
  4. 提示用户输入倒计时时长

    • 提示用户输入倒计时时长,并将输入的字符串转换为整数类型。
  5. 调用 countdown 函数

    • 调用 countdown 函数,传入用户指定的秒数。
  6. 进入 countdown 函数

    • 初始化 t 为用户输入的值。
  7. for 循环

    • 使用 for remaining in range(t, 0, -1)t1 进行倒计时。
    • 计算分钟数和秒数
      • 使用 divmod(remaining, 60) 计算剩余时间的分钟数和秒数。
    • 格式化时间
      • 使用 '{:02d}:{:02d}'.format(mins, secs) 将剩余时间格式化为 MM:SS 的形式。
    • 打印时间到控制台
      • 使用 print(timer, end="\r") 在控制台上打印当前时间,使用 \r 回车符在同一行上更新输出。
    • 暂停程序执行 1 秒钟
      • 使用 time.sleep(1) 暂停程序执行 1 秒钟。
    • 减少 t 的值
      • for 循环自动减少 remaining 的值。
  8. 倒计时结束

    • for 循环结束时,倒计时已经完成。
    • 打印“倒计时结束”
      • 在控制台上打印“倒计时结束”。
    • 播放提示音
      • 使用 winsound.Beep(1000, 1000) 播放提示音,频率为 1000 Hz,持续时间为 1000 毫秒(1 秒)。
  9. 结束

    • 程序结束。

for…else语句

  与if类似的,for也有一个else语句。在for…else语句中,else中的语句会在循环执行完(即for不是通过break跳出而中断的)的情况下执行。for…else语句的格式如下:

1
2
3
4
for iterating_var in sequence:
statements1
else:
statements2

  上述语法中各参数解释如下:

  • iterating_var:表示循环变量
  • sequence:表示遍历对象,通常是元组、字典和列表等
  • statements1:表示for语句中的循环体,他的执行次数就是遍历对象中值的数量
  • statements2:else语句中的statements2,只有在循环正常退出时(遍历完所有遍历对象中的值)执行

  举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 定义一个数字列表,其中包含一系列整数
数字列表 = [1, 3, 5, 7, 9, 10]

# 使用 for...else 结构遍历数字列表中的每一个元素
for 数字 in 数字列表:
# 在每次迭代中,检查当前数字是否为偶数
# 偶数的定义是能被2整除且余数为0的数字
if 数字 % 2 == 0:
# 如果当前数字是偶数,则打印出找到偶数的消息,并附带偶数的具体值
print(f"找到了一个偶数: {数字}")
# 使用 break 语句中断当前的 for 循环,不再继续检查后续的数字
break
else:
# 这个 else 块会在 for 循环正常结束(即没有遇到 break)时执行
# 如果列表中没有任何一个数字是偶数,那么会执行这里的代码块
print("在列表中没有找到偶数。")

  上诉代码的执行效果如下:

1
找到了一个偶数: 10

  我们可以在一个for语句中使用另一个for语句,即嵌套fpr循环,这种嵌套式的语法格式如下:

1
2
3
for iterating_var in sequence1:
for iterating_var in sequence2:
statements

  举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 定义一个二维列表,表示一个 3x3 的矩阵
矩阵 = [
[1, 2, 3], # 第一行
[4, 5, 6], # 第二行
[7, 8, 9] # 第三行
]

# 使用嵌套的 for 循环遍历二维列表中的每一个元素
# 外层循环遍历矩阵的每一行
forin 矩阵:
# 内层循环遍历当前行中的每一个元素
for 元素 in 行:
# 打印当前元素,并在元素后面添加一个空格,而不是默认的换行符
# 这样可以在同一行打印出所有元素
print(元素, end=' ')
# 当内层循环结束后,打印一个换行符,以便开始打印下一行的元素
print()

  上述代码的执行效果如下:

1
2
3
1 2 3 
4 5 6
7 8 9

后记

  其实,for 循环和 if 语句在某些方面有相似之处,但它们的功能和使用场景不同。for 循环可以自动遍历序列中的每个元素,而 if 语句则用于条件判断。如果要用 if 语句实现循环功能,通常需要嵌套多层代码,这会使得代码变得复杂且难以维护。相比之下,for 循环更为简洁和直观,尽管初次接触时可能会觉得有些难以理解,但通过实践和练习,你会逐渐掌握其用法。
  例如,在 for…else 结构中,break 语句的作用可能一开始不太容易理解。但实际上,break 用于在满足某个条件时提前终止循环。以一个简单的例子来说明:假设我们要通过累加 1 来达到目标值 5。一旦累加的结果达到 5,我们就可以使用 break 语句停止循环。如果在累加过程中始终没有达到 5(比如只能加到 3),那么循环会在遍历完所有元素后正常结束,此时 else 块中的代码将会执行。
  具体来说,for…else 的工作原理如下

  • for 循环会遍历指定的序列。
  • 如果在循环体内使用了 break 语句并因此提前退出循环,则 else 块不会被执行。
  • 如果循环自然结束(即没有遇到 break 语句),则 else 块中的代码会被执行。


  这样,for…else 结构提供了一种方便的方式来处理循环结束后的情况,无论是在找到特定条件时提前终止还是在遍历完所有元素后执行一些额外的操作。

  • 标题: Python学习日志07-基础语法学习06
  • 作者: 亓翎_Re-TikaRa
  • 创建于 : 2024-12-02 17:14:22
  • 更新于 : 2024-12-03 11:46:58
  • 链接: https://re-tikara.fun/posts/a975f408/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
Python学习日志07-基础语法学习06