[Python教程系列-02] 控制结构与函数:掌握程序流程控制与代码复用

50 阅读10分钟

引言

在上一章中,我们学习了Python的基础语法,包括变量、数据类型和基本运算符。掌握了这些知识后,我们已经能够编写一些简单的程序。然而,这些程序都是按照代码书写的顺序依次执行的,缺乏灵活性和智能性。

在现实世界中,程序往往需要根据不同条件做出不同反应,或者重复执行某些操作直到满足特定条件。这就需要用到程序的控制结构——条件语句和循环语句。此外,当我们需要多次执行相同或相似的任务时,将代码封装成函数可以大大提高开发效率和代码可维护性。

在本章中,我们将深入学习Python中的控制结构和函数,让你能够编写更加智能和高效的程序。

学习目标

完成本章学习后,你将能够:

  1. 理解并使用条件语句(if/elif/else)控制程序执行流程
  2. 掌握for循环和while循环的使用方法
  3. 理解break和continue语句的作用
  4. 学会定义和调用函数
  5. 理解函数参数和返回值的概念
  6. 掌握局部变量和全局变量的区别
  7. 编写结构清晰、逻辑严谨的程序

核心知识点讲解

条件语句

条件语句允许程序根据不同的条件执行不同的代码块。Python使用ifelif(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中的控制结构和函数,这些是编写复杂程序的基础:

  1. 条件语句:使用if/elif/else控制程序分支,让程序能够根据不同条件做出不同反应
  2. 循环语句:for循环用于遍历序列,while循环在条件为真时重复执行
  3. 循环控制:break用于跳出循环,continue用于跳过当前迭代
  4. 函数定义与调用:使用def关键字定义函数,提高代码复用性
  5. 函数参数:包括位置参数、默认参数和关键字参数
  6. 返回值:函数可以返回单个或多个值
  7. 变量作用域:理解局部变量和全局变量的区别

通过实际的代码示例,我们不仅掌握了理论知识,还学会了如何将这些概念应用到实际编程中。控制结构让程序具备了逻辑判断能力,而函数则提高了代码的组织性和可维护性。

在下一章中,我们将学习Python中的数据结构,包括列表、元组、字典和集合,这些是处理复杂数据的重要工具。

练习与挑战

基础练习

  1. 编写一个程序,让用户输入一个数字,判断它是正数、负数还是零。
  2. 创建一个程序,使用for循环打印九九乘法表。
  3. 编写一个函数,接受一个数字列表作为参数,返回列表中的最大值和最小值。
  4. 创建一个简单的计算器函数,接受两个数字和一个操作符(+、-、*、/),返回计算结果。

进阶挑战

  1. 编写一个程序,模拟银行账户管理系统,支持存款、取款、查询余额等功能。
  2. 创建一个文本分析函数,统计一段文本中每个单词出现的次数。
  3. 设计一个简单的图书管理系统,支持添加图书、删除图书、查找图书等功能。
  4. 编写一个函数,实现冒泡排序算法,并用它对一个数字列表进行排序。

思考题

  1. 在什么情况下使用for循环比while循环更合适?
  2. 为什么函数中的局部变量不能在函数外部访问?
  3. 如何合理设计函数的参数,使其既灵活又好用?
  4. 什么时候应该使用全局变量,什么时候应该避免使用?

扩展阅读

  1. Python官方文档 - 控制流 - 官方文档中关于控制流的详细介绍
  2. Python官方文档 - 函数定义 - 函数定义的详细语法说明
  3. 《流畅的Python》- 深入理解Python函数和控制结构的经典书籍
  4. Real Python - Python Functions - 关于Python函数的详细教程
  5. Python for Everybody - Functions - 面向初学者的函数教学

通过本章的学习,你应该已经掌握了Python中的控制结构和函数的基本用法。这些知识将帮助你编写更加复杂和实用的程序。在下一章中,我们将深入了解Python的数据结构,学习如何高效地处理和组织数据。