你真的会遍历树吗?Python中被严重低估的6种遍历模式全解析

Python标准库被低估的20个生产力模块实战指南 Python标准库远非过时的‘内置工具箱’,而是持续演进、工业级可靠的基础设施。从拓扑排序(graphlib)到时区处理(zoneinfo),从安全随机数(secrets)到面向对象路径操作(pathlib),这些模块以零依赖、高稳定性与精准API解决高频工程痛点。它们降低安全风险、减少版本冲突、压缩学习成本,并在金融数据清洗、IoT日志归档、自动化测试等真实场景中验证了显著提效价值。掌握这些被低估的内置能力,是构建轻量、健壮、可维护Python系统的底层关键。 阅读详情

第一章:树遍历的认知重构:从基础到高阶思维

在计算机科学中,树结构是表达层级关系的核心数据结构之一。掌握树的遍历方式,不仅是理解算法逻辑的基础,更是构建高阶抽象思维的关键一步。传统的遍历方法如前序、中序和后序,往往被初学者视为固定的代码模板,然而真正的认知重构在于理解其背后的递归本质与访问顺序的语义差异。

遍历的本质:递归与访问时机

树的遍历本质上是对节点的系统性访问过程,其核心在于“何时处理当前节点”。以二叉树为例,三种深度优先遍历的区别仅在于处理节点的时机:
  • 前序遍历:先处理根节点,再递归处理左右子树
  • 中序遍历:先处理左子树,再处理根节点,最后处理右子树
  • 后序遍历:先递归处理左右子树,最后处理根节点
// Go语言实现中序遍历(递归)
func inorder(root *TreeNode) {
    if root == nil {
        return
    }
    inorder(root.Left)     // 遍历左子树
    fmt.Println(root.Val)  // 处理当前节点(访问时机决定遍历类型)
    inorder(root.Right)    // 遍历右子树
}

从递归到迭代:显式栈的应用

当递归调用受限时,使用显式栈模拟调用栈成为必要手段。这一转变促使开发者深入理解函数调用机制与内存管理模型。
遍历方式递归特点迭代难点
前序自然直观需维护访问状态
中序适用于BST有序输出需模拟回溯路径
后序适合释放资源场景双栈或标记法复杂度高
graph TD A[开始遍历] --> B{节点非空?} B -->|是| C[压入栈并移至左子] B -->|否| D[弹出节点并访问] D --> E{有未访问右子?} E -->|是| F[移至右子并继续] E -->|否| G[结束]

第二章:经典递归遍历模式深度剖析

2.1 前序遍历:根-左-右的逻辑本质与应用场景

遍历逻辑的本质
前序遍历遵循“根节点 → 左子树 → 右子树”的访问顺序,确保父节点在子节点之前被处理。这种特性使其天然适用于需要优先捕获结构信息的场景。
递归实现示例

def preorder(root):
    if root:
        print(root.val)      # 访问根节点
        preorder(root.left)  # 遍历左子树
        preorder(root.right) # 遍历右子树
该递归代码清晰体现了前序遍历的执行流程:先处理当前节点数据,再依次深入左右子树。参数 root 表示当前子树根节点,通过空值判断实现递归终止。
典型应用场景
  • 二叉树的序列化与反序列化
  • 文件系统目录结构的深度优先扫描
  • 表达式树中操作符的前置输出(如波兰表示法)

2.2 中序遍历:二叉搜索树中的有序性奥秘

中序遍历的核心特性
在二叉搜索树(BST)中,中序遍历(左-根-右)展现出独特的有序性:输出的节点值严格按升序排列。这一性质源于BST的定义——左子树所有节点小于根,右子树所有节点大于根。
递归实现方式

def inorder(root):
    if root:
        inorder(root.left)      # 遍历左子树
        print(root.val)         # 访问根节点
        inorder(root.right)     # 遍历右子树
该函数通过递归深入左子树,逐层回溯输出节点值。参数 root 表示当前子树根节点,None 时终止递归。
典型应用场景对比
场景是否适用中序遍历
获取BST排序数据是
查找最大深度否

2.3 后序遍历:子节点优先处理的经典范式

遍历逻辑与执行顺序
后序遍历(Post-order Traversal)是一种深度优先的树遍历策略,其核心在于“先处理子节点,再访问根节点”。对于二叉树而言,遍历顺序为:左子树 → 右子树 → 根节点。这种模式特别适用于需要聚合子节点信息的场景,如计算文件夹大小或表达式树求值。
递归实现示例

func postOrder(root *TreeNode) {
    if root == nil {
        return
    }
    postOrder(root.Left)  // 遍历左子树
    postOrder(root.Right) // 遍历右子树
    fmt.Println(root.Val) // 访问根节点
}
该递归函数首先深入左、右子树完成所有子节点处理,最后输出当前节点值。参数 root 表示当前子树根节点,通过空指针判断实现递归终止。
典型应用场景
  • 删除二叉树:确保子节点先于父节点释放资源
  • 表达式树求值:先计算操作数,再执行运算符
  • 文件系统空间统计:累加子目录大小以得出父目录总量

2.4 递归实现原理与调用栈可视化分析

递归函数的执行机制
递归的本质是函数调用自身,每次调用都会在调用栈中压入一个新的栈帧。每个栈帧包含局部变量、返回地址和参数。当满足终止条件时,递归停止深入,开始逐层返回。
经典示例:计算阶乘
func factorial(n int) int {
    if n == 0 || n == 1 {
        return 1
    }
    return n * factorial(n-1) // 调用自身
}
该函数每次递归调用都将当前 n 值保存在栈帧中,直到 n == 1 触发回溯。例如 factorial(4) 的调用过程为:
factorial(4) → factorial(3) → factorial(2) → factorial(1),随后逐层返回结果。
调用栈状态可视化
调用层级n 值栈帧状态
14等待 factorial(3) 返回
23等待 factorial(2) 返回
32等待 factorial(1) 返回
41返回 1

2.5 实战:构建表达式解析树的遍历策略

在编译器设计中,表达式解析树是语法分析的核心数据结构。通过不同遍历策略,可实现求值、代码生成等操作。
遍历方式与应用场景
常见的遍历策略包括前序、中序和后序遍历:
  • 前序遍历:用于生成前缀表达式或序列化树结构
  • 中序遍历:还原原始表达式(需处理括号)
  • 后序遍历:适用于表达式求值与目标代码生成
后序求值实现示例

func evaluate(node *ExprNode) int {
    if node.isLeaf() {
        return node.value
    }
    left := evaluate(node.left)
    right := evaluate(node.right)
    switch node.op {
    case '+': return left + right
    case '*': return left * right
    }
    return 0
}
该函数递归执行后序遍历,先计算子树结果,再应用操作符。参数 node 表示当前节点,叶节点存储数值,内部节点存储操作符。此策略符合运算优先级,天然支持嵌套表达式。

第三章:迭代遍历的工程化实践

3.1 使用显式栈模拟递归过程

在递归调用中,系统隐式使用调用栈保存函数状态。为避免栈溢出或实现尾递归优化,可采用显式栈手动模拟递归流程。
核心思想
将递归函数的参数和状态封装为结构体,压入用户定义的栈中,通过循环迭代处理,从而替代函数自身调用。
代码实现

type StackFrame struct {
    n int
}

func factorial(n int) int {
    stack := []StackFrame{}
    result := 1
    stack = append(stack, StackFrame{n: n})

    for len(stack) > 0 {
        frame := stack[len(stack)-1]
        stack = stack[:len(stack)-1]

        if frame.n == 0 || frame.n == 1 {
            continue
        } else {
            result *= frame.n
            stack = append(stack, StackFrame{n: frame.n - 1})
        }
    }
    return result
}
上述代码将阶乘递归转换为迭代。每次将待处理的参数压栈,循环中弹出并更新结果。相比原递归,避免了深层调用栈带来的溢出风险,同时保留逻辑清晰性。

3.2 统一框架实现三种遍历顺序

在二叉树遍历中,前序、中序和后序三种顺序可通过统一的迭代框架实现,核心在于使用栈模拟递归过程,并通过标记机制区分访问节点与处理值的时机。
统一处理逻辑
将节点入栈时附加标志位,`false` 表示待展开,`true` 表示可输出。仅当标志为 `true` 时将值加入结果集,否则按遍历顺序反向压入右子、左子及当前节点。

func inorderTraversal(root *TreeNode) []int {
    var result []int
    var stack = [][2]interface{}{[2]interface{}{root, false}}
    
    for len(stack) > 0 {
        node, visited := stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        
        if node == nil { continue }
        if visited {
            result = append(result, node.(*TreeNode).Val)
        } else {
            stack = append(stack,
                [2]interface{}{node.(*TreeNode).Right, false},
                [2]interface{}{node, true},
                [2]interface{}{node.(*TreeNode).Left, false},
            )
        }
    }
    return result
}
该代码适用于中序遍历;调整压栈顺序即可适配前序(中→左→右)或后序(左→右→中),实现三者统一框架。

3.3 迭代方案在内存敏感场景的优势对比

内存占用的动态控制
在资源受限环境中,迭代方案通过逐批次处理数据,显著降低峰值内存使用。相比一次性加载全部数据的递归或批量处理模式,迭代器按需生成结果,避免冗余对象驻留内存。
性能对比示例

func ProcessLargeDataset(iter Iterator) {
    for iter.HasNext() {
        item := iter.Next()
        // 处理单个元素,无需缓存整体
        process(item)
    }
}
上述代码中,Iterator 接口封装了数据源的逐步访问逻辑。每次仅加载一个 item,处理完成后即可被垃圾回收,极大缓解堆内存压力。
资源效率量化分析
方案峰值内存适用场景
批量加载高计算密集型
迭代处理低内存敏感型

第四章:广度优先与混合遍历创新模式

4.1 层序遍历:队列驱动的横向扫描技术

层序遍历,又称广度优先遍历,是二叉树遍历中实现横向扫描的核心技术。其核心思想是按层级从上到下、从左到右访问每个节点,这依赖于队列的先进先出(FIFO)特性来保证访问顺序。
算法流程解析
初始将根节点入队,随后循环执行:出队一个节点,访问其值,并将其左右子节点依次入队,直至队列为空。
代码实现

type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}

func levelOrder(root *TreeNode) []int {
    if root == nil {
        return nil
    }
    var result []int
    queue := []*TreeNode{root}
    
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        result = append(result, node.Val)
        
        if node.Left != nil {
            queue = append(queue, node.Left)
        }
        if node.Right != nil {
            queue = append(queue, node.Right)
        }
    }
    return result
}
上述代码通过切片模拟队列,每次取出首元素并将其子节点追加至尾部,确保层级顺序。参数 `root` 为二叉树根节点,返回值为按层序排列的节点值列表。

4.2 Zigzag遍历:双端队列实现之字形输出

在二叉树的层序遍历中,Zigzag遍历要求交替输出每层节点,形成“之”字形路径。与普通队列不同,双端队列(deque)支持两端插入与删除,是实现方向切换的理想结构。
核心逻辑
使用布尔标志控制遍历方向:若从左向右,从队列前端取出节点,并将子节点按左→右顺序加入尾部;反之则从后取节点,子节点按右→左加入前端。

func zigzagLevelOrder(root *TreeNode) [][]int {
    if root == nil { return nil }
    var result [][]int
    deque := list.New()
    deque.PushBack(root)
    leftToRight := true

    for deque.Len() > 0 {
        levelSize := deque.Len()
        levelNodes := make([]int, 0, levelSize)

        for i := 0; i < levelSize; i++ {
            if leftToRight {
                front := deque.Remove(deque.Front()).(*TreeNode)
                levelNodes = append(levelNodes, front.Val)
                if front.Left != nil { deque.PushBack(front.Left) }
                if front.Right != nil { deque.PushBack(front.Right) }
            } else {
                back := deque.Remove(deque.Back()).(*TreeNode)
                levelNodes = append(levelNodes, back.Val)
                if back.Right != nil { deque.PushFront(back.Right) }
                if back.Left != nil { deque.PushFront(back.Left) }
            }
        }
        result = append(result, levelNodes)
        leftToRight = !leftToRight
    }
    return result
}
上述代码通过双端队列动态调整节点进出方向,实现层级间反向输出。每次循环结束时翻转方向标志,确保下一层遍历方向正确切换。

4.3 边界遍历:前序与后序的协同组合艺术

在二叉树的边界遍历中,前序与后序遍历的协同运用展现出独特的算法美感。通过前序遍历收集左边界节点,后序遍历捕获右边界路径,可高效构建完整的边界序列。
核心遍历策略
  • 前序遍历:优先访问左边界非叶子节点
  • 后序遍历:逆序收集右边界路径
  • 叶节点统一判定,避免重复加入
代码实现

func boundaryTraversal(root *TreeNode) []int {
    if root == nil { return []int{} }
    var leftBoundary, leaves, rightBoundary []int

    // 前序收集左边界
    collectLeftBoundary(root, &leftBoundary)
    // 后序收集右边界
    collectRightBoundary(root, &rightBoundary)
    // 中序收集叶节点
    collectLeaves(root, &leaves)

    // 合并结果,注意去重根节点和叶节点
    return append(append(leftBoundary, leaves...), reverse(rightBoundary)...)
}

该函数通过三阶段遍历分别捕获边界元素。前序确保左边界自上而下,后序保障右边界自底向上,最终合并时需反转右边界数组以维持顺时针顺序。

4.4 垂直遍历:哈希表辅助的列索引重构

在二叉树的垂直遍历中,节点按其水平偏移量(列索引)分组输出。通过哈希表记录每一列的节点值,可高效实现列索引重构。
算法核心思路
使用哈希表 map[int][]int 存储列索引到节点值列表的映射,结合 DFS 遍历维护当前节点的行列坐标。

func verticalOrder(root *TreeNode) [][]int {
    if root == nil { return [][]int{} }
    
    colMap := make(map[int][]int)
    queue := [][2]*TreeNode{{root, 0}}
    
    for len(queue) > 0 {
        node, col := queue[0][0], queue[0][1]
        queue = queue[1:]
        
        colMap[col] = append(colMap[col], node.Val)
        
        if node.Left != nil {
            queue = append(queue, [2]*TreeNode{node.Left, col - 1})
        }
        if node.Right != nil {
            queue = append(queue, [2]*TreeNode{node.Right, col + 1})
        }
    }
    
    // 按列索引排序输出
    var cols []int
    for k := range colMap {
        cols = append(cols, k)
    }
    sort.Ints(cols)
    
    var result [][]int
    for _, c := range cols {
        result = append(result, colMap[c])
    }
    return result
}

逻辑分析:利用 BFS 确保同一列中上方节点先被访问;哈希表动态收集各列节点,最后按列排序输出。

时间与空间复杂度
  • 时间复杂度:O(n log n),其中排序列索引占主导
  • 空间复杂度:O(n),哈希表与队列存储所有节点

第五章:结语:重新定义你对“遍历”的理解

超越线性思维的遍历模式

在现代系统设计中,遍历不再局限于数组或链表的顺序访问。例如,在分布式文件系统中,遍历可能涉及跨节点的数据拉取与合并。以下 Go 代码展示了如何通过递归与并发结合的方式遍历一个模拟的分布式目录结构:

func traverseDistributedDir(nodes []string, path string, results chan<- string) {
    var wg sync.WaitGroup
    for _, node := range nodes {
        wg.Add(1)
        go func(n string) {
            defer wg.Done()
            // 模拟远程调用获取子路径
            subPaths := fetchFromNode(n, path)
            for _, p := range subPaths {
                results <- p
            }
        }(node)
    }
    go func() {
        wg.Wait()
        close(results)
    }()
}
遍历策略的实际选型对比

不同场景下应选择不同的遍历策略。下表总结了常见数据结构与对应的最优遍历方式:

数据结构典型遍历方式适用场景
二叉树中序/后序递归表达式求值、AST 解析
图(社交网络)BFS + 剪枝好友推荐、关系发现
嵌套 JSON栈式迭代API 响应解析、动态过滤
从数据库索引到内存视图的遍历优化
  • 使用 B+ 树索引跳过无效记录,减少 I/O 次数
  • 在内存中构建稀疏索引,加速范围查询的遍历起点定位
  • 利用 SIMD 指令并行处理连续数据块,提升遍历吞吐量
六个被低估的Python幽灵库:解决真实世界脏数据与边缘AI部署难题 在Python工程实践中,标准库和主流框架常在非结构化数据清洗、轻量化AI部署、系统级可靠性等场景暴露结构性短板。dateparser通过多语言状态机与模糊词典,实现自然语言时间表达式的鲁棒解析;pix2text将PDF智能分类、自适应OCR增强与表格点云聚类封装为端到端工作流,攻克扫描件表格提取最后一公里。这类‘幽灵库’不追求通用性,而专注解决教科书不写、但产线天天遭遇的脏活——如Excel混排日期转换、树莓派语音转文字、邮件服务器可达性验证。它们的价值在于用极简接口封装高复杂度边缘case处理逻辑,成为 阅读详情

相关推荐

Python字符串包含判断:5种方法原理、性能与边界场景全解析

字符串包含判断是编程中最基础也最易出错的操作之一,其本质涉及Unicode编码、内存模型与算法优化。理解`in`运算符触发的`__contains__`协议、`str.find()`与`str.index()`的异常开销差异、正则匹配的编译代价,以及`bytes`与`str`在底层匹配逻辑上的根本区别,是写出高性能、高鲁棒代码的前提。尤其在处理中文、emoji、不可见字符、大小写混合及多语言文本时,Unicode规范化(NFC/NFD)、零宽字符清理、BOM识别等细节直接决定逻辑正确性。本文聚焦Python

weixin_34234721的博客 362

三种遍历方式

常用的三种遍历方式 1.普通的for循环遍历:适用于有索引的遍历对象 2.迭代器遍历:集合所特有的 3.增强for循环遍历:使用于数组和Collection集合,也是最简便的遍历方式 注意:这三种遍历方式中,只有2是可以对遍历时原数据作修改,1和3都是不允许在遍历时修改原数据的,只能遍历输出,仅此而已。(切记) ...

qq_45739945的博客 8361

Python副业变现指南:10大接单平台与实战技能栈全解析

Python作为一门语法简洁、应用广泛的高级编程语言,其核心价值在于将复杂任务自动化,显著提升工作效率。从数据处理、网络爬虫到Web开发,Python通过丰富的库和框架(如Pandas、Flask)覆盖了数据分析、办公自动化和轻量级应用构建等核心场景。掌握这些技术,不仅能解决日常工作中的重复劳动问题,更能将技能转化为实际收益,通过接私活实现副业变现。本文聚焦Python技能变现,深入剖析了包括猪八戒网、Upwork在内的10个主流接单平台的特点与策略,并系统拆解了从基础自动化到Web开发的全栈技能学习路径,

weixin_34356310的博客 477

遍历的几种方式及用法

一、for()方法: 执行顺序:先执行条件一,再看条件一是否满足条件二的判断,如果满足则进入循环,反之则不进入循环,如果进入循环里则执行循环体里面的内容,最后再执行条件三。 例: for(条件一;条件二;条件三){ //循环体 } let arr = [1,2,3,4,5,6] for(let i=0;i<arr.hength;i++){ console.log(i) if(i === 2){ continue } } break; //语句时,会结束当前的循环,执行循环后面(外边

youzhiji的博客 4630

C++ Builder 6 源代码深度解析:从经典VCL框架到现代工程实践

在桌面应用开发领域,快速应用开发(RAD)框架通过可视化组件和事件驱动编程,极大提升了软件构建效率。其核心原理在于将界面设计与业务逻辑分离,通过封装底层系统API(如Windows消息机制和图形设备接口)为可重用的控件库。这种范式不仅加速了原型开发,更在企业级应用、工控系统和数据库前端等场景中证明了其工程价值。以经典的VCL框架为例,它代表了RAD理念在C++环境下的高峰实践。本文聚焦于对C++ Builder 6(BCB6)这一特定历史版本所附带的示例源代码进行体系化研究,旨在挖掘其中关于**数据库访问层

weixin_34163553的博客 331

Python range() 深度解析:不是列表,而是惰性整数序列生成器

range() 是 Python 中最常用却最易被误解的内置构造之一,它并非返回数字列表,而是一个遵循序列协议的惰性整数生成器。其核心原理基于 start/stop/step 三参数的算术规则,采用 O(1) 边界判断与按需计算,实现近乎零内存开销的超大范围遍历。这种设计赋予了它在索引遍历、分页控制、内存敏感场景(如树莓派或日志采样)中的不可替代性;同时支撑高效 in 检查、切片和跨库协作(如 NumPy 索引)。理解 range 的排他性 stop 和步长符号逻辑,是规避 off-by-one 错误、写出

weixin_30729609的博客 418

设计模式(一)-迭代器模式(Iterator Pattern)——一个一个遍历

迭代器模式(Iterator Pattern)是 非常常用的设计模式。 用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 示例: Iterator.java package com.test.dp.iterator; //迭代器实现的接口 public interface Iterator { public abstract bool

u014378181的博客 659

DIY便携式PEMF磁脉冲治疗仪:百元成本自制生物物理疗法设备

脉冲电磁场(PEMF)疗法是一种基于生物物理原理的非侵入性技术,它通过特定频率的电磁脉冲作用于细胞层面,影响细胞膜电位和离子通道活动,从而可能调节细胞代谢与功能。其技术价值在于提供了一种物理干预手段,在健康科技和生物黑客领域被探索用于放松、恢复等场景。实现PEMF的核心是通过信号发生与功率放大驱动电磁线圈产生可控磁场。本文以蓝牙音频模块和智能手机App为切入点,详细解析了如何利用低成本电子元件(如DFRobot XY-WRBT模块和漆包线线圈)构建一个可自定义频率的便携式PEMF设备,涵盖了从电路设计、线圈

weixin_31476015的博客 352

图解设计模式之Iterator模式————一个一个遍历

1、Iterator模式    使用java语言显示数组arr中的元素时,我们可以使用下面这样的for循环语句来遍历数组。for (int i = 0,l = arr.length; i &lt; l; i++){ System.out.println(arr[i]); }         请注意这段代码中的循环变量i。该变量的初始值是0,然后会递增为1,2,3,。。。,程...

Chenjay‘s Blog 1015

【XR硬件介绍】PICO Space Pro(Project Swan)深度解析:字节 2026 旗舰 MR 头显延期背后

内部代号 Project Swan 的 PICO 年度旗舰 MR 头显正式定名PICO Space Pro,原本计划 2026 年 9 月对外发布,官方官宣推迟至 2026 年第四季度上市。硬件层面已经完成 FCC 认证,硬件成熟度较高,延期核心目标是打磨 PICO OS 6 空间操作系统,补齐空间计算软件能力。本文从产品背景、硬件架构、软件生态、延期逻辑、行业竞争格局几个维度拆解这款国产高端 MR 设备,分析它对国内 XR 产业的意义与待解的问题。

houdou112358的博客 1246

机器人手眼标定快速精度验证方法

机器人手眼标定快速精度验证方法

laoli_的博客 1万+

遍历设计模式

1.简单工厂: 1.是什么:用一个单独的类来做创造实例的过程就是工厂,简单工厂模式不符合开放-封闭原则,每一次扩展时都需要更改工厂类,下面是简单运算工厂类,只要输入运算符号,这个类就实例化出合适的对象。 2.扩展:所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合。 3.优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的

技术黑板 1787

如何用AP525 测试输入信号的相位,频响,延时,Pop和卡顿

假设信号不是从AP输出,是功放或者其他的播放设备输出的信号,接入到AP525的输入端。

帮助100万人颠覆负面潜意识,实现人生蜕变,培养1万名潜意识开发导师 2406

20个被低估的Python内置库:替代第三方依赖的生产级方案

Python内置库是标准安装即用的核心能力集合,涵盖路径操作、数值计算、网络协议、时区处理等基础领域。其原理基于CPython原生实现,具备零依赖、高安全性与跨平台一致性优势。技术价值在于降低部署复杂度、规避pip冲突、通过C层优化提升性能,并满足金融、IoT、CI/CD等场景对精度、原子性与合规性的严苛要求。典型应用场景包括用pathlib替代os.path实现安全路径解析、statistics.fmean规避浮点累积误差、ipaddress高效校验百万级IP段、zoneinfo标准化时区转换、secre

weixin_34320159的博客 323

彻底解决Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource

Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource

renkai721的专栏 24万+

视觉媒体通信作业记录(六)端到端的视频传输系统

将采集、编码、传输、显示各模块连接起来,形成一个端到端的视频通信系统,开发一个特色模块,将其加入系统;

weixin_45774698的博客 1967

Python Tar文件安全:Bandit B202插件防范路径遍历攻击

在Python开发中,文件处理是常见的基础操作,其中Tar文件归档与解压广泛应用于数据打包、部署脚本等场景。其核心原理是通过tarfile模块对归档文件进行读写操作,但默认的解压行为存在安全风险,尤其是路径遍历漏洞,可能导致敏感文件泄露或系统被入侵。从技术价值看,安全编码实践是保障应用稳定性的关键环节,能有效防范恶意输入引发的安全事件。在应用场景上,无论是Web应用处理用户上传、自动化脚本解压数据包,还是CI/CD流水线中的资源部署,都需要对Tar文件操作进行安全加固。本文聚焦于使用Bandit静态代码分析

weixin_34099526的博客 386

【制作100个Unity游戏之36】用unity从零开始实现类《开心消消乐》的三消类消除解压小游戏

Unity甜品消除游戏开发摘要 本文介绍了使用Unity开发甜品消除游戏的核心实现步骤: 冰块阵列生成 通过GlobalDef定义全局参数(9行7列网格) IceSpawner脚本动态生成网格化冰块阵列 添加Resolution脚本实现多分辨率适配 随机水果生成 创建FruitSpawner作为水果容器 FruitItem脚本管理水果属性(行列索引、类型) 支持动态创建水果精灵并设置位置 关键技术点 使用Instantiate动态生成预制体 通过localPosition精确控制网格布局 分辨率适配算法保持

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1292

Pandas 5个被低估的高效技巧:从数据清洗到条件格式化

Pandas是Python数据分析的核心库,其本质是基于内存视图、块管理和延迟计算的高性能数据结构框架。理解DataFrame底层机制,有助于规避SettingWithCopyWarning、MemoryError等高频工程问题,并释放向量化计算与链式操作的技术价值。在金融风控、电商用户行为分析等真实场景中,.pipe()实现可调试的数据流编排,.query()作为布尔索引的高效编译器显著提升过滤性能,slice(None)保障多维索引切片的安全性,.agg()字典协议支持混合聚合,.style.forma

weixin_30457551的博客 420

uniapp - 最新微信小程序手机号一键登录功能效果,uniapp小程序实现手机号码一键登录,uniapp微信小程序端通过手机号授权完成立即登录操作(详细示例源码,新手小白一键复制开箱即用)

uniapp,微信小程序,uniapp小程序平台,uniApp手机号一键登录,uniapp小程序端手机号一键登录功能,实现微信小程序手机号一键登录,在uniapp中实现获取手机一键登录功能,uniapp手机号快捷登录,uniapp微信小程序授权登录并获取手机号,微信小程序手机号快速验证组件调用方式,uniapp小程序怎么用手机号一键登录,uniapp一键登录流程及代码,如何获取手机号一键登录到小程序,微信小程序获取本机手机号一键登录功能,新手详细教程,详细手机一键登录完整示例代码,uni-app微信unia

✅ 精选推荐文章 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python enumerate函数深度解析:安全索引遍历与性能优化

在Python中,遍历序列时同时获取索引和元素是高频需求,但直接使用range(len())易引发越界、逻辑脱钩与可维护性问题。enumerate()作为内置迭代工具,其核心价值在于将索引与元素进行内存级强绑定,避免重复查找、保证引用一致性,并天然支持start偏移与惰性求值。它不仅提升代码可读性与健壮性,更在日志处理、流式数据、嵌套结构解析等工程场景中显著降低bug率。本文结合字节码行为、真实压测数据及7类高阶用法,系统阐释enumerate为何是‘索引-值协同遍历’的唯一合理选择。

weixin_30706691的博客 399

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python enumerate 教程:带索引遍历的原理、陷阱与7大实战场景

enumerate 是 Python 中实现带索引遍历的核心内置函数,其本质是遵循迭代器协议的惰性计数器封装,而非简单元组生成器。它通过将可迭代对象与整数序列(如 itertools.count)配对,提供内存友好、协议兼容、语义清晰的索引访问能力。相比手动计数或 range(len()),enumerate 显著提升代码可读性、减少变量污染与逻辑耦合,并天然适配生成器、文件流等无长度对象。在数据清洗、日志解析、特征编码、嵌套结构处理等工程场景中,它支撑精准行号标记、错误定位、字典映射构建等关键任务。本文深

462

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

为什么90%的Python项目忽略安全审计?:揭秘被低估的4大开源工具

掌握Python安全审计工具,有效防范代码漏洞。本文揭秘4款被低估的开源工具,适用于Web开发、依赖检测等场景,支持自动化扫描与深度分析,助力开发者提升项目安全性。方法实用,值得收藏。

DeepNest的博客 417

N皇后遗传算法实战:从Python实现到参数调优全解析

遗传算法(GA)是一种基于自然选择与群体进化的全局优化方法,其核心在于编码设计、适应度函数构建、选择与变异策略的协同。在实际工程中,N皇后问题因其组合爆炸性与解的可解释性,成为验证GA机制的理想载体——它将抽象的‘染色体’‘适应度’‘进化代数’等概念具象为棋盘上的皇后布局与冲突计数。本文聚焦GA落地的关键实践:如何用Python实现轻量、可调试的完整流程;为何采用排列编码而非二进制编码;为什么1/(q+0.001)比线性适应度更能驱动收敛;以及种群规模、变异强度等参数如何随问题规模动态适配。内容覆盖从4皇后

weixin_34284188的博客 409

Python列表核心方法与函数实战指南:append、sort、index、max全解析

列表(list)是Python最基础且高频使用的内置数据结构,其本质是动态数组,支持O(1)索引访问与追加,但插入、查找等操作为O(n)时间复杂度。理解`append()`与`extend()`的语义差异(单元素添加 vs 可迭代对象展开)、`sort()`原地排序与`sorted()`生成副本的根本区别、`index()`的异常风险及`max()`/`min()`的`key`参数高级用法,直接决定代码的健壮性与可维护性。这些能力广泛应用于数据清洗、电商价格分析、日志处理与金融风控等真实工程场景。本文聚焦P

weixin_34121304的博客 381

AST还原JS混淆:反爬中静态解析加密逻辑的核心方法

JavaScript混淆是Web反爬的常见手段,其本质是通过变量重命名、控制流扁平化等技术掩盖纯计算型加密逻辑(如sign、token生成)。传统方案依赖Selenium或js2py动态执行,效率低、难维护;而AST(抽象语法树)作为代码的结构化表示,可绕过运行时环境,直接对JS源码做静态分析——精准提取Literal字面量、MemberExpression数组索引、BinaryExpression拼接关系等关键节点。该方法不依赖浏览器、无需模拟DOM,特别适用于base64、MD5、时间戳拼接等确定性算法

weixin_33725126的博客 1039
上一篇: 从Python 3.8到3.13,兼容性陷阱全解析,开发者必看的5大雷区
下一篇: 还在用Swagger?你可能不知道的FastAPI ReDoc 7大隐藏功能
QuickDebug
博客等级 码龄1年 152粉丝 2013原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值