跳转至

01 - 数据类型与控制流

学习时间: 30-60分钟 重要性: ⭐⭐⭐⭐⭐ 每行代码都在用


🎯 学习目标

  • 掌握Python的基本数据类型
  • 理解列表、字典的使用(最常用)
  • 学会条件判断和循环
  • 知道什么时候用什么数据结构

📊 基本数据类型

1. 数字类型 (Numbers)

Python
# 整数 (int)
age = 25
count = 1_000_000  # 可以用下划线提高可读性

# 浮点数 (float)
price = 19.99
rate = 0.05

# 常用运算
result = 10 + 5      # 15 加法
result = 10 - 3      # 7  减法
result = 10 * 2      # 20 乘法
result = 10 / 3      # 3.333... 除法(总是返回浮点)
result = 10 // 3     # 3  整除
result = 10 % 3      # 1  取余
result = 2 ** 3      # 8  幂运算

# 类型转换
x = int(3.7)         # 3  向下取整
x = float("3.14")    # 3.14
x = str(100)         # "100"

上图展示了Python的数据类型分类,包括数值类型、布尔类型、序列类型、映射类型、集合类型和二进制类型等。理解这些基本数据类型是Python编程的基础,它们决定了数据在内存中的存储方式和可以执行的操作。

2. 字符串 (String)

Python
# 创建字符串
name = "张三"
message = 'Hello'

# 多行字符串
docstring = """
这是一个
多行字符串
"""

# 字符串操作(最常用)
greeting = "Hello, World!"
print(greeting.lower())      # "hello, world!" 转小写
print(greeting.upper())      # "HELLO, WORLD!" 转大写
print(greeting.strip())      # 去除首尾空格
print(greeting.split(", "))  # ["Hello", "World!"] 分割
print(" ".join(["Hello", "World"]))  # "Hello World" 连接
print(greeting.replace("World", "Python"))  # "Hello, Python!"

# 格式化字符串(重要!)
name = "李明"
age = 25

# f-string (推荐,Python 3.6+)
message = f"我叫{name},今年{age}岁"

# format方法
message = "我叫{},今年{}岁".format(name, age)

# 字符串切片
text = "Python programming"
print(text[0:6])      # "Python"  从0到5
print(text[:6])       # "Python"  从开始到5
print(text[7:])       # "programming" 从7到结尾
print(text[-11:])     # "programming" 倒数11个

3. 布尔值 (Boolean)

Python
# 布尔值
is_valid = True
is_empty = False

# 真值判断
x = 10
if x:  # 非零数字为True
    print("x is truthy")

# 常见假值(False)
# - None
# - False
# - 0, 0.0
# - "", [], {}, set()

🗂️ 集合类型(核心中的核心)

4. 列表 (List) - 最常用

Python
# 创建列表
numbers = [1, 2, 3, 4, 5]
fruits = ["apple", "banana", "orange"]
mixed = [1, "hello", 3.14, True]  # 可以混合类型

# 常用操作
fruits.append("grape")      # 添加元素
fruits.insert(1, "kiwi")    # 在位置1插入
fruits.remove("banana")     # 删除指定元素
popped = fruits.pop()       # 删除并返回最后一个
fruits.pop(0)               # 删除指定位置的元素

# 切片(重要!)
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[0])          # 0 第一个元素
print(numbers[-1])         # 5 最后一个元素
print(numbers[1:4])        # [1, 2, 3] 从1到3
print(numbers[:3])         # [0, 1, 2] 前三个
print(numbers[3:])         # [3, 4, 5] 从3到结尾
print(numbers[::2])        # [0, 2, 4] 每隔一个

# 列表推导式(Pythonic!)
# [表达式 for 变量 in 可迭代对象 if 条件]
squares = [x**2 for x in range(10)]  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
evens = [x for x in range(20) if x % 2 == 0]  # [0, 2, 4, 6, ...]

# 常用方法
numbers = [3, 1, 4, 1, 5]
numbers.sort()              # 排序(原地)
numbers.reverse()           # 反转(原地)
print(len(numbers))         # 长度
print(sum(numbers))         # 求和
print(max(numbers))         # 最大值
print(min(numbers))         # 最小值

# 实用技巧:解包
a, b, c = [1, 2, 3]  # a=1, b=2, c=3
first, *rest = [1, 2, 3, 4]  # first=1, rest=[2, 3, 4]

5. 字典 (Dictionary) - 第二常用

Python
# 创建字典
person = {
    "name": "张三",
    "age": 25,
    "city": "北京"
}

# 访问和修改
print(person["name"])              # "张三"
person["age"] = 26                 # 修改
person["email"] = "test@qq.com"    # 添加

# 安全访问(避免KeyError)
email = person.get("email", "unknown")  # 如果不存在返回"unknown"

# 常用方法
print(person.keys())               # 所有键
print(person.values())             # 所有值
print(person.items())              # 所有键值对
print("name" in person)            # True 检查键是否存在

# 遍历字典
for key in person:
    print(key, person[key])

for key, value in person.items():
    print(f"{key}: {value}")

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

# 嵌套字典
users = {
    "user1": {"name": "Alice", "age": 30},
    "user2": {"name": "Bob", "age": 25}
}
print(users["user1"]["name"])  # "Alice"

6. 元组 (Tuple) - 不可变列表

Python
# 创建元组
coordinates = (10, 20)
rgb = (255, 128, 0)

# 单元素元组(注意逗号)
single = (1,)  # 必须有逗号

# 元组解包(很常用)
x, y = coordinates
r, g, b = rgb

# 为什么用元组?
# 1. 数据不应该被改变
# 2. 作为字典的键(列表不行)
# 3. 从函数返回多个值
def get_user_info():
    return "张三", 25, "北京"

name, age, city = get_user_info()

7. 集合 (Set) - 去重和集合运算

Python
# 创建集合
numbers = {1, 2, 3, 2, 1}  # {1, 2, 3} 自动去重

# 从列表创建
unique = set([1, 2, 2, 3, 3])  # {1, 2, 3}

# 集合运算
a = {1, 2, 3}
b = {3, 4, 5}

print(a | b)  # {1, 2, 3, 4, 5} 并集
print(a & b)  # {3} 交集
print(a - b)  # {1, 2} 差集

# 常用操作
numbers.add(4)       # 添加
numbers.discard(2)   # 删除(不存在不会报错)
print(len(numbers))  # 长度

🔀 控制流

if 语句

Python
# 基本语法
age = 18

if age >= 18:
    print("成年人")
else:
    print("未成年人")

# 多条件
score = 85

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 60:
    grade = "C"
else:
    grade = "F"

# 逻辑运算符
age = 25
has_license = True

if age >= 18 and has_license:
    print("可以开车")

if age < 18 or not has_license:
    print("不能开车")

# 三元表达式(简单条件)
status = "adult" if age >= 18 else "minor"

for 循环

Python
# 遍历列表
fruits = ["apple", "banana", "orange"]
for fruit in fruits:
    print(fruit)

# 使用索引
for i in range(len(fruits)):
    print(f"{i}: {fruits[i]}")

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

# range函数
for i in range(5):        # 0, 1, 2, 3, 4
    print(i)

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

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

# 遍历字典
person = {"name": "张三", "age": 25}
for key in person:
    print(key, person[key])

for key, value in person.items():
    print(f"{key}: {value}")

while 循环

Python
# 基本while循环
count = 0
while count < 5:
    print(count)
    count += 1

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

# continue跳过本次循环
for i in range(10):
    if i % 2 == 0:
        continue
    print(i)  # 只打印奇数

💡 实用技巧

列表 vs 字典选择

Python
# ❌ 错误:用列表存键值对
user_list = ["name", "张三", "age", 25]  # 难以维护

# ✅ 正确:用字典
user_dict = {"name": "张三", "age": 25}  # 清晰明了

深浅拷贝(重要陷阱)

Python
# 浅拷贝:共享嵌套对象
original = [[1, 2], [3, 4]]
copy_list = original.copy()
copy_list[0][0] = 99
print(original[0][0])  # 99!被修改了

# 深拷贝:完全独立
import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 99
print(original[0][0])  # 1 没有被修改

类型检查

Python
# 检查类型
x = [1, 2, 3]
if isinstance(x, list):  # isinstance(obj, type)检查对象是否是指定类型(含子类)的实例
    print("x是列表")

if type(x) == list:
    print("x是列表")  # 不推荐,用isinstance更好

# 检查多种类型
if isinstance(x, (list, tuple)):
    print("x是列表或元组")

📝 练习

练习1: 词频统计

Python
text = "apple banana apple orange banana apple"
# TODO: 统计每个词出现的次数
# 预期输出: {'apple': 3, 'banana': 2, 'orange': 1}

练习2: 筛选数据

Python
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# TODO: 筛选出偶数,并计算它们的平方
# 预期输出: [4, 16, 36, 64, 100]

练习3: 成绩分级

Python
scores = {"Alice": 85, "Bob": 92, "Charlie": 78, "David": 60}
# TODO: 将成绩转换为等级(A/B/C/D),存入新字典
# A: >=90, B: >=80, C: >=60, D: <60

🎯 自我检查

完成这个主题后,你应该:

  • 知道什么时候用列表、字典、元组、集合
  • 能熟练使用切片和列表推导式
  • 能正确遍历字典
  • 理解深浅拷贝的区别
  • 能写出条件判断和循环
  • 不查资料完成上面的练习

📚 延伸阅读


下一步: 02 - 函数与模块