编程不是魔法,是用逻辑描述世界——就从 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 的劣势(诚实地说)
- 运行速度不如 C/C++/Rust(但大多数场景够用)
- 移动端开发支持有限
- 全局解释器锁(GIL)限制了多线程性能
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!
推荐工具
- IDE:VS Code(免费)+ Python 插件,或 PyCharm Community
- 虚拟环境:隔离项目依赖(必学!)
# 创建虚拟环境
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. 常用标准库:os、sys、datetime、re(正则)、requests(HTTP)
5. 实战项目:Web 爬虫、REST API、数据分析脚本
本章小结
- Python 语法简洁,适合编程入门
- 掌握变量、条件判断、循环、函数四大基础
- 列表、字典、元组是最常用的数据结构
with语句是文件操作的最佳实践- 动手写项目比看书更重要——计算器和待办清单就是很好的起点
[⬅️ 上一章:07-互联网原理](./07-互联网原理.html) · [🏠 目录](./README.html) · [➡️ 下一章:09-数据结构与算法](./09-数据结构与算法.html)