当前位置: 首页 > java >正文

4.循环结构:让电脑做重复的事情

循环结构:让电脑做重复的事情

🎯 前言:你愿意数1000只羊吗?

想象一下,你的老板让你在一张纸上写1000遍"我不会再迟到了"。😱

作为一个正常人,你肯定会想:“这也太折磨人了吧!有没有什么办法让别人(比如电脑)帮我做这种重复的事情?”

恭喜你,你已经摸到了编程的精髓——让电脑做重复的苦力活

今天我们就来学习Python中的循环结构,让你的电脑变成一个不知疲倦的"复读机"。学完这篇文章,你就能:

  • 🔄 让电脑自动重复执行任务
  • 🎯 精确控制重复的次数和条件
  • 🚀 写出高效简洁的代码
  • 🎪 玩转各种循环的花式用法

📚 目录

  • 🔄 什么是循环?
  • 🔢 for循环:精确控制的重复专家
  • ⚡ while循环:条件驱动的永动机
  • 🎯 range函数:数字生成器
  • 🎪 循环的花式玩法
  • 🛑 循环控制:break和continue
  • 🔁 嵌套循环:循环中的循环
  • 💻 实战项目:打造你的专属工具
  • 🚀 进阶技巧
  • 🔧 常见问题与解决方案

🔄 什么是循环?

循环就像是给电脑安装了一个"自动重复"按钮。想象一下:

# 不用循环的痛苦写法 😭
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
# ... 还有995行...

这样写,你的手指会先投降!

# 使用循环的优雅写法 😎
for i in range(1000):print("我不会再迟到了")

看到了吗?1000行代码瞬间变成了2行!这就是循环的魅力。

🔢 for循环:精确控制的重复专家

for循环就像是一个精确的机器人,你告诉它要重复多少次,它就精确地执行多少次,绝不偷懒!

🎯 基本语法

for 变量 in 序列:要重复执行的代码

这里的"变量"就像是一个计数器,"序列"就是任务清单

🌟 经典例子:数绵羊

# 让电脑帮你数绵羊催眠
for i in range(1, 11):print(f"第{i}只绵羊:咩~ 😴")# 输出:
# 第1只绵羊:咩~ 😴
# 第2只绵羊:咩~ 😴
# ...
# 第10只绵羊:咩~ 😴

🎪 遍历列表:给朋友们群发消息

# 朋友列表
friends = ["小明", "小红", "小华", "小李"]# 给每个朋友发个性化消息
for friend in friends:print(f"嗨,{friend}!周末一起去吃火锅吧!🔥")# 输出:
# 嗨,小明!周末一起去吃火锅吧!🔥
# 嗨,小红!周末一起去吃火锅吧!🔥
# 嗨,小华!周末一起去吃火锅吧!🔥
# 嗨,小李!周末一起去吃火锅吧!🔥

🎵 遍历字符串:逐个字符分析

# 分析你的名字
name = "Python"
for char in name:print(f"字母 '{char}' 的ASCII码是:{ord(char)}")# 输出:
# 字母 'P' 的ASCII码是:80
# 字母 'y' 的ASCII码是:121
# 字母 't' 的ASCII码是:116
# 字母 'h' 的ASCII码是:104
# 字母 'o' 的ASCII码是:111
# 字母 'n' 的ASCII码是:110

⚡ while循环:条件驱动的永动机

while循环就像是一个条件驱动的机器人,只要条件满足,它就会一直工作下去。这家伙可能会永远不停,也可能一次都不执行

🎯 基本语法

while 条件:要重复执行的代码

🎲 经典例子:猜数字游戏

import random# 电脑随机想一个1-100的数字
secret_number = random.randint(1, 100)
guess = 0print("我想了一个1-100的数字,你来猜猜看!")while guess != secret_number:guess = int(input("请输入你的猜测:"))if guess < secret_number:print("太小了!再试试 📈")elif guess > secret_number:print("太大了!再试试 📉")else:print("恭喜你猜对了!🎉")breakprint(f"答案是:{secret_number}")

💰 实用例子:存钱买iPhone

# 存钱计划
target = 8000  # 目标金额
current_money = 0  # 当前存款
month = 0print("开始存钱买iPhone!目标:8000元")while current_money < target:month += 1monthly_saving = 800  # 每月存800元current_money += monthly_savingprint(f"第{month}个月:存了{monthly_saving}元,总共{current_money}元")if current_money >= target:print(f"🎉 恭喜!{month}个月后成功存够钱买iPhone!")

🎯 range函数:数字生成器

range函数就像是一个数字生成器,专门为for循环提供数字序列。

🔢 三种用法

# 1. range(停止值) - 从0开始
for i in range(5):print(i)  # 输出:0, 1, 2, 3, 4# 2. range(开始值, 停止值) - 指定开始
for i in range(2, 8):print(i)  # 输出:2, 3, 4, 5, 6, 7# 3. range(开始值, 停止值, 步长) - 指定步长
for i in range(0, 10, 2):print(i)  # 输出:0, 2, 4, 6, 8

🎪 倒计时效果

print("新年倒计时开始!")
for i in range(10, 0, -1):print(f"{i}...")# 实际使用时可以加上 time.sleep(1) 暂停1秒
print("🎉 新年快乐!")

🎪 循环的花式玩法

🌟 enumerate:带序号的循环

# 购物清单
shopping_list = ["苹果", "香蕉", "橙子", "葡萄"]# 带序号输出
for index, item in enumerate(shopping_list, 1):print(f"{index}. {item}")# 输出:
# 1. 苹果
# 2. 香蕉
# 3. 橙子
# 4. 葡萄

🎯 zip:双重循环

# 学生和成绩
students = ["小明", "小红", "小华"]
scores = [85, 92, 78]# 配对输出
for student, score in zip(students, scores):print(f"{student}的成绩是:{score}分")# 输出:
# 小明的成绩是:85分
# 小红的成绩是:92分
# 小华的成绩是:78分

🎨 列表推导式:高级玩法

# 传统写法
squares = []
for i in range(1, 6):squares.append(i ** 2)# 列表推导式:一行搞定
squares = [i ** 2 for i in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]# 带条件的列表推导式
even_squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(even_squares)  # [4, 16, 36, 64, 100]

🛑 循环控制:break和continue

🚫 break:紧急刹车

# 找到第一个能被7整除的数
for i in range(1, 100):if i % 7 == 0:print(f"找到了!第一个能被7整除的数是:{i}")break  # 立即停止循环print(f"检查数字:{i}")

⏭️ continue:跳过这次

# 打印1-10中的奇数
for i in range(1, 11):if i % 2 == 0:continue  # 跳过偶数print(f"奇数:{i}")

🎯 综合例子:VIP用户识别

users = ["张三", "VIP李四", "王五", "VIP赵六", "钱七"]print("正在检查用户列表...")
for user in users:if user.startswith("VIP"):print(f"🌟 发现VIP用户:{user}")continue  # 跳过后续处理,检查下一个用户if user == "钱七":print("⚠️ 发现问题用户,停止检查")breakprint(f"📝 普通用户:{user}")

🔁 嵌套循环:循环中的循环

嵌套循环就像是俄罗斯套娃,一个循环里面还有一个循环!

🎯 打印乘法表

print("九九乘法表:")
for i in range(1, 10):for j in range(1, i + 1):result = i * jprint(f"{j}×{i}={result}", end="  ")print()  # 换行

🎪 绘制图案

# 打印心形图案
print("用*号绘制心形:")
for i in range(6):for j in range(7):if (i == 0 and j % 3 != 0) or (i == 1 and j % 3 == 0) or (i - j == 2) or (i + j == 8):print("*", end="")else:print(" ", end="")print()

💻 实战项目:打造你的专属工具

🎯 项目1:密码强度检测器

def check_password_strength(password):"""检测密码强度"""score = 0feedback = []# 检查长度if len(password) >= 8:score += 1else:feedback.append("密码长度至少8位")# 检查各种字符类型has_lower = Falsehas_upper = Falsehas_digit = Falsehas_special = Falsefor char in password:if char.islower():has_lower = Trueelif char.isupper():has_upper = Trueelif char.isdigit():has_digit = Trueelif char in "!@#$%^&*()":has_special = Trueif has_lower:score += 1else:feedback.append("需要小写字母")if has_upper:score += 1else:feedback.append("需要大写字母")if has_digit:score += 1else:feedback.append("需要数字")if has_special:score += 1else:feedback.append("需要特殊符号")# 评级if score >= 4:strength = "强 💪"elif score >= 3:strength = "中等 👍"else:strength = "弱 ⚠️"return strength, feedback# 测试密码
test_passwords = ["123456", "Password123", "P@ssw0rd!", "abc"]for pwd in test_passwords:strength, tips = check_password_strength(pwd)print(f"密码'{pwd}'强度:{strength}")if tips:print(f"建议:{', '.join(tips)}")print("-" * 30)

🎯 项目2:个人记账本

class MoneyTracker:def __init__(self):self.records = []def add_record(self, amount, description, category="其他"):"""添加记录"""record = {"amount": amount,"description": description,"category": category}self.records.append(record)print(f"✅ 记录添加成功:{description} {amount}元")def show_summary(self):"""显示统计摘要"""if not self.records:print("还没有任何记录哦!")returntotal_income = 0total_expense = 0print("\n💰 收支明细:")print("-" * 40)for i, record in enumerate(self.records, 1):amount = record["amount"]desc = record["description"]category = record["category"]if amount > 0:total_income += amountprint(f"{i}. 收入:+{amount}元 ({desc}) [{category}]")else:total_expense += abs(amount)print(f"{i}. 支出:{amount}元 ({desc}) [{category}]")print("-" * 40)print(f"总收入:+{total_income}元")print(f"总支出:-{total_expense}元")print(f"余额:{total_income - total_expense}元")def show_by_category(self):"""按分类显示"""if not self.records:print("还没有任何记录哦!")returncategories = {}for record in self.records:category = record["category"]amount = record["amount"]if category not in categories:categories[category] = 0categories[category] += amountprint("\n📊 分类统计:")print("-" * 30)for category, total in categories.items():status = "收入" if total > 0 else "支出"print(f"{category}{total}元 ({status})")# 使用示例
tracker = MoneyTracker()# 添加一些记录
tracker.add_record(5000, "工资", "收入")
tracker.add_record(-500, "房租", "住房")
tracker.add_record(-200, "吃饭", "餐饮")
tracker.add_record(-100, "交通", "出行")
tracker.add_record(200, "兼职", "收入")# 显示统计
tracker.show_summary()
tracker.show_by_category()

🚀 进阶技巧

🎯 生成器表达式:内存友好

# 列表推导式:占用内存
squares_list = [i ** 2 for i in range(1000000)]# 生成器表达式:节省内存
squares_gen = (i ** 2 for i in range(1000000))# 逐个使用,不占用大量内存
for square in squares_gen:if square > 100:print(f"找到第一个大于100的平方数:{square}")break

🎪 itertools:循环工具箱

import itertools# 无限循环
colors = ["红", "黄", "蓝"]
color_cycle = itertools.cycle(colors)# 输出前10个颜色
for i, color in enumerate(color_cycle):if i >= 10:breakprint(f"第{i+1}个颜色:{color}")# 排列组合
numbers = [1, 2, 3]
print("所有排列:")
for perm in itertools.permutations(numbers):print(perm)print("所有组合:")
for combo in itertools.combinations(numbers, 2):print(combo)

🎯 性能优化技巧

# 慢速版本:频繁字符串拼接
def slow_join(items):result = ""for item in items:result += str(item) + " "return result# 快速版本:使用列表和join
def fast_join(items):parts = []for item in items:parts.append(str(item))return " ".join(parts)# 最快版本:生成器表达式
def fastest_join(items):return " ".join(str(item) for item in items)# 测试性能
import timedata = range(10000)# 测试各种方法的速度
start = time.time()
result1 = slow_join(data)
print(f"慢速版本耗时:{time.time() - start:.4f}秒")start = time.time()
result2 = fast_join(data)
print(f"快速版本耗时:{time.time() - start:.4f}秒")start = time.time()
result3 = fastest_join(data)
print(f"最快版本耗时:{time.time() - start:.4f}秒")

🔧 常见问题与解决方案

❓ 问题1:无限循环怎么办?

症状:程序一直运行,停不下来

# 错误示例:忘记更新条件
count = 0
while count < 10:print(count)# 忘记了 count += 1,导致无限循环!

解决方案

# 正确做法:确保条件会改变
count = 0
while count < 10:print(count)count += 1  # 记得更新条件!

❓ 问题2:range的边界问题

症状:总是少一个或多一个

# 想要1-10,但这样只能得到1-9
for i in range(1, 10):print(i)

解决方案

# 记住:range是"左闭右开"区间
for i in range(1, 11):  # 要11才能到10print(i)

❓ 问题3:修改循环中的列表

症状:循环中修改列表导致奇怪行为

# 错误示例:边循环边删除
numbers = [1, 2, 3, 4, 5]
for num in numbers:if num % 2 == 0:numbers.remove(num)  # 危险!

解决方案

# 方法1:倒序循环
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers) - 1, -1, -1):if numbers[i] % 2 == 0:numbers.pop(i)# 方法2:使用列表推导式
numbers = [1, 2, 3, 4, 5]
numbers = [num for num in numbers if num % 2 != 0]

❓ 问题4:嵌套循环的性能问题

症状:程序运行很慢

# 低效的嵌套循环
def find_duplicates_slow(list1, list2):duplicates = []for item1 in list1:for item2 in list2:if item1 == item2:duplicates.append(item1)return duplicates

解决方案

# 使用集合优化
def find_duplicates_fast(list1, list2):set2 = set(list2)  # 先转换为集合duplicates = []for item1 in list1:if item1 in set2:  # 集合查找是O(1)duplicates.append(item1)return duplicates# 更简洁的版本
def find_duplicates_elegant(list1, list2):return list(set(list1) & set(list2))

📖 扩展阅读

📚 推荐资源

  • 官方文档:Python循环语句
  • 在线练习:HackerRank Python练习
  • 可视化工具:Python Tutor - 可视化代码执行过程

🛠️ 实用工具

  • itertools模块:提供各种循环工具
  • collections模块:高性能数据结构
  • time模块:性能测试和延时

🎯 练习项目建议

  1. 文本统计器:统计文本中各个字符的出现频率
  2. 数独验证器:验证数独解答是否正确
  3. 简单爬虫:爬取网页上的特定信息
  4. 文件批处理:批量重命名或处理文件

🎬 下集预告

学会了循环,你已经掌握了让电脑自动化工作的核心技能!但是,当你的代码越来越复杂时,你会发现需要把一些重复的操作打包起来,方便重复使用。

下一篇文章,我们将学习**《函数:把代码打包成工具箱》**,你将学会:

  • 🧰 如何创建自己的函数工具箱
  • 📦 参数和返回值的奥秘
  • 🔄 函数的高级用法和装饰器
  • 🎯 设计优雅的函数接口

想象一下,你不再需要写重复的代码,所有常用的功能都被你打包成了方便的工具,一调用就能用!这是不是很酷?

📝 总结与思考题

🎯 本章重点回顾

  1. for循环:适合已知次数的重复操作
  2. while循环:适合条件驱动的重复操作
  3. range函数:生成数字序列的好帮手
  4. 循环控制:break和continue让循环更灵活
  5. 嵌套循环:处理二维数据的利器
  6. 性能优化:选择合适的数据结构很重要

🤔 思考题

  1. 基础练习

    • 用for循环计算1到100的所有偶数之和
    • 用while循环实现用户输入验证(直到输入正确为止)
    • 用嵌套循环打印一个5×5的星号矩阵
  2. 进阶挑战

    • 实现一个简单的猜词游戏(类似Wordle)
    • 编写一个素数生成器,找出1000以内的所有素数
    • 创建一个文本分析器,统计文章中最常用的10个词
  3. 实际应用

    • 你在日常生活中有哪些重复性的工作可以用循环来自动化?
    • 如何设计一个高效的算法来处理大量数据?
    • 在什么情况下应该选择for循环,什么情况下选择while循环?

🎯 实践作业

作业1:个人日程管理器
创建一个简单的日程管理器,能够:

  • 添加日程安排
  • 显示当天的所有安排
  • 按时间顺序排列
  • 标记已完成的任务

作业2:数字游戏集合
实现以下三个小游戏:

  • 猜数字游戏(已给出基础版本)
  • 石头剪刀布游戏
  • 简单的数学计算练习

作业3:文件处理工具
编写一个工具,能够:

  • 批量重命名文件
  • 统计文件夹中各类型文件的数量
  • 查找包含特定关键词的文件

🎉 恭喜你! 你已经掌握了让电脑自动化工作的核心技能!现在你可以让程序自动处理重复的任务,大大提高工作效率。

记住,好的程序员不是写代码最多的人,而是能让电脑替自己干活的人!💪

下次见面时,我们将学习如何把这些自动化的代码打包成可重用的函数工具箱!🧰

http://www.xdnf.cn/news/15729.html

相关文章:

  • 探秘边缘安全架构设计要点解析
  • Redis 如何保证高并发与高可用
  • 【计算机网络架构】树型架构简介
  • 车载传统ECU---MCU软件架构设计指南
  • Netty网络聊天室及扩展序列化算法
  • 2025年睿抗机器人开发者大赛CAIP-编程技能赛(省赛)-RoboCom 世界机器人开发者大赛-本科组
  • FreeRTOS学习笔记之软件定时器
  • 【初识数据结构】CS61B中的基本图算法:DFS, BFS, Dijkstra, A* 算法及其来历用法
  • Java-77 深入浅出 RPC Dubbo 负载均衡全解析:策略、配置与自定义实现实战
  • CS231n-2017 Lecture3线性分类器笔记
  • 时序数据库选型实战:Apache IoTDB技术深度解析
  • 用逻辑回归(Logistic Regression)处理鸢尾花(iris)数据集
  • 移除debian升级后没用的垃圾
  • 电商商品综合排序:从需求分析到实时计算的全方位指南
  • 鸿蒙与web混合开发双向通信
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)
  • HTTP性能优化实战
  • Matplotlib和Plotly知识点(Dash+Plotly分页展示)
  • Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)
  • Qt笔记整理(1)
  • CCF编程能力等级认证GESP—C++5级—20250628
  • 使用nvm安装node、npm、pnpm以及编译项目教程
  • SpringBoot 3.0 挥别 spring.factories,拥抱云原生新纪元
  • 基于大模型打造故障预警服务器巡检机器人
  • Jetpack Compose中的Modifier:UI元素的装饰与行为扩展
  • 3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)
  • [论文阅读] 软件工程 | 用模糊逻辑“解锁”项目成功:告别非黑即白的评估时代
  • 网络基础DAY13-NAT技术
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于wordcloud库实现词云图
  • OSPF高级特性之Overflow