news 2026/4/20 12:23:29

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背了!用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(f"Alice是否关注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, shift=3): """凯撒密码:每个字母移动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(f"7分对应:{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(), key=lambda 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(f"Alice和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(f"25岁有驾照清醒的人可以驾驶吗?{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)}")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 12:21:17

R 4.5聚合任务静默失败?从systemd服务单元文件到Rprofile.site的9层配置校验清单(含自动化检测脚本)

第一章&#xff1a;R 4.5物联网数据聚合任务静默失败的典型现象与根因定位在 R 4.5 环境中执行物联网&#xff08;IoT&#xff09;数据聚合任务时&#xff0c;常出现无错误日志、无异常退出、但输出结果为空或严重失真的“静默失败”现象。这类问题极易被监控系统忽略&#xff…

作者头像 李华
网站建设 2026/4/20 12:19:17

如何快速实现流畅动画:探索Ola实时插值库的终极指南

如何快速实现流畅动画&#xff1a;探索Ola实时插值库的终极指南 【免费下载链接】ola &#x1f30a; Smooth animation library for interpolating numbers 项目地址: https://gitcode.com/gh_mirrors/ol/ola Ola是一款轻量级的实时插值动画库&#xff0c;专为创建流畅的…

作者头像 李华
网站建设 2026/4/20 12:14:22

题解:AcWing 906 区间分组

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

作者头像 李华
网站建设 2026/4/20 12:13:25

题解:AcWing 278 数字组合

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…

作者头像 李华
网站建设 2026/4/20 12:13:16

JiYuTrainer:极域电子教室控制破解的3种技术方案深度解析

JiYuTrainer&#xff1a;极域电子教室控制破解的3种技术方案深度解析 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 在数字化教学环境中&#xff0c;极域电子教室系统已成为许多…

作者头像 李华
网站建设 2026/4/20 12:12:22

安知鱼主题快速入门:5分钟搭建专业级博客

安知鱼主题快速入门&#xff1a;5分钟搭建专业级博客 【免费下载链接】hexo-theme-anzhiyu 安知鱼主题&#xff0c;这是一个简洁美丽的hexo主题。 项目地址: https://gitcode.com/gh_mirrors/he/hexo-theme-anzhiyu 安知鱼主题&#xff08;hexo-theme-anzhiyu&#xff0…

作者头像 李华