CS 教程 · 第 08 章

编程入门:Python

变量 / 条件 / 循环 / 函数

编程不是魔法,是用逻辑描述世界——就从 Python 开始。

Python 是当今最受欢迎的编程语言之一。它语法简洁、生态丰富,被广泛应用于 Web 开发、数据分析、人工智能、自动化运维等领域。本章将从零开始,带你走进编程世界。


8.1 为什么选择 Python?

Python 的优势

1. 语法简洁,接近自然语言

# Python
for name in ['张三', '李四', '王五']:
    print(f'你好,{name}!')

# Java(同样的功能)
for (String name : Arrays.asList("张三", "李四", "王五")) {
    System.out.println("你好," + name + "!");
}

2. "电池自带"——标准库丰富,开箱即用

3. 社区生态巨大——PyPI 上有超过 40 万个第三方包

4. 多范式编程——支持面向对象、函数式、过程式编程

5. 跨平台——Windows、macOS、Linux 均可运行

6. 学习曲线平缓——适合编程初学者

Python 的劣势(诚实地说)


8.2 安装与环境配置

安装 Python

Linux/macOS:

# Ubuntu/Debian
sudo apt update && sudo apt install python3 python3-pip

# macOS(使用 Homebrew)
brew install python3

Windows:

访问 [python.org](https://python.org) 下载安装包,勾选 "Add Python to PATH"

验证安装

python3 --version
# Python 3.11.5

pip3 --version
# pip 23.2.1

第一个程序

# hello.py
print("Hello, World!")
python3 hello.py
# 输出:Hello, World!

推荐工具

# 创建虚拟环境
python3 -m venv myproject-env

# 激活
source myproject-env/bin/activate  # Linux/macOS
myproject-env\Scripts\activate     # Windows

# 退出
deactivate

8.3 变量与数据类型

基本数据类型

# 数字
age = 25                    # 整数(int)
price = 19.99               # 浮点数(float)
is_large = 100_000_000      # 可以用下划线分隔,便于阅读

# 字符串
name = "张三"               # 双引号
greeting = '你好'           # 单引号也行
message = f"{name}今年{age}岁"  # f-string(推荐!)
# 输出:张三今年25岁

multi_line = """
这是多行
字符串
"""

# 布尔值
is_student = True
has_job = False

# 空值
result = None

类型转换

number_str = "123"
number = int(number_str)       # "123" → 123

price_str = "19.99"
price = float(price_str)       # "19.99" → 19.99

num = 42
num_str = str(num)             # 42 → "42"

# 常见的坑
print(int("3.14"))             # 报错!不能直接转
print(int(float("3.14")))      # 3,两步转换

检查类型

print(type(42))        # 
print(type("hello"))   # 
print(isinstance(42, int))  # True(推荐的检查方式)

8.4 条件判断:if/elif/else

age = 18

if age < 13:
    print("儿童")
elif age < 18:
    print("青少年")
elif age < 60:
    print("成年人")
else:
    print("老年人")

# 条件表达式(三元运算符)
status = "成年" if age >= 18 else "未成年"

# 逻辑运算符
is_weekend = True
weather_good = True

if is_weekend and weather_good:
    print("去郊游!")
elif is_weekend or weather_good:
    print("可以出去走走")
else:
    print("宅家里")

# not 取反
if not is_weekend:
    print("工作日,该上班了")

比较运算符

运算符 含义 示例
`==` 等于 `x == 5`
`!=` 不等于 `x != 5`
`>` `<` 大于/小于 `x > 5`
`>=` `<=` 大于等于/小于等于 `x >= 5`
`in` 包含 `'a' in 'abc'`
`is` 身份比较 `x is None`
⚠️ `==` 比较是否相等,`is` 比较是否为同一对象。检查 None 时用 `is None` 而不是 `== None`。

8.5 循环:for 与 while

for 循环

Python 的 for 循环遍历可迭代对象:

# 遍历列表
fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
    print(f"我喜欢吃{fruit}")

# range() 生成数字序列
for i in range(5):           # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 6):        # 2, 3, 4, 5
    print(i)

for i in range(0, 10, 2):    # 0, 2, 4, 6, 8(步长为2)
    print(i)

# enumerate():同时获取索引和值
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

# zip():同时遍历多个序列
names = ["张三", "李四"]
scores = [90, 85]
for name, score in zip(names, scores):
    print(f"{name}考了{score}分")

while 循环

count = 0
while count < 5:
    print(f"计数: {count}")
    count += 1

# 无限循环 + break 退出
while True:
    user_input = input("输入 'quit' 退出: ")
    if user_input == "quit":
        break      # 跳出循环
    print(f"你输入了: {user_input}")

# continue 跳过本次循环
for i in range(10):
    if i % 2 == 0:
        continue   # 跳过偶数
    print(i)       # 只打印奇数:1, 3, 5, 7, 9

for-else:Python 独有特性

# else 块在循环正常结束(未被 break 中断)时执行
for i in range(5):
    if i == 10:
        break
else:
    print("循环正常结束,没有找到 10")  # 会执行

# 实际应用:查找元素
items = [1, 3, 5, 7]
for item in items:
    if item == 2:
        print("找到了!")
        break
else:
    print("没找到 2")  # 会执行

8.6 函数

定义与调用

def greet(name, greeting="你好"):
    """向指定的人打招呼(这是文档字符串)"""
    return f"{greeting},{name}!"

# 调用
print(greet("张三"))                    # 你好,张三!
print(greet("李四", greeting="早上好"))  # 早上好,李四!
print(greet(greeting="嗨", name="王五")) # 嗨,王五!(关键字参数)

参数类型

# 默认参数值
def create_user(name, role="user", active=True):
    return {"name": name, "role": role, "active": active}

print(create_user("张三"))
# {'name': '张三', 'role': 'user', 'active': True}

print(create_user("李四", role="admin"))
# {'name': '李四', 'role': 'admin', 'active': True}

# 可变参数 (*args) —— 接收任意数量的位置参数
def sum_all(*numbers):
    return sum(numbers)

print(sum_all(1, 2, 3, 4))  # 10
print(sum_all(10, 20))      # 30

# 关键字可变参数 (**kwargs) —— 接收任意数量的关键字参数
def build_profile(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

build_profile(name="张三", age=25, city="北京")
# name: 张三
# age: 25
# city: 北京

作用域

# LEGB 规则:Local → Enclosing → Global → Built-in

x = "全局变量"          # 全局作用域

def outer():
    x = "外层函数变量"   # 封闭作用域

    def inner():
        x = "内层函数变量"  # 局部作用域
        print(x)            # 内层函数变量

    inner()
    print(x)               # 外层函数变量

outer()
print(x)                   # 全局变量

# 在函数内修改全局变量(慎用)
count = 0

def increment():
    global count
    count += 1

Lambda 表达式

# 匿名函数,用于简单的单行函数
square = lambda x: x ** 2
print(square(5))  # 25

# 常用于排序
students = [
    {"name": "张三", "score": 85},
    {"name": "李四", "score": 92},
    {"name": "王五", "score": 78},
]
sorted_students = sorted(students, key=lambda s: s["score"], reverse=True)
print(sorted_students)
# [{'name': '李四', 'score': 92}, {'name': '张三', 'score': 85}, ...]

8.7 核心数据结构

列表(List)

# 创建
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]    # 可以混合类型
empty = []

# 索引和切片
print(numbers[0])       # 1(第一个)
print(numbers[-1])      # 5(最后一个)
print(numbers[1:3])     # [2, 3](切片:[start:end),不包括 end)
print(numbers[::2])     # [1, 3, 5](步长为2)
print(numbers[::-1])    # [5, 4, 3, 2, 1](反转)

# 常用操作
numbers.append(6)       # 末尾添加: [1, 2, 3, 4, 5, 6]
numbers.insert(0, 0)    # 指定位置插入:[0, 1, 2, 3, 4, 5, 6]
numbers.pop()           # 移除并返回末尾元素
numbers.pop(0)          # 移除并返回索引0的元素
numbers.remove(3)       # 移除第一个值为3的元素

# 列表推导式(Pythonic 写法!)
squares = [x ** 2 for x in range(10)]      # [0, 1, 4, 9, ..., 81]
evens = [x for x in range(10) if x % 2 == 0]  # [0, 2, 4, 6, 8]

# 遍历
for num in numbers:
    print(num)

元组(Tuple)

# 不可变的序列,创建后不能修改
point = (3, 4)
rgb = (255, 128, 0)
single_item = (42,)      # 单元素元组必须加逗号!

# 解包(Unpacking)
x, y = point
print(x, y)  # 3 4

# 交换变量(Python 独有技巧)
a, b = 10, 20
a, b = b, a
print(a, b)  # 20 10

# 函数返回多个值(实际返回元组)
def get_user():
    return "张三", 25, "北京"

name, age, city = get_user()
print(name, age, city)  # 张三 25 北京

字典(Dict)

# 创建
user = {
    "name": "张三",
    "age": 25,
    "city": "北京"
}

# 访问
print(user["name"])         # 张三(键不存在会报错)
print(user.get("name"))     # 张三
print(user.get("email", "未知"))  # 未知(不存在时返回默认值)

# 修改
user["email"] = "zhangsan@example.com"  # 添加
user["age"] = 26                        # 修改
del user["city"]                        # 删除

# 遍历
for key, value in user.items():
    print(f"{key}: {value}")

# 字典推导式
squares_dict = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 常用方法
keys = user.keys()        # 所有键
values = user.values()    # 所有值
user.update({"phone": "13800138000"})  # 批量更新
💡 选择建议:频繁索引用列表,键值查找用字典,需要不可变集合用元组,需要去重用集合(set)

8.8 文件读写

# 写入文件
with open("example.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")
    f.write("第二行\n")
print("文件已写入")

# 读取文件
with open("example.txt", "r", encoding="utf-8") as f:
    content = f.read()          # 读取全部
    print(content)

with open("example.txt", "r", encoding="utf-8") as f:
    for line in f:              # 逐行读取(推荐,节省内存)
        print(line.strip())     # strip() 去掉换行符

# 追加模式
with open("example.txt", "a", encoding="utf-8") as f:
    f.write("追加的一行\n")

文件模式:

模式 含义 文件不存在时
`r` 只读 报错
`w` 写入(覆盖) 创建
`a` 追加 创建
`r+` 读写 报错
`b` 二进制模式
⚠️ 始终使用 `with` 语句打开文件——它会自动关闭文件,即使发生异常也不会忘记。

8.9 简单项目

项目一:命令行计算器

def calculator():
    """简单的命令行计算器"""
    print("=== 简易计算器 ===")
    print("支持的运算:+ - * /")
    print("输入 'quit' 退出\n")

    while True:
        expr = input("请输入表达式(如 3 + 5):").strip()

        if expr.lower() == "quit":
            print("再见!")
            break

        # 简单解析
        parts = expr.split()
        if len(parts) != 3:
            print("格式错误!请使用:数字 运算符 数字")
            continue

        try:
            num1 = float(parts[0])
            op = parts[1]
            num2 = float(parts[2])

            if op == "+":
                result = num1 + num2
            elif op == "-":
                result = num1 - num2
            elif op == "*":
                result = num1 * num2
            elif op == "/":
                if num2 == 0:
                    print("错误:不能除以零!")
                    continue
                result = num1 / num2
            else:
                print(f"不支持的运算符:{op}")
                continue

            print(f"结果:{result}\n")

        except ValueError:
            print("请输入有效的数字!")

if __name__ == "__main__":
    calculator()

项目二:待办清单(Todo List)

import json
import os
from datetime import datetime

TODO_FILE = "todos.json"

def load_todos():
    """从文件加载待办事项"""
    if os.path.exists(TODO_FILE):
        with open(TODO_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    return []

def save_todos(todos):
    """保存待办事项到文件"""
    with open(TODO_FILE, "w", encoding="utf-8") as f:
        json.dump(todos, f, ensure_ascii=False, indent=2)

def show_todos(todos):
    """显示所有待办事项"""
    if not todos:
        print("\n🎉 没有待办事项!\n")
        return

    print("\n📋 待办清单:")
    for i, todo in enumerate(todos, 1):
        status = "✅" if todo["done"] else "⬜"
        print(f"  {i}. {status} {todo['title']}")
        print(f"     创建于:{todo['created_at']}")
    print()

def add_todo(todos):
    """添加待办事项"""
    title = input("输入待办事项:").strip()
    if not title:
        print("内容不能为空!")
        return

    todos.append({
        "title": title,
        "done": False,
        "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    })
    save_todos(todos)
    print(f"✅ 已添加:{title}\n")

def mark_done(todos):
    """标记为已完成"""
    show_todos(todos)
    try:
        num = int(input("输入要标记完成的项目编号:"))
        if 1 <= num <= len(todos):
            todos[num - 1]["done"] = not todos[num - 1]["done"]
            status = "完成" if todos[num - 1]["done"] else "未完成"
            save_todos(todos)
            print(f"✅ 已标记为:{status}\n")
        else:
            print("编号无效!")
    except ValueError:
        print("请输入有效数字!")

def delete_todo(todos):
    """删除待办事项"""
    show_todos(todos)
    try:
        num = int(input("输入要删除的项目编号:"))
        if 1 <= num <= len(todos):
            removed = todos.pop(num - 1)
            save_todos(todos)
            print(f"🗑️  已删除:{removed['title']}\n")
        else:
            print("编号无效!")
    except ValueError:
        print("请输入有效数字!")

def main():
    todos = load_todos()
    while True:
        print("=== 📝 待办清单 ===")
        print("1. 查看所有待办")
        print("2. 添加待办事项")
        print("3. 切换完成状态")
        print("4. 删除待办事项")
        print("5. 退出")

        choice = input("请选择 (1-5):").strip()

        if choice == "1":
            show_todos(todos)
        elif choice == "2":
            add_todo(todos)
        elif choice == "3":
            mark_done(todos)
        elif choice == "4":
            delete_todo(todos)
        elif choice == "5":
            print("再见!👋")
            break
        else:
            print("无效选择,请重试!\n")

if __name__ == "__main__":
    main()

8.10 下一步学习建议

1. 异常处理:用 try/except/finally 优雅地处理错误

2. 面向对象编程:类(class)、继承、多态

3. 模块与包:组织代码、导入第三方库

4. 常用标准库ossysdatetimere(正则)、requests(HTTP)

5. 实战项目:Web 爬虫、REST API、数据分析脚本


本章小结


[⬅️ 上一章:07-互联网原理](./07-互联网原理.html) · [🏠 目录](./README.html) · [➡️ 下一章:09-数据结构与算法](./09-数据结构与算法.html)

Collaplex · 克拉普莱克斯 collaplex.me · 2026 浙ICP备2026080865号