引言
在上一章中,我们学习了Python的基础语法,包括变量、数据类型和基本运算符。掌握了这些知识后,我们已经能够编写一些简单的程序。然而,这些程序都是按照代码书写的顺序依次执行的,缺乏灵活性和智能性。
在现实世界中,程序往往需要根据不同条件做出不同反应,或者重复执行某些操作直到满足特定条件。这就需要用到程序的控制结构——条件语句和循环语句。此外,当我们需要多次执行相同或相似的任务时,将代码封装成函数可以大大提高开发效率和代码可维护性。
在本章中,我们将深入学习Python中的控制结构和函数,让你能够编写更加智能和高效的程序。
学习目标
完成本章学习后,你将能够:
- 理解并使用条件语句(if/elif/else)控制程序执行流程
- 掌握for循环和while循环的使用方法
- 理解break和continue语句的作用
- 学会定义和调用函数
- 理解函数参数和返回值的概念
- 掌握局部变量和全局变量的区别
- 编写结构清晰、逻辑严谨的程序
核心知识点讲解
条件语句
条件语句允许程序根据不同的条件执行不同的代码块。Python使用if、elif(else if的缩写)和else关键字来实现条件控制。
基本if语句
age = 18
if age >= 18:
print("你已经成年了")
在这个例子中,只有当age >= 18为真时,才会执行缩进的代码块。
if-else语句
age = 16
if age >= 18:
print("你已经成年了")
else:
print("你还未成年")
如果条件为真,执行if后面的代码块;否则执行else后面的代码块。
if-elif-else语句
当需要检查多个条件时,可以使用elif:
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"你的成绩等级是: {grade}")
程序会从上到下依次检查每个条件,一旦找到为真的条件,就执行对应的代码块,并跳过后续的条件检查。
嵌套条件语句
条件语句可以嵌套使用:
age = 25
has_license = True
if age >= 18:
if has_license:
print("你可以合法驾驶")
else:
print("你需要考取驾照")
else:
print("你还未成年,不能驾驶")
循环语句
循环语句允许我们重复执行一段代码,直到满足某个条件为止。
for循环
for循环通常用于遍历序列(如列表、字符串等)或其他可迭代对象:
# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 遍历字符串
word = "Python"
for letter in word:
print(letter)
# 使用range()函数
for i in range(5):
print(f"第{i+1}次循环")
range()函数常用于生成一系列数字:
range(n):生成从0到n-1的数字序列range(start, stop):生成从start到stop-1的数字序列range(start, stop, step):生成从start开始,步长为step的数字序列
# range的不同用法
for i in range(3, 8):
print(i) # 输出: 3, 4, 5, 6, 7
for i in range(0, 10, 2):
print(i) # 输出: 0, 2, 4, 6, 8
while循环
while循环会在条件为真时持续执行代码块:
count = 1
while count <= 5:
print(f"计数: {count}")
count += 1 # 等同于 count = count + 1
需要注意避免无限循环,确保循环条件最终会变为假。
break和continue语句
break:立即退出循环continue:跳过当前循环的剩余部分,直接进入下一次循环
# 使用break
for i in range(10):
if i == 5:
break
print(i) # 输出: 0, 1, 2, 3, 4
# 使用continue
for i in range(10):
if i % 2 == 0:
continue
print(i) # 输出: 1, 3, 5, 7, 9
函数
函数是一段可重复使用的代码块,它可以接收输入参数并返回结果。使用函数可以提高代码的模块化程度和可维护性。
定义函数
使用def关键字定义函数:
def greet():
print("你好,欢迎学习Python!")
# 调用函数
greet()
函数参数
函数可以接收参数,使它们更加灵活:
def greet(name):
print(f"你好,{name}!欢迎学习Python!")
greet("张三") # 输出: 你好,张三!欢迎学习Python!
可以定义多个参数:
def introduce(name, age):
print(f"我叫{name},今年{age}岁")
introduce("李四", 25)
默认参数
可以为参数设置默认值:
def greet(name, greeting="你好"):
print(f"{greeting},{name}!")
greet("王五") # 输出: 你好,王五!
greet("赵六", "欢迎") # 输出: 欢迎,赵六!
关键字参数
调用函数时可以使用关键字参数,这样不需要按照定义时的顺序:
def introduce(name, age, city):
print(f"我叫{name},今年{age}岁,来自{city}")
introduce(age=30, city="北京", name="孙七")
返回值
函数可以使用return语句返回值:
def add(a, b):
return a + b
result = add(5, 3)
print(result) # 输出: 8
函数可以返回多个值:
def calculate(a, b):
sum_result = a + b
diff_result = a - b
return sum_result, diff_result
sum_val, diff_val = calculate(10, 3)
print(f"和: {sum_val}, 差: {diff_val}") # 输出: 和: 13, 差: 7
局部变量与全局变量
在函数内部定义的变量是局部变量,只在函数内部有效:
x = 10 # 全局变量
def my_function():
y = 5 # 局部变量
print(f"函数内部: x={x}, y={y}")
my_function()
print(f"函数外部: x={x}") # 可以访问全局变量
# print(y) # 这会报错,因为y是局部变量
如果要在函数内部修改全局变量,需要使用global关键字:
count = 0
def increment():
global count
count += 1
increment()
print(count) # 输出: 1
代码示例与实战
示例1:成绩评级系统
def get_grade(score):
"""根据分数返回成绩等级"""
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"
def main():
"""主程序"""
print("=== 成绩评级系统 ===")
while True:
try:
score = float(input("请输入分数(输入-1退出): "))
if score == -1:
print("谢谢使用!")
break
elif 0 <= score <= 100:
grade = get_grade(score)
print(f"分数: {score}, 等级: {grade}\n")
else:
print("请输入0-100之间的分数\n")
except ValueError:
print("请输入有效的数字\n")
# 运行程序
if __name__ == "__main__":
main()
示例2:猜数字游戏
import random
def generate_number():
"""生成1-100之间的随机数"""
return random.randint(1, 100)
def play_game():
"""玩游戏的主要逻辑"""
secret_number = generate_number()
attempts = 0
max_attempts = 7
print("=== 猜数字游戏 ===")
print("我想了一个1-100之间的数字,你有7次机会猜中它!")
while attempts < max_attempts:
try:
guess = int(input(f"第{attempts + 1}次猜测,请输入你的数字: "))
attempts += 1
if guess == secret_number:
print(f"恭喜你!你用了{attempts}次猜中了数字{secret_number}!")
return True
elif guess < secret_number:
print("太小了!")
else:
print("太大了!")
print(f"还有{max_attempts - attempts}次机会\n")
except ValueError:
print("请输入一个有效的数字!")
attempts -= 1 # 无效输入不计入尝试次数
print(f"很遗憾,你没有猜中。正确答案是{secret_number}")
return False
def main():
"""主程序"""
while True:
play_game()
play_again = input("是否再玩一次?(y/n): ").lower()
if play_again != 'y':
print("谢谢游戏!再见!")
break
# 运行程序
if __name__ == "__main__":
main()
示例3:购物清单管理器
def add_item(shopping_list, item):
"""添加商品到购物清单"""
shopping_list.append(item)
print(f"已添加: {item}")
def remove_item(shopping_list, item):
"""从购物清单中移除商品"""
if item in shopping_list:
shopping_list.remove(item)
print(f"已移除: {item}")
else:
print(f"购物清单中没有: {item}")
def display_list(shopping_list):
"""显示购物清单"""
if shopping_list:
print("\n=== 购物清单 ===")
for i, item in enumerate(shopping_list, 1):
print(f"{i}. {item}")
print("==================\n")
else:
print("购物清单为空\n")
def main():
"""主程序"""
shopping_list = []
while True:
print("=== 购物清单管理器 ===")
print("1. 添加商品")
print("2. 移除商品")
print("3. 显示清单")
print("4. 退出")
choice = input("请选择操作 (1-4): ")
if choice == "1":
item = input("请输入要添加的商品: ")
add_item(shopping_list, item)
elif choice == "2":
item = input("请输入要移除的商品: ")
remove_item(shopping_list, item)
elif choice == "3":
display_list(shopping_list)
elif choice == "4":
print("谢谢使用!")
break
else:
print("无效选择,请重新输入\n")
# 运行程序
if __name__ == "__main__":
main()
小结与回顾
在本章中,我们深入学习了Python中的控制结构和函数,这些是编写复杂程序的基础:
- 条件语句:使用if/elif/else控制程序分支,让程序能够根据不同条件做出不同反应
- 循环语句:for循环用于遍历序列,while循环在条件为真时重复执行
- 循环控制:break用于跳出循环,continue用于跳过当前迭代
- 函数定义与调用:使用def关键字定义函数,提高代码复用性
- 函数参数:包括位置参数、默认参数和关键字参数
- 返回值:函数可以返回单个或多个值
- 变量作用域:理解局部变量和全局变量的区别
通过实际的代码示例,我们不仅掌握了理论知识,还学会了如何将这些概念应用到实际编程中。控制结构让程序具备了逻辑判断能力,而函数则提高了代码的组织性和可维护性。
在下一章中,我们将学习Python中的数据结构,包括列表、元组、字典和集合,这些是处理复杂数据的重要工具。
练习与挑战
基础练习
- 编写一个程序,让用户输入一个数字,判断它是正数、负数还是零。
- 创建一个程序,使用for循环打印九九乘法表。
- 编写一个函数,接受一个数字列表作为参数,返回列表中的最大值和最小值。
- 创建一个简单的计算器函数,接受两个数字和一个操作符(+、-、*、/),返回计算结果。
进阶挑战
- 编写一个程序,模拟银行账户管理系统,支持存款、取款、查询余额等功能。
- 创建一个文本分析函数,统计一段文本中每个单词出现的次数。
- 设计一个简单的图书管理系统,支持添加图书、删除图书、查找图书等功能。
- 编写一个函数,实现冒泡排序算法,并用它对一个数字列表进行排序。
思考题
- 在什么情况下使用for循环比while循环更合适?
- 为什么函数中的局部变量不能在函数外部访问?
- 如何合理设计函数的参数,使其既灵活又好用?
- 什么时候应该使用全局变量,什么时候应该避免使用?
扩展阅读
- Python官方文档 - 控制流 - 官方文档中关于控制流的详细介绍
- Python官方文档 - 函数定义 - 函数定义的详细语法说明
- 《流畅的Python》- 深入理解Python函数和控制结构的经典书籍
- Real Python - Python Functions - 关于Python函数的详细教程
- Python for Everybody - Functions - 面向初学者的函数教学
通过本章的学习,你应该已经掌握了Python中的控制结构和函数的基本用法。这些知识将帮助你编写更加复杂和实用的程序。在下一章中,我们将深入了解Python的数据结构,学习如何高效地处理和组织数据。