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: 筛选数据¶
练习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 - 函数与模块