别再死记硬背了!用Python代码和日常例子,5分钟搞懂离散数学里的集合、关系和函数

张开发
2026/4/20 12:23:29 15 分钟阅读

分享文章

别再死记硬背了!用Python代码和日常例子,5分钟搞懂离散数学里的集合、关系和函数
用Python和日常场景轻松掌握离散数学核心概念离散数学常常让计算机专业的学生感到头疼——那些抽象的集合符号、复杂的关系定义和晦涩的函数性质看起来与编程实践毫无关联。但事实上这些概念正是数据库设计、算法优化和系统架构的基础。让我们抛开枯燥的数学符号用Python代码和生活中的例子重新认识这些核心概念。1. 集合从购物清单到Python Set操作想象你正在整理周末野餐的购物清单。水果类有苹果、香蕉、橙子零食类有薯片、饼干、坚果。这就是一个典型的集合——一组确定的、无序的、互不相同的元素。在Python中我们可以用set类型来表示和操作集合fruits {苹果, 香蕉, 橙子} snacks {薯片, 饼干, 坚果} picnic_items fruits.union(snacks) # 并集操作 print(f野餐需要带{picnic_items}) # 检查是否有重复项 if fruits.isdisjoint(snacks): print(水果和零食没有重复项)集合运算在实际开发中非常有用。比如用户标签系统user1_tags {科技, 编程, 人工智能} user2_tags {编程, 美食, 旅行} common_tags user1_tags.intersection(user2_tags) # 交集 print(f两位用户共同的兴趣标签{common_tags})幂集所有子集的集合在权限系统设计中很常见。虽然Python标准库没有直接提供幂集函数但可以用itertools实现from itertools import combinations def power_set(items): for r in range(len(items)1): yield from combinations(items, r) permissions {read, write, execute} print(所有可能的权限组合) for subset in power_set(permissions): print(subset)2. 关系社交网络与数据库设计关系是集合之间的一种连接方式。以社交网络为例关注就是一种用户之间的关系。我们可以用Python的字典来表示这种关系social_graph { Alice: {Bob, Charlie}, Bob: {Charlie, David}, Charlie: {David}, David: set() # 空集合表示没有关注任何人 } def is_following(graph, user1, user2): return user2 in graph.get(user1, set()) print(fAlice是否关注Bob {is_following(social_graph, Alice, Bob)})关系在数据库中无处不在。比如电商平台的订单关系orders { 1001: {customer: Alice, products: {手机, 保护壳}, total: 5999}, 1002: {customer: Bob, products: {耳机}, total: 399} } # 查找购买过某产品的所有客户 def find_customers_by_product(product): return {order[customer] for order in orders.values() if product in order[products]} print(f购买过手机的用户{find_customers_by_product(手机)})等价关系在数据分组中特别有用。比如按年龄段划分用户users [ {name: Alice, age: 25}, {name: Bob, age: 30}, {name: Charlie, age: 25}, {name: David, age: 35} ] def age_group(age): return age // 10 * 10 # 按10岁分组 groups {} for user in users: group age_group(user[age]) groups.setdefault(group, []).append(user[name]) print(按年龄段分组的用户) for group, members in groups.items(): print(f{group}s: {members})3. 函数从数学映射到Python装饰器函数是特殊的关系——每个输入对应唯一的输出。在Python中函数是最基本的概念之一但离散数学中的函数概念更为抽象。考虑一个简单的加密函数def caesar_cipher(text, shift3): 凯撒密码每个字母移动shift位 result [] for char in text: if char.isalpha(): base ord(A) if char.isupper() else ord(a) shifted (ord(char) - base shift) % 26 result.append(chr(base shifted)) else: result.append(char) return .join(result) original Hello, World! encrypted caesar_cipher(original) print(f加密后{encrypted}) print(f解密后{caesar_cipher(encrypted, -3)})函数的性质在API设计中很重要。比如单射函数injective保证每个输入有唯一输出def create_user_id(name, birth_year): 生成唯一用户ID单射函数示例 return f{name.lower()}_{birth_year} print(create_user_id(Alice, 1990)) # alice_1990 print(create_user_id(Bob, 1985)) # bob_1985满射函数surjective确保输出空间被完全覆盖。比如将数字评分转换为星级显示def to_star_rating(score): 将0-10分转换为1-5星满射函数示例 return min(5, max(1, round(score / 2))) print(f7分对应{to_star_rating(7)}星) # 4星装饰器是Python中函数的高级应用体现了函数的组合特性def log_execution(func): 记录函数执行的装饰器 def wrapper(*args, **kwargs): print(f开始执行 {func.__name__}...) result func(*args, **kwargs) print(f{func.__name__} 执行完毕) return result return wrapper log_execution def calculate_discount(price, discount_rate): return price * (1 - discount_rate) print(f折后价格{calculate_discount(100, 0.2)})4. 图论从朋友圈到路由算法社交网络中的好友关系天然适合用图论来建模。让我们用Python实现一个简单的社交图class SocialGraph: def __init__(self): self.graph {} def add_user(self, user): if user not in self.graph: self.graph[user] set() def add_friendship(self, user1, user2): self.graph[user1].add(user2) self.graph[user2].add(user1) def mutual_friends(self, user1, user2): return self.graph[user1] self.graph[user2] def friend_recommendations(self, user): 推荐共同好友最多的人 recommendations {} for friend in self.graph[user]: for stranger in self.graph[friend]: if stranger ! user and stranger not in self.graph[user]: recommendations[stranger] recommendations.get(stranger, 0) 1 return sorted(recommendations.items(), keylambda x: -x[1]) # 使用示例 social_net SocialGraph() for user in [Alice, Bob, Charlie, David, Eve]: social_net.add_user(user) social_net.add_friendship(Alice, Bob) social_net.add_friendship(Alice, Charlie) social_net.add_friendship(Bob, David) social_net.add_friendship(Charlie, David) social_net.add_friendship(David, Eve) print(fAlice和David的共同好友{social_net.mutual_friends(Alice, David)}) print(f为Alice推荐的好友{social_net.friend_recommendations(Alice)})路由算法是图论的经典应用。Dijkstra算法可以用优先队列实现import heapq def dijkstra(graph, start): distances {node: float(infinity) for node in graph} distances[start] 0 queue [(0, start)] while queue: current_distance, current_node heapq.heappop(queue) if current_distance distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance current_distance weight if distance distances[neighbor]: distances[neighbor] distance heapq.heappush(queue, (distance, neighbor)) return distances # 城市间距离图 city_graph { 北京: {上海: 1065, 广州: 1888}, 上海: {北京: 1065, 广州: 1213, 杭州: 176}, 广州: {北京: 1888, 上海: 1213, 深圳: 140}, 杭州: {上海: 176}, 深圳: {广州: 140} } print(从北京出发到各城市的最短距离) print(dijkstra(city_graph, 北京))5. 逻辑与布尔代数从条件判断到电路设计布尔代数是计算机逻辑的基础。Python中的条件判断就是布尔代数的应用def can_drive(age, has_license, is_sober): 判断是否可以驾驶 return age 18 and has_license and is_sober print(f25岁有驾照清醒的人可以驾驶吗{can_drive(25, True, True)})德摩根定律在条件简化中非常实用# 德摩根定律应用 # not (A and B) (not A) or (not B) # not (A or B) (not A) and (not B) def is_valid_password(password): 检查密码是否有效长度8-20且包含字母和数字 has_letter any(c.isalpha() for c in password) has_digit any(c.isdigit() for c in password) valid_length 8 len(password) 20 return has_letter and has_digit and valid_length # 使用德摩根定律重写 def is_invalid_password(password): 检查密码是否无效 no_letter not any(c.isalpha() for c in password) no_digit not any(c.isdigit() for c in password) invalid_length len(password) 8 or len(password) 20 return no_letter or no_digit or invalid_length逻辑运算在权限系统中也很常见class User: def __init__(self, name, permissions): self.name name self.permissions set(permissions) def has_permission(self, permission): return permission in self.permissions admin User(Admin, {read, write, execute}) editor User(Editor, {read, write}) viewer User(Viewer, {read}) def can_edit_content(user): return user.has_permission(read) and user.has_permission(write) print(f编辑可以修改内容吗{can_edit_content(editor)})

更多文章