包学会系列 - Java开发者初学Python(基础) - Python基础数据类型(Tuple/Dictionary)

该文章已生成可运行项目,

不废话,直接开干


今天来学习元组(Tuple)和字典(Dictionary),这两个都是Python中非常重要的数据结构。


第二章:Python基础数据类型与变量

2.4 元组(Tuple)和字典(Dictionary)

元组(Tuple) - 不可变的列表

# tuples_and_dicts.py

print("=== Python元组(Tuple)详解 ===")

# ==================== 元组创建 ====================
# 元组用圆括号 () 表示,元素用逗号分隔
empty_tuple = ()                          # 空元组
single_tuple = (42,)                      # 单元素元组(注意逗号!)
numbers = (1, 2, 3, 4, 5)                # 多元素元组
mixed_tuple = (1, "hello", 3.14, True)    # 混合类型元组
nested_tuple = ((1, 2), (3, 4, 5))       # 嵌套元组

print(f"空元组: {empty_tuple}")
print(f"单元素元组: {single_tuple}")        # 注意:(42,) 不是 (42)
print(f"数字元组: {numbers}")
print(f"混合元组: {mixed_tuple}")
print(f"嵌套元组: {nested_tuple}")

# 创建元组的其他方式(括号可以省略)
tuple_without_parens = 1, 2, 3           # 逗号决定是否是元组
print(f"无括号元组: {tuple_without_parens}")

"""
Java对比:
Java中没有直接的元组对应物,最接近的是:
- 数组:但数组大小固定,且可以修改元素
- List.of()创建的不可变列表

Python元组的特点:
1. 不可变(immutable):创建后不能修改
2. 有序:元素保持插入顺序
3. 可以包含不同类型元素
4. 通常用于存储相关的数据组合
"""

# ==================== 元组操作 ====================
print(f"\n=== 元组操作 ===")

# 索引和切片(与列表相同)
coordinates = (10, 20, 30)
print(f"坐标元组: {coordinates}")
print(f"索引0: {coordinates[0]}")          # 10
print(f"切片[0:2]: {coordinates[0:2]}")    # (10, 20)

# 元组解包(Tuple Unpacking)- 非常实用!
person = ("张三", 25, "工程师")
name, age, job = person  # 解包:将元组元素分别赋值给变量
print(f"解包结果: 姓名={name}, 年龄={age}, 职业={job}")

# 星号解包(Python 3.5+)
first, *rest = (1, 2, 3, 4, 5)
print(f"首元素: {first}, 其余元素: {rest}")

# 交换变量值(Pythonic的方式)
a, b = 10, 20
print(f"交换前: a={a}, b={b}")
a, b = b, a  # 不需要临时变量!
print(f"交换后: a={a}, b={b}")

# ==================== 元组 vs 列表 ====================
print(f"\n=== 元组 vs 列表 ===")

# 元组不可变,列表可变
my_list = [1, 2, 3]
my_tuple = (1, 2, 3)

my_list[0] = 99      # 列表可以修改
# my_tuple[0] = 99   # 这行会报错!元组不可修改

print(f"修改后的列表: {my_list}")
print(f"元组保持不变: {my_tuple}")

# 元组的方法比列表少(因为不可变)
print(f"元组的方法: {dir(my_tuple)}")  # 只有count, index等少数方法

# 性能比较:元组更轻量,创建和访问更快
import time

# 测试创建速度
start_time = time.time()
for i in range(1000000):
    [i, i+1, i+2]
list_time = time.time() - start_time

start_time = time.time()
for i in range(1000000):
    (i, i+1, i+2)
tuple_time = time.time() - start_time

print(f"列表创建时间: {list_time:.4f}秒")
print(f"元组创建时间: {tuple_time:.4f}秒")
print(f"元组比列表快: {list_time/tuple_time:.2f}倍")

字典(Dictionary) - 键值对集合

# ==================== 字典创建 ====================
print(f"\n=== Python字典(Dictionary)详解 ===")

# 字典用花括号 {} 表示,键值对用 key: value
empty_dict = {}                          # 空字典
person = {
    "name": "李四",
    "age": 30,
    "city": "北京",
    "is_student": False
}
scores = {"数学": 95, "英语": 88, "物理": 92}

print(f"空字典: {empty_dict}")
print(f"个人信息字典: {person}")
print(f"成绩字典: {scores}")

# 使用dict()构造函数创建字典
another_dict = dict(name="王五", age=25)  # 关键字参数方式
print(f"构造函数创建: {another_dict}")

"""
Java对比:
Java中的HashMap:
Map<String, Object> person = new HashMap<>();
person.put("name", "李四");
person.put("age", 30);

Python字典的特点:
1. 键值对存储:key-value pairs
2. 键必须是不可变类型(字符串、数字、元组)
3. 值可以是任意类型
4. 无序(Python 3.7+保持插入顺序)
5. 动态:可以随时添加、删除键值对
"""

# ==================== 字典操作 ====================
print(f"\n=== 字典操作 ===")

# 访问值
print(f"姓名: {person['name']}")          # 使用键访问
print(f"年龄: {person.get('age')}")       # 使用get方法访问

# 处理不存在的键
# print(person['salary'])                 # 键不存在会报KeyError
print(f"薪资: {person.get('salary')}")    # 返回None
print(f"薪资: {person.get('salary', 0)}") # 返回默认值0

# 添加和修改元素
person["salary"] = 8000                  # 添加新键值对
person["age"] = 31                       # 修改已有键的值
print(f"更新后: {person}")

# 删除元素
removed_value = person.pop("is_student") # 删除并返回值
print(f"删除的值: {removed_value}, 剩余: {person}")

del person["city"]                       # 删除键值对
print(f"删除city后: {person}")

# ==================== 字典方法 ====================
print(f"\n=== 字典方法 ===")

# 获取所有键、值、键值对
print(f"所有键: {person.keys()}")         # 键的视图
print(f"所有值: {person.values()}")       # 值的视图  
print(f"所有键值对: {person.items()}")    # 键值对的视图

# 遍历字典
print("\n遍历字典:")
for key in person:                       # 遍历键
    print(f"键: {key}")

for key, value in person.items():        # 同时遍历键和值
    print(f"{key}: {value}")

# 更新字典
update_info = {"age": 32, "department": "技术部"}
person.update(update_info)               # 批量更新
print(f"更新后: {person}")

# 字典生成式(Dictionary Comprehension)
squares = {x: x**2 for x in range(1, 6)}
print(f"平方字典: {squares}")

# 带条件的字典生成式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(f"偶数的平方字典: {even_squares}")

元组和字典的实用练习

# ==================== 实用练习 ====================
print(f"\n=== 实用练习 ===")

# 练习1:函数返回多个值(使用元组)
def calculate_stats(numbers):
    """计算列表的统计信息"""
    total = sum(numbers)
    count = len(numbers)
    average = total / count
    maximum = max(numbers)
    minimum = min(numbers)
    return total, count, average, maximum, minimum  # 返回元组

data = [10, 20, 30, 40, 50]
stats = calculate_stats(data)
total, count, avg, max_val, min_val = stats  # 解包元组
print(f"数据: {data}")
print(f"统计: 总和={total}, 个数={count}, 平均={avg:.1f}, 最大={max_val}, 最小={min_val}")

# 练习2:学生信息管理系统
students = {
    "001": {"name": "张三", "age": 20, "major": "计算机科学"},
    "002": {"name": "李四", "age": 21, "major": "数学"},
    "003": {"name": "王五", "age": 19, "major": "物理"}
}

print(f"\n学生信息:")
for student_id, info in students.items():
    print(f"学号: {student_id}, 姓名: {info['name']}, 年龄: {info['age']}, 专业: {info['major']}")

# 添加新学生
students["004"] = {"name": "赵六", "age": 22, "major": "化学"}
print(f"\n添加后学生数量: {len(students)}")

# 练习3:单词频率统计
text = "apple banana apple orange banana apple"
words = text.split()

word_count = {}
for word in words:
    word_count[word] = word_count.get(word, 0) + 1

print(f"\n单词频率: {word_count}")

# 使用collections.Counter更简单
from collections import Counter
word_count_counter = Counter(words)
print(f"使用Counter: {word_count_counter}")

# 练习4:字典的合并(Python 3.5+)
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged_dict = {**dict1, **dict2}  # 解包合并
print(f"合并字典: {merged_dict}")

# 练习5:元组作为字典的键
# 只有不可变类型才能作为字典的键
coordinates_dict = {
    (0, 0): "起点",
    (1, 2): "A点", 
    (3, 4): "B点"
}
print(f"\n坐标字典: {coordinates_dict}")
print(f"坐标(1,2)的值: {coordinates_dict[(1, 2)]}")

# 练习6:嵌套数据结构
company = {
    "name": "科技公司",
    "employees": [
        {"id": 1, "name": "张三", "skills": ("Python", "Java")},
        {"id": 2, "name": "李四", "skills": ("C++", "JavaScript")}
    ],
    "departments": {
        "dev": "开发部",
        "test": "测试部"
    }
}

print(f"\n公司结构:")
print(f"公司名: {company['name']}")
print(f"第一个员工: {company['employees'][0]['name']}")
print(f"第一个员工的技能: {company['employees'][0]['skills']}")

关键知识点总结

print(f"\n=== 关键知识点总结 ===")

"""
元组(Tuple):
- 不可变:创建后不能修改
- 使用场景:函数返回多个值、字典键、保证数据不被修改
- 语法:用逗号创建,通常用括号包围
- 性能:比列表更高效

字典(Dictionary):
- 键值对存储:快速查找和访问
- 键必须是不可变类型
- 常用方法:keys(), values(), items(), get(), update()
- 字典生成式:{key: value for item in iterable}

与Java对比:
- Java的Map接口 ≈ Python的字典
- Java没有内置的元组,通常用自定义类或数组代替
- Python的语法更简洁,操作更方便
"""

# 最后的小测试
print(f"\n=== 快速测试 ===")
# 测试1:你能创建一个包含列表的元组吗?
tuple_with_list = (1, 2, [3, 4])
print(f"包含列表的元组: {tuple_with_list}")

# 测试2:你能修改元组中的列表吗?
tuple_with_list[2].append(5)  # 可以!因为修改的是列表,不是元组
print(f"修改后: {tuple_with_list}")

# 测试3:字典键可以是元组吗?
valid_dict = {(1, 2): "点A", (3, 4): "点B"}
print(f"元组作为键: {valid_dict}")

关键知识点:

  1. 元组:不可变,用于数据保护和多返回值
  2. 字典:键值对映射,快速查找
  3. 解包操作a, b = b, a 交换变量
  4. 字典生成式{k: v for k, v in iterable}

请运行这段代码,重点关注:

  1. 元组的不可变特性
  2. 字典的各种操作和方法
  3. 解包操作的便利性
  4. 与Java对应数据结构的区别

推开窗,是别人的车马喧嚣;关上门,才是自家的月光皎洁。在属于自己的节奏里泡茶、读书、慢慢行走,力量,自会在不言中生长。 耐得寂寞蓄力气,终有一朝破土鸣。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐升升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值