当前位置: 首页 > article >正文

Python分形几何可视化—— 复数迭代、L系统与生物分形模拟

Python分形几何可视化—— 复数迭代、L系统与生物分形模拟

本节将深入探索分形几何的奇妙世界,实现Mandelbrot集生成器和L系统分形树工具,并通过肺部血管分形案例展示分形在医学领域的应用。我们将使用Python的NumPy进行高效计算,结合Matplotlib进行高质量可视化。


前言:探索无限细节的几何宇宙

分形几何(Fractal Geometry)作为20世纪数学最激动人心的发现之一,打破了欧几里得几何的传统框架,揭示了自然界中普遍存在的「自相似性」与「无限细节」。从蜿蜒的海岸线到茂密的树冠,从显微镜下的雪花到宇宙星系的分布,分形无处不在,连接着数学的抽象之美与现实世界的复杂系统。

本文将带领读者走进分形几何的可视化世界,通过三个核心模块——复数迭代生成的Mandelbrot集符号重写系统驱动的L分形树生物医学中的肺部血管模拟——展示分形理论的数学本质与跨学科应用。我们将结合Python编程工具,利用NumPy的高效计算和Matplotlib的可视化能力,实现从数学公式到动态图像的完整转化,同时通过动画和案例揭示分形在科学研究中的实际价值。

一、基本概念:分形与L系统理论基础

1.1 分形几何的核心特征

**分形(Fractal)**由数学家本华·曼德博(Benoît Mandelbrot)于1975年提出,其定义可概括为:

  • 自相似性(Self-Similarity):局部与整体在形态、功能或信息上具有相似性(如蕨类叶片的分支结构);
  • 分数维度(Fractional Dimension):几何对象的复杂度无法用整数维描述(如科赫曲线的分形维数为1.2618);
  • 迭代生成(Iterative Generation):通过简单规则的重复应用创造复杂结构(如Mandelbrot集的复数迭代)。

典型分形示例

  • Mandelbrot集:通过复数迭代 ( z_{n+1} = z_n^2 + c ) 生成的无限复杂图形,边界处的每个点对应一个动态系统的长期行为;
  • 科赫雪花(Koch Snowflake):通过递归替换线段生成的分形曲线,具有无限周长和有限面积;
  • 蕨类植物:自然界中典型的自相似分形,可用仿射变换的迭代函数系统(IFS)模拟。

1.2 L系统:符号重写的分形生成器

**L系统(L-System)**由生物学家阿里斯蒂德·林登迈耶(Aristid Lindenmayer)于1968年提出,最初用于模拟植物的生长过程。其核心要素包括:

  • 字母表(Alphabet):由符号组成的集合,分为绘图符号(如F表示向前移动并绘制线段)和控制符号(如+-表示旋转角度);
  • 公理(Axiom):初始字符串,代表分形的最基础形态;
  • 规则(Rules):符号替换的映射关系,通过迭代逐步构建复杂结构。

L系统工作流程

  1. 从公理出发,根据规则逐代替换字符串中的每个符号;
  2. 通过「龟绘图」(Turtle Graphics)解释器将最终字符串转换为几何图形:
    • F:向前移动指定距离并绘制线段;
    • +/-:向左/右旋转指定角度;
    • [/]:保存/恢复当前画笔状态(用于处理分支结构)。

应用场景

  • 植物形态模拟(如蕨类、树木);
  • 晶体生长、神经网络建模;
  • 生物医学中的支气管树、血管分支模拟。

二、Mandelbrot集生成器

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap
import matplotlib.animation as animation
from numba import jitplt.rcParams["font.sans-serif"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False  # 正确显示负号
plt.rcParams["mathtext.fontset"] = "cm"  # 设置数学字体# 使用Numba加速计算
@jit(nopython=True, cache=False)
def mandelbrot(c, max_iter=100):"""计算Mandelbrot集的迭代次数参数:c: 复数max_iter: 最大迭代次数返回: 迭代次数 (如果发散) 或 max_iter (如果收敛)"""z = 0jfor i in range(max_iter):z = z * z + cif abs(z) > 2:return ireturn max_iter@jit(nopython=True, cache=False)
def compute_mandelbrot(width, height, x_min, x_max, y_min, y_max, max_iter=100):"""计算整个Mandelbrot集参数:width, height: 图像尺寸x_min, x_max: 实部范围y_min, y_max: 虚部范围max_iter: 最大迭代次数返回: 迭代次数矩阵"""# 创建图像网格x = np.linspace(x_min, x_max, width)y = np.linspace(y_min, y_max, height)iterations = np.zeros((height, width), dtype=np.int32)for i in range(height):for j in range(width):c = x[j] + 1j * y[i]iterations[i, j] = mandelbrot(c, max_iter)# 返回迭代次数和统计信息(用于调试)return iterations, iterations.min(), iterations.max(), np.mean(iterations)def plot_mandelbrot(width=800,height=800,x_min=-2.0,x_max=1.0,y_min=-1.5,y_max=1.5,max_iter=100,cmap="viridis",title="Mandelbrot集",output_path="mandelbrot.png",
):"""绘制Mandelbrot集参数:width, height: 图像尺寸x_min, x_max, y_min, y_max: 复数平面范围max_iter: 最大迭代次数cmap: 颜色映射title: 图像标题output_path: 输出文件路径"""# 接收完整返回值并提取迭代次数矩阵result = compute_mandelbrot(width, height, x_min, x_max, y_min, y_max, max_iter)iterations = result[0]  # 提取迭代次数矩阵# 创建图像plt.figure(figsize=(10, 10), dpi=100)# 使用对数缩放增强细节log_iter = np.log(iterations + 1)# 绘制Mandelbrot集plt.imshow(log_iter, extent=(x_min, x_max, y_min, y_max), cmap=cmap, origin="lower")# 设置标题和标签plt.title(title, fontsize=18, pad=20)plt.xlabel("实部", fontsize=14)plt.ylabel("虚部", fontsize=14)# 添加颜色条cbar = plt.colorbar(label="迭代次数 (对数缩放)")cbar.set_ticks([])  # 隐藏刻度,因为是对数缩放# 添加数学公式plt.text(0.05,0.95,r"$z_{n+1} = z_n^2 + c$",transform=plt.gca().transAxes,fontsize=16,bbox=dict(facecolor="white", alpha=0.8),)# 保存图像plt.savefig(output_path, bbox_inches="tight", dpi=150)plt.close()print(f"Mandelbrot集图像已保存至: {output_path}")def mandelbrot_zoom_animation(output_path="mandelbrot_zoom_fixed.gif"):"""创建修复后的Mandelbrot集缩放动画"""# 初始参数width, height = 400, 400max_iter = 200# 创建鲜艳的颜色映射colors = ["#000000",  # 黑"#0000FF",  # 蓝"#00FFFF",  # 青"#00FF00",  # 绿"#FFFF00",  # 黄"#FF8000",  # 橙"#FF0000",  # 红"#FFFFFF",  # 白]cmap = ListedColormap(colors)# 设置更平滑的缩放路径zoom_path = [# 起始位置{"center": (-0.5, 0.0), "scale": 1.0, "pause": 5},# 逐步放大{"center": (-0.5, 0.0), "scale": 0.3, "pause": 3},{"center": (-0.5, 0.0), "scale": 0.1, "pause": 3},# 移动到海马谷区域{"center": (-0.745, 0.1), "scale": 0.03, "pause": 5},{"center": (-0.745, 0.1), "scale": 0.01, "pause": 7},{"center": (-0.745, 0.1), "scale": 0.003, "pause": 10},]fig = plt.figure(figsize=(8, 8), dpi=100)ax = plt.gca()# 初始化图像init_data = np.zeros((height, width))im = ax.imshow(init_data, cmap=cmap, origin="lower")# 添加颜色条cbar = fig.colorbar(im, ax=ax)cbar.set_label("迭代深度")plt.title("Mandelbrot集缩放动画", fontsize=16, pad=15)plt.xlabel("实部", fontsize=12)plt.ylabel("虚部", fontsize=12)# 动画帧列表 (存储数据和范围)frames = []for zoom in zoom_path:cx, cy = zoom["center"]scale = zoom["scale"]# 计算当前视图范围x_min = cx - 1.5 * scalex_max = cx + 1.5 * scaley_min = cy - 1.5 * scaley_max = cy + 1.5 * scale# 计算Mandelbrot集iterations = compute_mandelbrot(width, height, x_min, x_max, y_min, y_max, max_iter)# 检查返回值类型if not isinstance(iterations, np.ndarray):print(f"警告: compute_mandelbrot返回了非数组类型: {type(iterations)}")if isinstance(iterations, tuple):print(f"元组长度: {len(iterations)}, 元素类型: {[type(e) for e in iterations]}")# 尝试从元组中提取数组 (假设第一个元素是数据)if len(iterations) > 0 and isinstance(iterations[0], np.ndarray):iterations = iterations[0]else:raise TypeError("无法从元组中提取有效的迭代数据")log_iter = np.log(iterations + 1)# 计算当前帧的合适颜色范围vmin = np.min(log_iter)vmax = np.max(log_iter)# 避免vmin==vmax导致错误if vmin == vmax:vmax = vmin + 0.1# 添加帧数据 (图像数据、范围和颜色范围)frame_data = {"data": log_iter,"extent": (x_min, x_max, y_min, y_max),"vmin": vmin,"vmax": vmax,}# 添加多帧以暂停for _ in range(zoom["pause"]):frames.append(frame_data)print(f"生成帧:{len(frames)},范围:({x_min:.5f}, {x_max:.5f}, {y_min:.5f}, {y_max:.5f})")# 动画更新函数def update(frame):im.set_data(frame["data"])im.set_extent(frame["extent"])im.set_clim(frame["vmin"], frame["vmax"])# 修复f-string括号问题zoom_factor = 3 / (frame["extent"][1] - frame["extent"][0])ax.set_title(f"Mandelbrot集缩放动画 - 缩放因子: {zoom_factor:.0f}x", fontsize=14)return (im,)# 创建动画anim = animation.FuncAnimation(fig, update, frames=frames, interval=100, blit=True, repeat_delay=1000)# 保存GIFanim.save(output_path, writer="pillow", fps=10)plt.close()print(f"修复后的Mandelbrot集缩放动画已保存至: {output_path}")

三、L系统分形树生成工具

class LSystem:"""L系统分形生成器"""def __init__(self, rules, axiom, angle, distance, iterations):"""初始化L系统参数:rules: 替换规则字典axiom: 初始字符串angle: 旋转角度 (度)distance: 初始步长iterations: 迭代次数"""self.rules = rulesself.axiom = axiomself.angle = np.radians(angle)self.distance = distanceself.iterations = iterationsself.current_string = axiomself.stack = []self.positions = []self.directions = []# 生成分形字符串self.generate_string()def generate_string(self):"""生成L系统字符串"""for _ in range(self.iterations):new_string = ""for char in self.current_string:new_string += self.rules.get(char, char)self.current_string = new_stringdef generate_points(self):"""根据字符串生成点坐标"""# 初始状态x, y = 0, 0direction = np.pi / 2  # 初始向上 (90度)points = [(x, y)]# 距离衰减因子dist = self.distancedist_factor = 0.6  # 每级分支长度衰减for i, char in enumerate(self.current_string):if char == 'F':  # 向前移动x += dist * np.cos(direction)y += dist * np.sin(direction)points.append((x, y))elif char == '+':  # 左转direction += self.angleelif char == '-':  # 右转direction -= self.angleelif char == '[':  # 保存状态self.stack.append((x, y, direction, dist))elif char == ']':  # 恢复状态if self.stack:x, y, direction, dist = self.stack.pop()points.append((x, y))# 分支级别减少时增加距离dist /= dist_factorelif char == 'f':  # 向前移动但不画线 (用于定位)x += dist * np.cos(direction)y += dist * np.sin(direction)points.append((x, y))elif char == '|':  # 反转方向direction += np.pireturn pointsdef plot_fractal_tree(rules, axiom, angle, distance, iterations, title="L系统分形树", output_path="fractal_tree.png"):"""绘制L系统分形树参数:rules: 替换规则字典axiom: 初始字符串angle: 旋转角度 (度)distance: 初始步长iterations: 迭代次数title: 图像标题output_path: 输出文件路径"""# 创建L系统lsys = LSystem(rules, axiom, angle, distance, iterations)# 生成点坐标points = lsys.generate_points()# 创建图像plt.figure(figsize=(10, 12), dpi=120)# 绘制分形树x, y = zip(*points)plt.plot(x, y, 'k-', linewidth=0.8, alpha=0.7)# 设置标题和标签plt.title(title, fontsize=16, pad=15)plt.axis('equal')plt.axis('off')# 添加L系统信息info_text = (f"迭代次数: {iterations}\n"f"旋转角度: {angle}°\n"f"初始字符串: {axiom}\n"f"替换规则: {str(rules)}")plt.text(0.05, 0.05, info_text, transform=plt.gca().transAxes, fontsize=10,bbox=dict(facecolor='white', alpha=0.8))# 保存图像plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"分形树图像已保存至: {output_path}")def plot_tree_growth(axiom, rules, angle, distance, max_iter=5, output_path="tree_growth.gif"):"""创建分形树生长动画"""fig = plt.figure(figsize=(8, 10), dpi=100)plt.axis('equal')plt.axis('off')# 动画更新函数def update(iter_num):plt.clf()plt.axis('equal')plt.axis('off')# 创建当前迭代的L系统lsys = LSystem(rules, axiom, angle, distance, iter_num)points = lsys.generate_points()# 绘制分形树x, y = zip(*points)plt.plot(x, y, 'k-', linewidth=0.8, alpha=0.7)# 设置标题plt.title(f"分形树生长: 迭代 {iter_num}", fontsize=14, pad=10)return fig,# 创建动画anim = animation.FuncAnimation(fig, update, frames=range(1, max_iter+1), interval=800, blit=True)# 保存GIFanim.save(output_path, writer='pillow', fps=2)plt.close()print(f"分形树生长动画已保存至: {output_path}")

四、跨学科案例:肺部血管分形模拟

def simulate_lung_vasculature(output_path="lung_vasculature.png"):"""模拟肺部血管分形结构参数:output_path: 输出文件路径"""# 创建图像plt.figure(figsize=(12, 10), dpi=130)# 初始主干血管start_point = (0, 0)end_point = (0, 10)plt.plot([start_point[0], end_point[0]], [start_point[1], end_point[1]], 'r-', linewidth=3.0, alpha=0.8)# 递归绘制血管分支def draw_branches(start, direction, length, width, angle, depth, max_depth=7):if depth > max_depth:return# 计算分支点branch_point = (start[0] + length * np.cos(direction),start[1] + length * np.sin(direction))# 绘制分支plt.plot([start[0], branch_point[0]], [start[1], branch_point[1]], color='darkred', linewidth=width, alpha=0.7)# 递归绘制子分支 (左右两个方向)new_length = length * 0.7  # 长度衰减new_width = width * 0.6    # 宽度衰减# 左分支left_angle = direction + angledraw_branches(branch_point, left_angle, new_length, new_width, angle, depth+1, max_depth)# 右分支right_angle = direction - angledraw_branches(branch_point, right_angle, new_length, new_width, angle, depth+1, max_depth)# 设置血管参数initial_angle = np.pi / 2  # 初始向上branch_angle = np.radians(35)  # 分支角度initial_length = 3.0  # 初始分支长度initial_width = 1.5   # 初始分支宽度# 从主干开始绘制draw_branches(end_point, initial_angle, initial_length, initial_width, branch_angle, 1)# 添加对称的另一侧draw_branches(end_point, initial_angle + np.pi, initial_length, initial_width, branch_angle, 1)# 设置标题和标签plt.title("肺部血管分形结构模拟", fontsize=18, pad=20)plt.axis('equal')plt.axis('off')# 添加分形信息plt.text(0.05, 0.05, "分形特性:\n- 自相似性\n- 递归分支\n- 尺度不变性", transform=plt.gca().transAxes, fontsize=12,bbox=dict(facecolor='white', alpha=0.8))# 添加医学说明plt.text(0.7, 0.15, "医学意义:\n- 最大化气体交换面积\n- 优化血液流动效率\n- 最小化血液流动阻力", transform=plt.gca().transAxes, fontsize=12,bbox=dict(facecolor='white', alpha=0.8))# 保存图像plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"肺部血管模拟图已保存至: {output_path}")def generate_lung_bronchi(output_path="lung_bronchi.png"):"""使用L系统模拟肺部支气管分形结构"""# 定义L系统规则rules = {'F': 'FF',  # 主干生长'X': 'F-[[X]+X]+F[+FX]-X'  # 分支规则}axiom = 'X'angle = 25  # 分支角度distance = 1.0  # 初始步长iterations = 6  # 迭代次数# 创建L系统lsys = LSystem(rules, axiom, angle, distance, iterations)# 生成点坐标points = lsys.generate_points()# 创建图像plt.figure(figsize=(10, 12), dpi=130)# 绘制支气管树x, y = zip(*points)plt.plot(x, y, 'b-', linewidth=1.5, alpha=0.7)# 设置标题和标签plt.title("肺部支气管分形结构 (L系统模拟)", fontsize=16, pad=15)plt.axis('equal')plt.axis('off')# 添加分形参数info_text = (f"迭代次数: {iterations}\n"f"分支角度: {angle}°\n"f"L系统规则: {str(rules)}")plt.text(0.05, 0.05, info_text, transform=plt.gca().transAxes, fontsize=10,bbox=dict(facecolor='white', alpha=0.8))# 保存图像plt.savefig(output_path, bbox_inches='tight')plt.close()print(f"支气管分形图已保存至: {output_path}")

五、使用示例

if __name__ == "__main__":# 1. Mandelbrot集# 标准Mandelbrot集plot_mandelbrot(output_path="mandelbrot_standard.png")# 高细节区域plot_mandelbrot(x_min=-0.745, x_max=-0.735, y_min=0.095, y_max=0.105,max_iter=500, cmap='hot',title="Mandelbrot集细节 (海马谷)",output_path="mandelbrot_detail.png")# Mandelbrot集缩放动画mandelbrot_zoom_animation(output_path="mandelbrot_zoom.gif")# 2. L系统分形树# 二叉分形树tree_rules1 = {'F': 'FF','X': 'F-[[X]+X]+F[+FX]-X'}plot_fractal_tree(rules=tree_rules1, axiom='X', angle=25, distance=1.0, iterations=6,title="二叉分形树 (L系统)",output_path="binary_tree.png")# 雪花分形snowflake_rules = {'F': 'F+F--F+F'}plot_fractal_tree(rules=snowflake_rules, axiom='F--F--F', angle=60, distance=1.0, iterations=5,title="科赫雪花 (L系统)",output_path="koch_snowflake.png")# 分形树生长动画tree_rules2 = {'F': 'FF','X': 'F[+X]F[-X]+X'}plot_tree_growth(axiom='X', rules=tree_rules2, angle=20, distance=1.0, max_iter=6,output_path="tree_growth.gif")# 3. 肺部血管分形模拟# 递归模拟simulate_lung_vasculature(output_path="lung_vasculature.png")# L系统模拟generate_lung_bronchi(output_path="lung_bronchi.png")

六、生成图像说明

  1. Mandelbrot集 (mandelbrot_standard.png, mandelbrot_detail.png):

    • 展示完整的Mandelbrot集和细节放大
    • 使用对数缩放增强视觉细节
    • 包含迭代公式的数学表示
    • 缩放动画展示分形的无限复杂性
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  2. L系统分形树 (binary_tree.png, koch_snowflake.png):

    • 二叉分形树的自然形态
    • 科赫雪花的经典分形结构
    • 包含L系统规则和参数说明
    • 生长动画展示分形构建过程
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  3. 肺部血管模拟 (lung_vasculature.png, lung_bronchi.png):

    • 递归方法模拟的肺部血管结构
    • L系统生成的支气管分形树
    • 展示自相似性和分支模式
    • 包含医学意义说明
      在这里插入图片描述
      在这里插入图片描述

七、教学要点

  1. 分形几何基础:

    • 分形的定义与特征:自相似性、分数维度
    • Mandelbrot集的数学原理:复数迭代
    • 分形维度的计算方法
  2. L系统理论:

    • L系统的组成要素:字母表、公理、规则
    • 字符串重写与递归生成
    • 图形解释:龟绘图解释器
  3. 生物分形应用:

    • 肺部血管的分形特性
    • 支气管树的递归分支结构
    • 分形在优化生物系统中的优势
  4. 计算优化技术:

    • 使用Numba加速迭代计算
    • 对数缩放增强视觉细节
    • 递归算法的高效实现
    • 动画展示分形生成过程
  5. 跨学科联系:

    • 数学:复数动力学
    • 计算机科学:递归算法
    • 生物学:分形在生命系统中的普遍性
    • 医学:肺部结构与功能优化

本节提供了强大的分形几何可视化工具,从数学的Mandelbrot集到生物的肺部血管结构。分形树生长动画展示了递归构建的奇妙过程,而肺部血管案例则体现了分形在生物系统中的自然存在和功能优化。

八、结语

分形几何不仅是数学的一个分支,更是连接科学、艺术与自然的通用语言。通过本文的工具和案例,读者将学会用代码捕捉分形的无限细节,同时理解其在生物学、医学等领域的深层意义——从微观的细胞结构到宏观的生态系统,分形始终是复杂系统高效运作的底层逻辑。希望这些工具能激发更多跨学科的探索,让分形的智慧在数据可视化、算法设计乃至科学发现中绽放光彩。

相关文章:

Python分形几何可视化—— 复数迭代、L系统与生物分形模拟

Python分形几何可视化—— 复数迭代、L系统与生物分形模拟 本节将深入探索分形几何的奇妙世界,实现Mandelbrot集生成器和L系统分形树工具,并通过肺部血管分形案例展示分形在医学领域的应用。我们将使用Python的NumPy进行高效计算,结合Matplo…...

【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试

文章主要内容如下: 1、基础运行环境配置 2、Torch-GPU安装 3、ultralytics环境配置 4、Onnx及TensorRT导出详解 5、YOLOv8推理耗时分析 基础库版本:jetpack5.1.3, torch-gpu2.1.0, torchvision0.16.0, ultralytics8.3.146 设备的软件开发包基础信息 需…...

Go语言学习-->项目中引用第三方库方式

Go语言学习–>项目中引用第三方库方式 1 执行 go mod tidy 分析引入的依赖有没有正常放在go.mod里面 找到依赖的包会自动下载到本地 并添加在go.mod里面 执行结果: 2 执行go get XXXX(库的名字)...

Vue Fragment vs React Fragment

文章目录 前言🧩 一、概念对比:Vue Fragment vs React Fragment📦 二、使用示例对比✅ Vue 3 中使用 Fragment✅ React 中使用 Fragment 🔍 三、差异解析1. **使用方式**2. **传递属性(如 key)**3. **插槽系…...

【LRU】 (最近最少使用)

LRU (最近最少使用) 文章目录 LRU (最近最少使用)一、LRU是什么?二、实现1.常规算法2.双栈更替总结 一、LRU是什么? LRU(Least Recently Used)是一种常见的缓存淘汰策略,核心思想是 “淘汰最长时间未被使用的缓存数据…...

每日Prompt:云朵猫

提示词 仰视,城镇的天空,一片形似猫咪的云朵,用黑色的简笔画,勾勒出猫咪的形状,可爱,俏皮,极简...

AI浪潮下的IT行业:威胁、转变与共生之道

目录 前言1 AI在IT行业的具体应用场景1.1 软件开发中的AI助手1.2 运维与监控的智能化1.3 测试自动化与质量保障1.4 安全防护中的智能威胁识别 2 AI对IT从业者的实际影响2.1 工作内容的结构性变化2.2 技能结构的再平衡 3 IT从业者不可替代的能力与价值3.1 复杂系统的架构与抽象能…...

基于功能基团的3D分子生成扩散模型 - D3FG 评测

D3FG 是一个在口袋中基于功能团的3D分子生成扩散模型。与通常分子生成模型直接生成分子坐标和原子类型不同,D3FG 将分子分解为两类组成部分:官能团和连接体,然后使用扩散生成模型学习这些组成部分的类型和几何分布。 一、背景介绍 D3FG 来源…...

Python Cookbook-7.12 在 SQLite 中储存 BLOB

任务 想将 BLOB 存入一个 SQLite 数据库, 解决方案 Python的 PySQLite 扩展提供了 sqlite.encode 函数,它可帮助你在 SOLite 数据库中插入二进制串。可以基于这个函数编写一个小巧的适配器类: import sqlite,cPickle class Blob(object):自动转换二进制串def __init__(self…...

蓝耘服务器与DeepSeek的结合:引领智能化时代的新突破

🌟 嗨,我是Lethehong!🌟 🌍 立志在坚不欲说,成功在久不在速🌍 🚀 欢迎关注:👍点赞⬆️留言收藏🚀 🍀欢迎使用:小智初学…...

无人机光纤FC接口模块技术分析

运行方式 1. 信号转换:在遥控器端,模块接收来自遥控器主控板的电信号。 2.电光转换:模块内部的激光发射器将电信号转换成特定波长的光信号。 3.光纤传输:光信号通过光纤跳线传输。光纤利用全内反射原理将光信号约束在纤芯内进行…...

【LeetCode】3170. 删除星号以后字典序最小的字符串(贪心 | 优先队列)

LeetCode 3170. 删除星号以后字典序最小的字符串(中等) 题目描述解题思路java代码 题目描述 题目链接:3170. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 * 字符。你的任务是删除所有的 * 字符。 当字符串还…...

Oracle 用户名大小写控制

Oracle 用户名大小写控制 在 Oracle 数据库中,用户名的默认大小写行为和精确控制方法如下: 一 默认用户名大小写行为 不引用的用户名:自动转换为大写 CREATE USER white IDENTIFIED BY oracle123; -- 实际创建的用户名是 "WHITE"…...

作为过来人,浅谈一下高考、考研、读博

写在前面 由于本人正在读博,标题中的三个阶段都经历过或正在经历,本意是闲聊,也算是给将要经历的读者们做个参考、排雷。本文写于2022年,时效性略有落后,不过逻辑上还是值得大家参考,若所述存在偏颇&#…...

立志成为一名优秀测试开发工程师(第十一天)—Postman动态参数/变量、文件上传、断言策略、批量执行及CSV/JSON数据驱动测试

目录 一、Postman接口关联与正则表达式应用 1.正则表达式解析 2.提取鉴权码。 二、Postman内置动态参数以及自定义动态参数 1.常见内置动态参数: 2.自定义动态参数: 3.“编辑”接口练习 三、图片上传 1.文件的上传 2.上传后内容的验证 四、po…...

Global Security Market知识点总结:主经纪商业务

在全球证券市场的复杂体系中,主经纪商业务(Prime Brokerage)占据着独特且关键的位置。这一业务为大型机构投资者提供了一系列至关重要的服务,极大地影响着金融市场的运作与发展。 一、主经纪商业务的定义 主经纪商业务是投资银行…...

算法练习-回溯

今天开始新的章节,关于算法中回溯法的练习,这部分题目的难度还是比较大的,但是十分锻炼人的思维与思考能力。 处理这类题目首先要注意几个基本点: 1.关于递归出口的设置,这是十分关键的,要避免死循环的产…...

AI代码助手需求说明书架构

AI代码助手需求说明书架构 #mermaid-svg-6dtAzH7HjD5rehlu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6dtAzH7HjD5rehlu .error-icon{fill:#552222;}#mermaid-svg-6dtAzH7HjD5rehlu .error-text{fill:#552222;s…...

PTC过流保护器件工作原理及选型方法

PTC过流保护器件 ‌(Positive Temperature Coefficient,正温度系数热敏电阻)是一种过流保护元件,其工作原理基于电阻值随温度变化的特性。当电路正常工作时,PTC的阻值很小,电流可以顺畅通过;但当…...

RabbitMQ 在解决数据库高并发问题中的定位和核心机制

RabbitMQ 在解决数据库高并发问题中的定位和核心机制 它是间接但极其有效的解决方案,以下内容聚焦如何最大化发挥 RabbitMQ 的潜力: 一、核心机制落地强化方案 1. 精准的异步化切割 关键原则:区分 “必须同步” 和 “可异步” 操作 #merma…...

VSCode主题定制:CSS个性化你的编程世界

在今天的数字世界,编程环境已成为开发者的第二大脑,而主题正是个性化你的创意空间的关键。本文将指导你如何使用CSS自定义VSCode的主题,让你的IDE不仅功能强大,更具视觉个性。 思路分析 设计思路: 创建主色调基调和…...

Windows 下彻底删除 VsCode

彻底删除 VS Code (Visual Studio Code) 意味着不仅要卸载应用程序本身,还要删除所有相关的配置文件、用户数据、插件和缓存。这可以确保你有一个完全干净的状态,方便你重新安装或只是彻底移除它。 重要提示: 在执行以下操作之前&#xff0c…...

一文带你入门Java Stream流,太强了,mysqldba面试题及答案

list.add(“世界加油”); list.add(“世界加油”); long count list.stream().distinct().count(); System.out.println(count); distinct() 方法是一个中间操作(去重),它会返回一个新的流(没有共同元素)。 Stre…...

FastAPI安全异常处理:从401到422的奇妙冒险

title: FastAPI安全异常处理:从401到422的奇妙冒险 date: 2025/06/05 21:06:31 updated: 2025/06/05 21:06:31 author: cmdragon excerpt: FastAPI安全异常处理核心原理与实践包括认证失败的标准HTTP响应规范、令牌异常的特殊场景处理以及完整示例代码。HTTP状态码选择原则…...

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库 最近帮朋友 完成一些运维工作 ,这里记录一下。 文章目录 阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库最近帮朋友 完成一些运维工作 ,这里记录一下。 阿里云 RDS MySQL 5.7 添加白名单1. 登录…...

《Brief Bioinform》: 鼠脑单细胞与Stereo-seq数据整合算法评估

一、写在前面 基因捕获效率、分辨率一直是空间转录组细胞类型识别的拦路虎,许多算法能够整合单细胞(single-cell, sc)或单细胞核(single-nuclear, sn)数据与空间转录组数据,从而帮助空转数据的细胞类型注释。此前我们介绍过近年新出炉的Stereo-seq平台&…...

基于Springboot的宠物领养系统

本系统是一个面向社会的宠物领养平台,旨在帮助流浪宠物找到新家庭,方便用户在线浏览、申请领养宠物,并支持管理员高效管理宠物、公告和用户信息。 技术栈: -后端: Java 8Spring BootSpring MVCMyBatis-PlusMySQL 8R…...

AI API、AI 聊天助手,两大服务助力应用智能化转型

网络效应、转换成本——这些一度定义了我们这个时代商业逻辑的规则,在 AI 时代迅速崩塌。创新性功能被无差别克隆包围,差异化优势在底层能力翻新中消散…… 更别说那些决策迟缓、行动无法言出法随的“后来者”,注定与市场窗口擦身而过。唯快…...

Windows 下搭建 Zephyr 开发环境

1. 系统要求 操作系统:Windows 10/11(64位)磁盘空间:至少 8GB 可用空间(Zephyr 及其工具链较大)权限:管理员权限(部分工具需要) 2. 安装必要工具 winget安装依赖工具&am…...

蓝桥杯单片机之通过实现同一个按键的短按与长按功能

实现按键的短按与长按的不同功能 问题分析 对于按键短按,通常是松开后实现其功能,而不会出现按下就进行后续的操作;而对于按键长按,则不太一样,按键长按可能分为两种情况,一是长按n秒后实现后续功能&…...