循环结构:让电脑做重复的事情
🎯 前言:你愿意数1000只羊吗?
想象一下,你的老板让你在一张纸上写1000遍"我不会再迟到了"。😱
作为一个正常人,你肯定会想:"这也太折磨人了吧!有没有什么办法让别人(比如电脑)帮我做这种重复的事情?"
恭喜你,你已经摸到了编程的精髓------让电脑做重复的苦力活!
今天我们就来学习Python中的循环结构,让你的电脑变成一个不知疲倦的"复读机"。学完这篇文章,你就能:
- 🔄 让电脑自动重复执行任务
- 🎯 精确控制重复的次数和条件
- 🚀 写出高效简洁的代码
- 🎪 玩转各种循环的花式用法
📚 目录
- 🔄 什么是循环?
- 🔢 for循环:精确控制的重复专家
- ⚡ while循环:条件驱动的永动机
- 🎯 range函数:数字生成器
- 🎪 循环的花式玩法
- 🛑 循环控制:break和continue
- 🔁 嵌套循环:循环中的循环
- 💻 实战项目:打造你的专属工具
- 🚀 进阶技巧
- 🔧 常见问题与解决方案
🔄 什么是循环?
循环就像是给电脑安装了一个"自动重复"按钮。想象一下:
python
# 不用循环的痛苦写法 😭
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
print("我不会再迟到了")
# ... 还有995行...
这样写,你的手指会先投降!
python
# 使用循环的优雅写法 😎
for i in range(1000):
print("我不会再迟到了")
看到了吗?1000行代码瞬间变成了2行!这就是循环的魅力。
🔢 for循环:精确控制的重复专家
for循环就像是一个精确的机器人,你告诉它要重复多少次,它就精确地执行多少次,绝不偷懒!
🎯 基本语法
python
for 变量 in 序列:
要重复执行的代码
这里的"变量"就像是一个计数器 ,"序列"就是任务清单。
🌟 经典例子:数绵羊
python
# 让电脑帮你数绵羊催眠
for i in range(1, 11):
print(f"第{i}只绵羊:咩~ 😴")
# 输出:
# 第1只绵羊:咩~ 😴
# 第2只绵羊:咩~ 😴
# ...
# 第10只绵羊:咩~ 😴
🎪 遍历列表:给朋友们群发消息
python
# 朋友列表
friends = ["小明", "小红", "小华", "小李"]
# 给每个朋友发个性化消息
for friend in friends:
print(f"嗨,{friend}!周末一起去吃火锅吧!🔥")
# 输出:
# 嗨,小明!周末一起去吃火锅吧!🔥
# 嗨,小红!周末一起去吃火锅吧!🔥
# 嗨,小华!周末一起去吃火锅吧!🔥
# 嗨,小李!周末一起去吃火锅吧!🔥
🎵 遍历字符串:逐个字符分析
python
# 分析你的名字
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循环就像是一个条件驱动的机器人 ,只要条件满足,它就会一直工作下去。这家伙可能会永远不停 ,也可能一次都不执行!
🎯 基本语法
python
while 条件:
要重复执行的代码
🎲 经典例子:猜数字游戏
python
import random
# 电脑随机想一个1-100的数字
secret_number = random.randint(1, 100)
guess = 0
print("我想了一个1-100的数字,你来猜猜看!")
while guess != secret_number:
guess = int(input("请输入你的猜测:"))
if guess < secret_number:
print("太小了!再试试 📈")
elif guess > secret_number:
print("太大了!再试试 📉")
else:
print("恭喜你猜对了!🎉")
break
print(f"答案是:{secret_number}")
💰 实用例子:存钱买iPhone
python
# 存钱计划
target = 8000 # 目标金额
current_money = 0 # 当前存款
month = 0
print("开始存钱买iPhone!目标:8000元")
while current_money < target:
month += 1
monthly_saving = 800 # 每月存800元
current_money += monthly_saving
print(f"第{month}个月:存了{monthly_saving}元,总共{current_money}元")
if current_money >= target:
print(f"🎉 恭喜!{month}个月后成功存够钱买iPhone!")
🎯 range函数:数字生成器
range函数就像是一个数字生成器,专门为for循环提供数字序列。
🔢 三种用法
python
# 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
🎪 倒计时效果
python
print("新年倒计时开始!")
for i in range(10, 0, -1):
print(f"{i}...")
# 实际使用时可以加上 time.sleep(1) 暂停1秒
print("🎉 新年快乐!")
🎪 循环的花式玩法
🌟 enumerate:带序号的循环
python
# 购物清单
shopping_list = ["苹果", "香蕉", "橙子", "葡萄"]
# 带序号输出
for index, item in enumerate(shopping_list, 1):
print(f"{index}. {item}")
# 输出:
# 1. 苹果
# 2. 香蕉
# 3. 橙子
# 4. 葡萄
🎯 zip:双重循环
python
# 学生和成绩
students = ["小明", "小红", "小华"]
scores = [85, 92, 78]
# 配对输出
for student, score in zip(students, scores):
print(f"{student}的成绩是:{score}分")
# 输出:
# 小明的成绩是:85分
# 小红的成绩是:92分
# 小华的成绩是:78分
🎨 列表推导式:高级玩法
python
# 传统写法
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:紧急刹车
python
# 找到第一个能被7整除的数
for i in range(1, 100):
if i % 7 == 0:
print(f"找到了!第一个能被7整除的数是:{i}")
break # 立即停止循环
print(f"检查数字:{i}")
⏭️ continue:跳过这次
python
# 打印1-10中的奇数
for i in range(1, 11):
if i % 2 == 0:
continue # 跳过偶数
print(f"奇数:{i}")
🎯 综合例子:VIP用户识别
python
users = ["张三", "VIP李四", "王五", "VIP赵六", "钱七"]
print("正在检查用户列表...")
for user in users:
if user.startswith("VIP"):
print(f"🌟 发现VIP用户:{user}")
continue # 跳过后续处理,检查下一个用户
if user == "钱七":
print("⚠️ 发现问题用户,停止检查")
break
print(f"📝 普通用户:{user}")
🔁 嵌套循环:循环中的循环
嵌套循环就像是俄罗斯套娃,一个循环里面还有一个循环!
🎯 打印乘法表
python
print("九九乘法表:")
for i in range(1, 10):
for j in range(1, i + 1):
result = i * j
print(f"{j}×{i}={result}", end=" ")
print() # 换行
🎪 绘制图案
python
# 打印心形图案
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:密码强度检测器
python
def check_password_strength(password):
"""检测密码强度"""
score = 0
feedback = []
# 检查长度
if len(password) >= 8:
score += 1
else:
feedback.append("密码长度至少8位")
# 检查各种字符类型
has_lower = False
has_upper = False
has_digit = False
has_special = False
for char in password:
if char.islower():
has_lower = True
elif char.isupper():
has_upper = True
elif char.isdigit():
has_digit = True
elif char in "!@#$%^&*()":
has_special = True
if has_lower:
score += 1
else:
feedback.append("需要小写字母")
if has_upper:
score += 1
else:
feedback.append("需要大写字母")
if has_digit:
score += 1
else:
feedback.append("需要数字")
if has_special:
score += 1
else:
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:个人记账本
python
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("还没有任何记录哦!")
return
total_income = 0
total_expense = 0
print("\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 += amount
print(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("还没有任何记录哦!")
return
categories = {}
for record in self.records:
category = record["category"]
amount = record["amount"]
if category not in categories:
categories[category] = 0
categories[category] += amount
print("\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()
🚀 进阶技巧
🎯 生成器表达式:内存友好
python
# 列表推导式:占用内存
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:循环工具箱
python
import itertools
# 无限循环
colors = ["红", "黄", "蓝"]
color_cycle = itertools.cycle(colors)
# 输出前10个颜色
for i, color in enumerate(color_cycle):
if i >= 10:
break
print(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)
🎯 性能优化技巧
python
# 慢速版本:频繁字符串拼接
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 time
data = 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:无限循环怎么办?
症状:程序一直运行,停不下来
python
# 错误示例:忘记更新条件
count = 0
while count < 10:
print(count)
# 忘记了 count += 1,导致无限循环!
解决方案:
python
# 正确做法:确保条件会改变
count = 0
while count < 10:
print(count)
count += 1 # 记得更新条件!
❓ 问题2:range的边界问题
症状:总是少一个或多一个
python
# 想要1-10,但这样只能得到1-9
for i in range(1, 10):
print(i)
解决方案:
python
# 记住:range是"左闭右开"区间
for i in range(1, 11): # 要11才能到10
print(i)
❓ 问题3:修改循环中的列表
症状:循环中修改列表导致奇怪行为
python
# 错误示例:边循环边删除
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num % 2 == 0:
numbers.remove(num) # 危险!
解决方案:
python
# 方法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:嵌套循环的性能问题
症状:程序运行很慢
python
# 低效的嵌套循环
def find_duplicates_slow(list1, list2):
duplicates = []
for item1 in list1:
for item2 in list2:
if item1 == item2:
duplicates.append(item1)
return duplicates
解决方案:
python
# 使用集合优化
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模块:性能测试和延时
🎯 练习项目建议
- 文本统计器:统计文本中各个字符的出现频率
- 数独验证器:验证数独解答是否正确
- 简单爬虫:爬取网页上的特定信息
- 文件批处理:批量重命名或处理文件
🎬 下集预告
学会了循环,你已经掌握了让电脑自动化工作的核心技能!但是,当你的代码越来越复杂时,你会发现需要把一些重复的操作打包起来,方便重复使用。
下一篇文章,我们将学习**《函数:把代码打包成工具箱》**,你将学会:
- 🧰 如何创建自己的函数工具箱
- 📦 参数和返回值的奥秘
- 🔄 函数的高级用法和装饰器
- 🎯 设计优雅的函数接口
想象一下,你不再需要写重复的代码,所有常用的功能都被你打包成了方便的工具,一调用就能用!这是不是很酷?
📝 总结与思考题
🎯 本章重点回顾
- for循环:适合已知次数的重复操作
- while循环:适合条件驱动的重复操作
- range函数:生成数字序列的好帮手
- 循环控制:break和continue让循环更灵活
- 嵌套循环:处理二维数据的利器
- 性能优化:选择合适的数据结构很重要
🤔 思考题
-
基础练习:
- 用for循环计算1到100的所有偶数之和
- 用while循环实现用户输入验证(直到输入正确为止)
- 用嵌套循环打印一个5×5的星号矩阵
-
进阶挑战:
- 实现一个简单的猜词游戏(类似Wordle)
- 编写一个素数生成器,找出1000以内的所有素数
- 创建一个文本分析器,统计文章中最常用的10个词
-
实际应用:
- 你在日常生活中有哪些重复性的工作可以用循环来自动化?
- 如何设计一个高效的算法来处理大量数据?
- 在什么情况下应该选择for循环,什么情况下选择while循环?
🎯 实践作业
作业1:个人日程管理器
创建一个简单的日程管理器,能够:
- 添加日程安排
- 显示当天的所有安排
- 按时间顺序排列
- 标记已完成的任务
作业2:数字游戏集合
实现以下三个小游戏:
- 猜数字游戏(已给出基础版本)
- 石头剪刀布游戏
- 简单的数学计算练习
作业3:文件处理工具
编写一个工具,能够:
- 批量重命名文件
- 统计文件夹中各类型文件的数量
- 查找包含特定关键词的文件
🎉 恭喜你! 你已经掌握了让电脑自动化工作的核心技能!现在你可以让程序自动处理重复的任务,大大提高工作效率。
记住,好的程序员不是写代码最多的人,而是能让电脑替自己干活的人!💪
下次见面时,我们将学习如何把这些自动化的代码打包成可重用的函数工具箱!🧰