CC++ & Algorithm

Python 循环的简单应用

困难6
语言版本:C++Python
概述:把学到的for和while循环用到实际任务中,比如求和、找最大值、统计数量,让电脑帮你做数学题。

用循环解决实际问题——Python循环应用详解

循环是编程里最实用的工具之一。它能让计算机自动完成重复的任务,比如算总成绩、找最高分、猜数字、画图案。学会循环,你就可以让电脑帮自己做数学题、统计全班同学的身高,甚至写一个小游戏。下面我们通过几个常见例子,看看循环到底能做什么。

一、用 for 循环做累加——从 1 加到 100

想象一下你要把 1 到 100 逐个数加起来,手动算很慢,还容易出错。用 for 循环几行代码就能搞定。

total = 0                     # 用来存累加的结果,先设为0
for i in range(1, 101):       # range(1,101) 生成1,2,3,...,100
    total = total + i          # 每次把当前的 i 加到 total 上
print("总和是", total)         # 输出:5050

原理说明
循环开始前,total 是 0。第一次循环 i=1,total 变成 0+1=1;第二次 i=2,total 变成 1+2=3……最后 i=100,total 变成之前的总和加 100,得到 5050。

生活中的类比
就像你有一个存钱罐,开始是空的,每天往里放当天的编号那么多硬币(第1天放1枚,第2天放2枚……第100天放100枚),最后数一数总共有多少枚。循环就是自动帮你“放硬币”的机器人。

常见错误

  • 忘记给 total 初始化(写成 total 但没赋初值),导致运行时出错。
  • range(1,101) 写成了 range(1,100),这样只加到 99,输出 4950(少了100)。
  • 累加语句写成了 total = i,这样只会保留最后一个 i 的值,而不是累加。

小练习
用循环计算 1 到 50 所有偶数之和。提示:可以用 range(2,51,2)

二、用 for 循环找最大值——谁是最高分

你有一堆分数,要找出最高分。人工一个一个比很费劲,让循环替你比较。

scores = [85, 92, 78, 95, 88]       # 五名同学的分数
max_score = scores[0]                # 先假设第一个分数是最大
for score in scores:                 # 遍历列表里的每个分数
    if score > max_score:            # 如果当前分数比记录的最大值还大
        max_score = score            # 就更新最大值
print("最高分是", max_score)         # 输出:95

原理说明
循环开始时,max_score 等于第一个分数 85。然后循环依次取出 92、78、95、88。每次比较:92>85,更新为92;78不大于92,跳过;95>92,更新为95;88不大于95,跳过。最后 max_score 就是 95。

生活中的类比
就像班里选班长,你先随便指定第一个同学作为“目前最高身高”。然后让所有同学依次站到前面比一比:如果后面的同学更高,就把他作为新的“最高”。最后剩下的就是全班最高的人。

常见错误

  • max_score 初始化时写成 max_score = 0,如果列表里全是负数,就会错误地把 0 当作最大值。
  • 忘记更新最大值(只 if 判断,没写赋值语句)。
  • for score in scores 时,把 score 写成了 scores(少写 s),导致变量名错误。

扩展应用
你还可以用相同思路找最小值、求平均值:

scores = [85, 92, 78, 95, 88]
total = 0                     # 总和
min_score = scores[0]         # 先假设第一个最小
for score in scores:
    total = total + score     # 累加所有分数
    if score < min_score:     # 如果当前分数比记录的最小值还小
        min_score = score     # 更新最小值
average = total / len(scores) # 计算平均分
print("最高分:", max_score)   # 注意:这里的 max_score 需要另算,或者合并循环
print("最低分:", min_score)
print("平均分:", average)

注意:最高分和最低分可以在同一个循环里同时算出,但代码要同时保留两个变量。上面只示了最低分和总和,最高分同理。

三、用 while 循环实现猜数字小游戏

电脑心里想一个 1 到 20 之间的数字,你猜,直到猜对为止——这就是 while 循环的典型应用:不知道要循环多少次,直到某个条件成立才结束。

import random                            # 导入随机模块
secret = random.randint(1, 20)           # 电脑随机生成一个1~20的秘密数字
guess = 0                                # 先给guess一个不可能是秘密的值,保证能进入循环
while guess != secret:                   # 只要猜的数字不等于秘密,就继续循环
    guess = int(input("猜一个1-20的数字: "))  # 让用户输入并转为整数
    if guess < secret:                   # 如果猜小了
        print("太小了")
    elif guess > secret:                 # 如果猜大了
        print("太大了")
print("正确!答案是", secret)            # 猜对了,退出循环后输出

原理说明
变量 guess 初始为 0,而 secret 在 1~20 之间,所以 guess != secret 成立,进入循环。每次循环让用户输入新数字,与秘密比较并给出提示。直到某次输入等于秘密,条件 guess != secret 不成立,循环结束。

生活中的类比
就像和朋友玩“猜数字”游戏:你心里想一个数,朋友们轮流猜,你说“大了”或“小了”,直到猜对为止。while 循环就是那个不断问你、直到你答对的机器人。

常见错误

  • 忘记将 input() 的结果转换为整数(int(...)),导致字符串和整数比较,程序报错。
  • 初始 guess 没有赋值,或者赋的值恰好等于秘密,循环一次也不执行(但概率很小)。
  • 条件写反了:while guess == secret 会变成“猜对才继续”,变成死循环。

小改进:可以加上猜的次数统计:

import random
secret = random.randint(1, 20)
guess = 0
tries = 0                              # 记录猜的次数
while guess != secret:
    guess = int(input("猜一个1-20的数字: "))
    tries = tries + 1                  # 每猜一次增加1
    if guess < secret:
        print("太小了")
    elif guess > secret:
        print("太大了")
print("正确!你猜了", tries, "次。答案是", secret)

四、用循环打印图案——叠出三角形

循环不仅可以算数,还能用来输出有趣的图案。下面用 for 循环打印一个三角形:

for i in range(1, 6):       # i 从1到5
    print("*" * i)          # 重复打印 i 个星号

输出:

*
**
***
****
*****

原理说明
"*" * i 表示把星号字符串重复 i 次,形成一个字符串。第一次 i=1,打印一个星号;第二次 i=2,打印两个星号……最后 i=5,打印五个星号。每一行都比上一行多一个星号,就像搭积木一层层加高。

生活中的类比
就像用积木搭一个三角形:第一排放1块,第二排放2块,……第五排放5块,然后从上往下看就是金字塔形状。

常见错误

  • range(1,6) 写成 range(1,5),会少最后一行。
  • 忘记换行:如果用了 print("*" * i, end=""),所有星号会挤在一行。默认 print 会自动换行,不用修改。
  • 想让三角形倒过来:可以改成 for i in range(5, 0, -1),从5到1递减。

进阶图案:打印一个菱形(需要两个循环,一个递增一个递减),但这里先不展开。

五、循环的常见错误和调试技巧

初学者写循环时容易碰到下面几个坑,记住它们能帮你省下很多时间。

  1. 无限循环
    while 循环的条件永远为 True,没有机会变成 False。比如:

    x = 1
    while x < 10:
        print(x)   # 忘记增加 x,x 永远是1,循环永远不停
    

    解决办法:在循环体内修改循环变量,或者加一个 break 语句。

  2. 循环变量没初始化
    比如 for i in range(10): 没问题,但如果在循环里用 total 却忘记赋初值,会报 NameError。

  3. 索引越界(处理列表时)
    如果用 for i in range(len(scores)) 再通过下标访问,要小心 i 的范围是 0 ~ len-1。如果写成 scores[i+1] 在最后一项会越界。

  4. 忘记缩进
    Python 靠缩进判断循环体。如果把 print 写在循环外面,就会只打印最后一次结果。
    错误示范:

    total = 0
    for i in range(1,101):
        total = total + i
    print(total)   # 这行不在循环里,是正确写法。但如果想让每次循环都打印,就要缩进
    
  5. 条件写反
    在猜数字时 while guess == secret 会进入循环吗?不会,因为一开始 guess=0, secret=7,条件不成立,一次都不执行。应该用 !=

六、完整示例:统计全班成绩

把上面学到的累加、最大值、最小值、平均数结合起来,写一个完整程序,处理全班 6 名同学的成绩。

# 全班成绩列表
scores = [88, 92, 76, 95, 84, 90]

total = 0                     # 总分初始为0
max_score = scores[0]         # 假设第一个是最高分
min_score = scores[0]         # 假设第一个是最低分

for score in scores:
    total = total + score          # 累加总分
    if score > max_score:          # 找最高分
        max_score = score
    if score < min_score:          # 找最低分
        min_score = score

count = len(scores)               # 人数
average = total / count           # 平均分

print("全班成绩统计")
print("最高分:", max_score)
print("最低分:", min_score)
print("平均分:", round(average, 2))  # 保留两位小数
print("总分:", total)

运行输出:

全班成绩统计
最高分: 95
最低分: 76
平均分: 87.5
总分: 525

这个例子只用了一个循环就完成了三项统计(总分、最高、最低)。你也可以加上统计及格人数(分数≥60)等。

七、生活中的更多应用——循环无处不在

  • 自动计算零花钱:如果你每周零花钱增加 5 元,一年后总共得到多少?用循环累加。
  • 排队统计:在游乐园记录每个项目的排队人数,用循环找到最长和最短队伍。
  • 游戏积分:每关得分不同,用循环累加计算总积分。
  • 批量处理文件名:用循环给一堆照片重命名,比如 photo_1.jpg, photo_2.jpg 等。

总结
循环是编程里的“自动重复助手”。遇到需要重复做的事情——不管是算数、比大小、还是输出图案——都可以考虑用 for 或 while 循环。for 循环适合知道次数的情况(比如遍历列表、固定次数的累加),while 循环适合不知道次数、直到条件满足的情况(比如猜数字)。多练习几个例子,你会慢慢发现循环的强大。

下一步学什么?

  • 循环嵌套:在循环里再放一个循环,可以打印更复杂的图案(如乘法表、菱形)。
  • break 和 continue:提前结束循环或跳过某次循环,让循环更灵活。
  • 列表推导式:用一行简洁的代码完成循环生成列表,比如 [x**2 for x in range(10)]
  • while True 循环:无限循环搭配 break 使用,常用于游戏主循环或菜单系统。

掌握了循环,你就拥有了让电脑自动完成大量重复工作的基础能力。继续前进吧!

例题精讲

1单选题

以下哪个代码片段可以正确计算1到100所有整数的和?

Asum = 0; for i in range(100): sum += i
Bsum = 0; for i in range(1,101): sum += i
Csum = 0; for i in range(1,100): sum += i
Dsum = 0; for i in range(101): sum += i
2判断题

用while循环求1到100的和时,循环条件可以写成 while i <= 100: ,其中i初始值为1,每次循环后i加1。

3填空题
以下代码用于找出列表nums中的最大值并打印。请补全代码。\nnums = [23, 45, 6, 78, 12, 89]\nmax_num = nums[0]\nfor x in nums:\n    if x ___ max_num:\n        max_num = x\nprint("最大值是:", max_num)
4单选题

用while循环统计1到50中奇数的个数,下列代码正确的是?

Acount = 0; i = 1; while i <= 50: if i % 2 == 0: count += 1; i += 1
Bcount = 0; i = 1; while i <= 50: if i % 2 == 1: count += 1; i += 1
Ccount = 1; i = 1; while i < 50: if i % 2 != 0: count += 1; i += 1
Dcount = 0; i = 1; while i <= 50: if i % 2 == 1: count += 1; i = i + 2
5填空题
计算n的阶乘(n! = 1×2×3×...×n)。请补全代码。\nn = int(input("请输入一个正整数:"))\nresult = 1\nfor i in range(1, ___):\n    result *= i\nprint(n, "的阶乘是:", result)