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

《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性

引言

本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》一书的 Chapter 3: Loops and Iterators 中的 Item 21: Be Defensive when Iterating over Arguments。该条目深入探讨了在 Python 中处理迭代器(iterator)和容器(container)时可能遇到的陷阱,以及如何通过“防御式编程”避免因错误使用迭代器而导致的数据丢失或逻辑异常。

Python 的 for 循环和生成器机制非常强大且灵活,但在实际开发中,如果对迭代器的理解不够深入,很容易写出看似正确、实则有严重隐患的代码。尤其是在函数参数设计上,若不加防范地接受并多次遍历一个迭代器,会导致程序行为异常甚至数据完全丢失。

本文将从以下几个方面展开讨论:

  • 为什么多次遍历同一个迭代器会出问题?
  • 如何安全地处理可迭代对象?
  • 怎样识别和拒绝非法的输入类型?
  • 自定义可迭代容器类的设计与实现。
  • 在实际项目中如何规避此类风险?

这些内容不仅适用于初学者理解 Python 的迭代器协议,也适合经验丰富的开发者在构建稳健系统时参考。


1. 为什么多次遍历同一个迭代器会出问题?

引导问题: 如果我传入一个生成器作为参数,为什么在函数内部第一次遍历后就再也得不到数据?

在 Python 中,迭代器(iterator)是一种一次性消费的对象。一旦它被耗尽(即抛出了 StopIteration 异常),就不能再次使用。例如下面这个例子:

def read_visits(data_path):with open(data_path) as f:for line in f:yield int(line)it = read_visits("my_numbers.txt")
print(list(it))  # [15, 35, 80]
print(list(it))  # []

可以看到,第二次调用 list(it) 时返回的是空列表,说明迭代器已经被耗尽了。如果你在一个函数中需要多次遍历这个迭代器(比如先求总和,再计算每个值的百分比),就会遇到问题。

常见误区与后果

很多开发者误以为“能遍历一次就能遍历多次”,于是写出了类似下面的函数:

def normalize(numbers):total = sum(numbers)result = []for value in numbers:percent = 100 * value / totalresult.append(percent)return result

乍看之下没有问题,但如果传入的是一个生成器(如上面的 read_visits() 返回值),那么 sum(numbers) 已经将迭代器耗尽,后面的 for 循环就无法获取任何数据,最终返回一个空列表!

这种 bug 非常隐蔽,因为不会抛出异常,也不会报错,只是结果不对,排查起来非常困难。

生活化类比

可以把迭代器想象成一条单程传送带。你只能从头到尾走一次,一旦走到尽头,就不能回头再取东西。而容器就像一个仓库,你可以随时进去查看、拿取,重复访问也没问题。


2. 如何安全地处理可迭代对象?

引导问题: 我想多次遍历输入数据,但又不想一次性加载所有数据到内存中,该怎么办?

面对这个问题,常见的解决思路有以下几种:

方法一:复制迭代器为列表

最直接的方式是将输入迭代器转换为列表,这样就可以反复使用:

def normalize_copy(numbers):numbers_copy = list(numbers)total = sum(numbers_copy)result = []for value in numbers_copy:percent = 100 * value / totalresult.append(percent)return result

这种方法简单有效,但存在潜在的性能问题:如果数据量很大,可能会占用大量内存,甚至导致程序崩溃。

方法二:传入返回新迭代器的函数

为了避免一次性加载全部数据,可以传递一个函数,每次调用都返回一个新的迭代器:

def normalize_func(get_iter):total = sum(get_iter())result = []for value in get_iter():percent = 100 * value / totalresult.append(percent)return resultnormalize_func(lambda: read_visits(path))

这种方式适用于大数据流处理,内存效率高,但语法略显繁琐,不够直观。

方法三:自定义可迭代容器类

更优雅的做法是定义一个实现了iter()方法的容器类,每次调用 iter() 都会返回新的迭代器对象:

class ReadVisits:def __init__(self, data_path):self.data_path = data_pathdef __iter__(self):with open(self.data_path) as f:for line in f:yield int(line)

这样,无论是 sum(numbers) 还是 for value in numbers:,都能独立获取完整的数据流。


3. 如何检测并拒绝非法的迭代器输入?

引导问题: 我希望我的函数只接受容器对象,而不是迭代器,该如何判断并拒绝非法输入?

Python 的迭代器协议规定:如果一个对象是迭代器,那么 iter(obj) is obj 成立;如果是容器,则每次调用 iter(obj) 都会返回一个新的迭代器对象。

我们可以利用这一点来检测输入是否合法:

def normalize_defensive(numbers):if iter(numbers) is numbers:raise TypeError("必须提供一个容器,而不是迭代器")total = sum(numbers)result = []for value in numbers:percent = 100 * value / totalresult.append(percent)return result

或者使用标准库中的 collections.abc.Iterator 类进行类型检查:

from collections.abc import Iteratordef normalize_defensive(numbers):if isinstance(numbers, Iterator):raise TypeError("必须提供一个容器,而不是迭代器")...

这两种方式都可以有效地防止用户传入一个已经耗尽的迭代器,从而避免出现“无数据”的诡异现象。


4. 实战案例与最佳实践总结

引导问题: 在实际开发中,我们该如何设计函数接口以确保健壮性和可维护性?

案例分析:数据分析管道中的迭代器陷阱

假设你在开发一个日志分析系统,需要读取多个大文件,并统计关键词出现频率。你可能会这样设计函数:

def count_keywords(log_stream):total = sum(1 for _ in log_stream)counts = Counter()for line in log_stream:for word in line.split():counts[word] += 1return {k: v / total for k, v in counts.items()}

这段代码看起来没问题,但如果 log_stream 是一个生成器,那么 sum() 已经把它耗尽,后续的 for 循环就不会有任何数据!这就是典型的“一次性迭代器陷阱”。

最佳实践建议

  1. 优先接收容器对象而非迭代器

    • 函数应尽量接受 list, tuple, 或者自定义容器类,而不是迭代器。
    • 若确实需要延迟加载数据,应使用返回新迭代器的函数(如 lambda 表达式)。
  2. 防御性地检测输入类型

    • 使用 isinstance(numbers, Iterator) 来识别非法输入。
    • 明确抛出 TypeError,提升错误提示的可读性。
  3. 合理使用生成器与容器类

    • 对于大数据流,推荐使用生成器逐行处理,避免内存溢出。
    • 若需多次遍历,建议封装为支持 __iter__的容器类。
  4. 文档与测试覆盖

    • 在函数 docstring 中明确说明接受的参数类型。
    • 编写单元测试验证各种输入情况,包括边界条件。

总结

本文围绕《Effective Python》第 3 章 Item 21 “Be Defensive when Iterating over Arguments” 展开,系统梳理了在 Python 中处理迭代器和容器时的常见问题及应对策略。

通过学习我们知道:

  • 迭代器是一次性的,不能重复使用;
  • 容器类支持多次遍历,是更安全的选择;
  • 防御性编程有助于提前发现并拒绝非法输入;
  • 自定义可迭代容器类是一种优雅的设计模式;
  • 函数参数设计要清晰明确,避免歧义和隐藏风险。

这些知识不仅帮助我们写出更健壮的代码,也加深了对 Python 迭代器协议的理解。无论是在日常开发还是面试准备中,都是值得掌握的核心技能。

后续我会继续分享更多关于《Effective Python》精读笔记系列,参考我的代码库 effective_python_3rd,一起交流成长!

相关文章:

《Effective Python》第三章 循环和迭代器——在遍历参数时保持防御性

引言 本文基于《Effective Python: 125 Specific Ways to Write Better Python, 3rd Edition》一书的 Chapter 3: Loops and Iterators 中的 Item 21: Be Defensive when Iterating over Arguments。该条目深入探讨了在 Python 中处理迭代器(iterator)和…...

【python基础知识】Day30 模块和库的导入

学习python 学习python基础语法 处理任务需要用到的库 一、导入官方库的三种手段 1 标准导入:导入整个库 # 方式1:导入整个模块 import math# 导入库后,输出测试 print("方式1:使用 import math") print(f"圆周率…...

leetcode hot100刷题日记——4.盛最多水的容器

解答&#xff1a; 我的思路&#xff1a; class Solution{public:int maxArea(vector<int>& height){//遍历&#xff0c;我暴力找一下,时间超限// int vol0;// for(int i0;i<height.size()-1;i){// for(int ji1;j<height.size();j){// volmax(vol,…...

大二周周练翻译

翻译题 文章目录 翻译题[toc]中国茶道数字经济茶马古道中国父母现状电子商务长城大学生就业一带一路中国结 相遇的意义&#xff0c;是被你改变的那部分的我&#xff0c;代替你永远陪在我身边 点个赞呗&#xff01; 中国茶道 China is a country with a time-honored civilizat…...

深度学习————模型保存与部署

第一部分&#xff1a;模型保存基础 什么是模型保存&#xff1f; 当你训练好一个深度学习模型后&#xff0c;它会拥有“学习到的参数”&#xff0c;这些参数&#xff08;权重、偏置等&#xff09;构成了模型的“知识”。如果不保存这些参数&#xff0c;那么训练好的模型在关闭…...

5G金融互联:迈向未来金融服务的极速与智能新时代

5G金融互联:迈向未来金融服务的极速与智能新时代 大家好,我是Echo_Wish,今天咱们聊聊一个大家都十分关心的话题:5G网络在金融服务中的应用。咱们平时可能觉得5G只是打个电话、刷个视频更流畅了,但在金融服务领域,5G的低延时、大带宽和高可靠性正在悄然改变整个游戏规则。…...

交易所开发:构建功能完备的金融基础设施全流程指南

交易所开发&#xff1a;构建功能完备的金融基础设施全流程指南 ——从技术架构到合规安全的系统性解决方案 一、开发流程&#xff1a;从需求分析到运维优化 开发一款功能完备的交易所需要遵循全生命周期管理理念&#xff0c;涵盖市场定位、技术实现、安全防护和持续迭代四大阶…...

Icecream Video Editor:简单易用的视频编辑软件,轻松打造专业视频

Icecream Video Editor 是一款简单易用的视频编辑软件&#xff0c;专为希望快速、高效编辑视频的用户设计。它提供了丰富的功能&#xff0c;包括视频剪辑、效果应用、音频处理和视频导出&#xff0c;满足用户在不同场景下的需求。无论是视频新手还是有一定基础的创作者&#xf…...

论文阅读--Logical quantum processor based on reconfigurable atom arrays

论文主要内容 研究背景与目标&#xff1a; 论文提出了一种基于可重构中性原子阵列的逻辑量子处理器&#xff0c;旨在通过量子纠错&#xff08;QEC&#xff09;和逻辑量子比特编码&#xff0c;解决物理量子比特的噪声限制问题。该处理器结合高保真度逻辑门操作、任意连接性和实时…...

安防综合管理系统EasyCVR视频融合平台安防知识:门禁系统与视频监控系统如何联动?

在现代安防体系中&#xff0c;视频监控与门禁系统是两大核心。前者实时记录画面&#xff0c;为安全事件追溯提供依据&#xff1b;后者精准管控人员出入。二者联动可提升安防智能化水平&#xff0c;实现门禁点图像抓拍与实时监视&#xff0c;在安全事件发生时快速整合信息&#…...

微机系统第二章-题目整理

80x86标志寄存器中ZF位等于1&#xff0c;说明( )。 A A&#xff0e;运算结果等于0 B. 运算结果大于0 C. 运算结果不等于0 D.运算结果溢出 8086CPU由哪两大部分组成&#xff1f;简述它们的主要功能。 总线接口部件BIU跟执行部件EU。 总线接口部件&#xff08;BIU&…...

w~自动驾驶合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12371169 #世界模型和DriveGPT这类大模型到底能给自动驾驶带来什么ne 以下分享大模型与自动驾驶结合的相关工作9篇论 1、ADAPT ADAPT: Action-aware Driving Caption Transformer&#xff08;ICRA2023&#xff09; AD…...

嵌入式学习的第二十三天-数据结构-树+哈希表+内核链表

一、树&#xff08;一对多&#xff09; 1.树的定义 树&#xff1a;n&#xff08;n>0&#xff09;个结点的有限集合。n 0 ,空树。 2.在任意一个非空树中&#xff0c; (1)&#xff0c;有且仅有一个特定的根结点 (2)&#xff0c;当n>1 时&#xff0c;其余结点可分为m个…...

互联网大厂Java求职面试:Spring AI与大模型交互的高级模式与自定义开发

互联网大厂Java求职面试&#xff1a;Spring AI与大模型交互的高级模式与自定义开发 在当今技术领域&#xff0c;随着AI和大模型技术的广泛应用&#xff0c;如何在复杂的系统架构中高效地集成这些技术成为了各大互联网公司关注的重点。本文将通过一场模拟的面试对话&#xff0c…...

Ansible模块——主机名设置和用户/用户组管理

设置主机名 ansible.builtin.hostname: name&#xff1a;要设置的主机名 use&#xff1a;更新主机名的方式&#xff08;默认会自动选择&#xff0c;不指定的话&#xff0c;物理机一般不会有问题&#xff0c;容器可能会有问题&#xff0c;一般是让它默认选择&#xff09; syst…...

lowcoder数据库操作1:链接目标数据库

比如我使用的是PostgreSQL&#xff0c;要链接到数据库。 步骤1&#xff0c;Data Sources 步骤2, New data source 步骤3&#xff0c;选择PostgreSQL 步骤4&#xff0c;输入各种信息 命名&#xff0c;数据库所在的IP&#xff0c;端口&#xff0c;库名&#xff0c;用户密码。 步…...

R9打卡——RNN实现阿尔茨海默病诊断(优化特征选择版)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn.functional as F import seaborn as sns#设置GPU训…...

Label Studio:开源标注神器

目录 一、Label Studio 是什么&#xff1f; 二、核心功能大揭秘 2.1 多类型数据全兼容 2.2 个性化定制随心配 2.3 团队协作超给力 2.4 机器学习巧集成 三、上手实操超简单 3.1 安装部署不头疼 3.1.1 Docker安装 3.1.2 pip安装 3.1.3 Anaconda安装 3.2 快速开启标注…...

flow-两种SharingStarted策略的区别示例

一 代码示例 viewModel.kt:// 上游数据源 - 模拟温度传感器 private val temperatureSource flow {var temp 20while(true) {emit(temp)delay(1000)println("上游发射温度: $temp") // 日志观察发射} }// WhileSubscribed - 有订阅者才收集 val temperature1 tem…...

零基础设计模式——设计模式入门

第一部分&#xff1a;设计模式入门 欢迎来到设计模式的世界&#xff01;别担心&#xff0c;这听起来可能很“高大上”&#xff0c;但我们会用最生活化的例子来帮助你理解。 1. 什么是设计模式&#xff1f; 想象一下&#xff0c;你是个大厨&#xff0c;每天都要做很多菜。有些…...

通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境

一、引言 在现代软件开发中&#xff0c;交叉编译是构建跨平台应用程序的关键技术。本文将详细介绍如何使用Docker容器和vcpkg包管理器为Arm64架构交叉编译gRPC库。这种方法特别适用于需要在x86开发机上为ARM服务器或嵌入式设备构建高性能RPC服务的场景。 二、配置Docker交叉编…...

Nginx基础知识

Nginx是什么&#xff1f; Nginx 是一款高性能的 Web 服务器、反向代理服务器和负载均衡器&#xff0c;以其高并发处理能力和低内存消耗著称。以下是 Nginx 的基础知识和常见配置示例&#xff1a; 1. 核心概念 • 配置文件位置&#xff1a;通常为 /etc/nginx/nginx.conf 或 /us…...

【计算机主板架构】ITX架构

一、引言 在计算机硬件的广阔领域中&#xff0c;主板架构犹如大厦的基石&#xff0c;对整个计算机系统的性能、功能和扩展性起着至关重要的作用。其中&#xff0c;ITX架构以其小巧、灵活和独特的设计理念&#xff0c;在特定的应用场景中脱颖而出。从家庭媒体中心到小型办公电脑…...

ubuntu 20.04 运行和编译LOAM_Velodyne

摘要&#xff1a;创建工作空间-->src下克隆代码&#xff08;https://github.com/laboshinl/loam_velodyne&#xff09;-->修改四处代码&#xff08;找到src/loam_velodyne路径下的CMakeLists.txt文件&#xff0c;注释掉35行代码和将/LOAM/src/loam_velodyne/src/lib文件夹…...

云计算简介:从“水电”到“数字引擎”的技术革命

云计算简介&#xff1a;从“水电”到“数字引擎”的技术革命 在当今数字化浪潮中&#xff0c;云计算早已从一个技术概念演变为支撑现代社会运转的核心基础设施。无论是你手机里的天气预报、电商购物的推荐系统&#xff0c;还是企业内部的ERP系统&#xff0c;背后都离不开云计算…...

femap许可与多用户共享

随着电磁仿真技术的发展&#xff0c;Femap作为一款领先的工具&#xff0c;在多个领域中发挥着不可替代的作用。然而&#xff0c;对于许多团队和企业来说&#xff0c;如何高效、经济地管理和使用Femap许可证成为了一个亟待解决的问题。本文将探讨Femap许可与多用户共享的概念、优…...

spring中yml配置上下文与tomcat等外部容器不一致问题

结论&#xff1a;外部优先级大于内部 在 application.yml 中配置了&#xff1a; server:port: 8080servlet:context-path: /demo这表示你的 Spring Boot 应用的上下文路径&#xff08;context-path&#xff09;是 /demo&#xff0c;即访问你的服务时&#xff0c;URL 必须以 /d…...

网络I/O学习-poll(三)

一、为什么要用Poll 由于select参数太多&#xff0c;较于复杂&#xff0c;调用起来较为麻烦&#xff1b;poll对其进行了优化 二、poll机制 poll也是一个系统调用&#xff0c;每次调用都会将所有客户端的fd拷贝到内核空间&#xff0c;然后进行轮询&#xff0c;判断IO是否就绪…...

云原生攻防2(Docker基础补充)

Docker基础入门 容器介绍 Docker是什么 Docker是基于Linux内核实现,最早是采用了 LXC技术,后来Docker自己研发了runc技术运行容器。 它基于Google Go语言实现,采用客户端/服务端架构,使用API来管理和创建容器。 虚拟机 VS Docker Namespace 内核命名空间属于容器非常核…...

【C++模板与泛型编程】实例化

目录 一、模板实例化的基本概念 1.1 什么是模板实例化&#xff1f; 1.2 实例化的触发条件 1.3 实例化的类型 二、隐式实例化 2.1 隐式实例化的工作原理 2.2 类模板的隐式实例化 2.3 隐式实例化的局限性 三、显式实例化 3.1 显式实例化声明&#xff08;extern templat…...

CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系

CI/CD 实践&#xff1a;实现可灰度、可监控、可回滚的现代部署体系 一、背景 随着微服务架构、云原生技术的普及&#xff0c;传统的手动部署方式已难以满足现代业务快速迭代、高可用的需求。CI/CD&#xff08;持续集成/持续交付&#xff09;作为现代 DevOps 的核心环节&#…...

后退的风景

后退的风景 前言回退的景色 前言 坐在高铁的窗边&#xff0c;这是一趟回程的旅途&#xff0c;所有的树木、铁塔、石碑向后涌去&#xff0c;一如从前。 所谓风景正是如此&#xff0c;无非是看到了一段触动内心的感受&#xff0c;这段感受可能是伤心&#xff0c;亦或是欣喜。这…...

腾讯云安装halo博客

腾讯云安装halo博客 如果网站已经配置好可以直接使用的&#xff0c;可以直接跳转到《6》进行1panel的安装&#xff0c; 如果跳过之后安装出现问题&#xff0c;可以看看前面步骤 从《6》开始的安装视频 我估计是网站默认放开的端口和他返代理应用的端口冲突了&#xff0c;重装…...

Excel宏和VBA的详细分步指南

Excel宏和VBA的详细分步指南 一、宏录制与代码分析&#xff08;超详细版&#xff09;1. 启用开发工具2. 录制宏 二、VBA核心语法&#xff08;深入详解&#xff09;1. 变量与数据类型2. 循环结构3. 条件判断2. Worksheet对象3. Range对象的高级操作 四、实用案例扩展1. 数据清洗…...

第十六届蓝桥杯复盘

文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了&#xff0c;现在复盘下&#xff0c;省赛报完名后一直没准备所以没打算参赛&#xff0c;直到比赛前两天才决定参加&#xff0c;赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...

深度学习---模型预热(Model Warm-Up)

一、基本概念与核心定义 模型预热是指在机器学习模型正式训练或推理前&#xff0c;通过特定技术手段使模型参数、计算图或运行环境提前进入稳定状态的过程。其本质是通过预处理操作降低初始阶段的不稳定性&#xff0c;从而提升后续任务的效率、精度或性能。 核心目标&#xf…...

python:pymysql概念、基本操作和注入问题讲解

python&#xff1a;pymysql分享目录 一、概念二、数据准备三、安装pymysql四、pymysql使用&#xff08;一&#xff09;使用步骤&#xff08;二&#xff09;查询操作&#xff08;三&#xff09;增&#xff08;四&#xff09;改&#xff08;五&#xff09;删 五、关于pymysql注入…...

科普:极简的AI乱战江湖

本文无图。 大模型 ‌2022年2月&#xff0c;‌文生图应用的鼻祖Midjourney上线。 ‌2022年8月&#xff0c;‌开源版的Midjourney&#xff0c;也就是Stable Diffusion上线。 2022年11月30日‌&#xff0c;OpenAI正式发布ChatGPT-3.5。 此后&#xff0c;不断有【大模型】面世&…...

养生指南:解锁健康生活新方式

一、饮食&#xff1a;精准搭配&#xff0c;科学滋养 饮食以 “少加工、多天然” 为核心。早餐选择希腊酸奶搭配蓝莓与一把混合坚果&#xff0c;富含蛋白质与抗氧化成分&#xff1b;午餐用藜麦饭搭配香煎龙利鱼和彩椒炒芦笋&#xff0c;营养全面且低脂&#xff1b;晚餐则是山药…...

Dolphinscheduler执行工作流失败,后台报duplicate key错误

背景 现场童鞋发来一张图如下 我很懵逼&#xff0c;不知道出了啥问题&#xff0c;在聊天工具上聊了10m还不知道啥&#xff0c;干脆就搞个腾讯会议&#xff08;在此感谢腾讯爸爸免费会议&#xff09;。哦&#xff0c;现场临时搭建了dolphinscheduler&#xff0c;然后导入工作流…...

【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式

目录 一、路由的push 与 replace切换 二、编程式路由导航 三、缓存路由组件 四、新增的两个生命周期钩子 五、路由守卫 5.1 前置路由守卫 5.2 后置路由守卫 5.3 独立路由守卫 5.4 组件内 路由守卫 六、路由器的两种工作模式 6.1 hash模式 6.2 history模式 6.3 V…...

VDC、SMC、MCU怎么协同工作的?

华为视频会议系统中&#xff0c;VDC&#xff08;终端控制&#xff09;、SMC&#xff08;会话管理&#xff09;、MCU&#xff08;媒体处理&#xff09; 通过分层协作实现端到端会议管理&#xff0c;其协同工作机制可总结为以下清晰架构&#xff1a; 1. 角色分工 组件核心职责类…...

ETL数据集成产品选型需要关注哪些方面?

ETL&#xff08;Extract&#xff0c;Transform&#xff0c;Load&#xff09;工具作为数据仓库和数据分析流程中的关键环节&#xff0c;其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年&#xff0c;通过自身产品的实践应用&#xff0c;对 ETL 产品选型…...

DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成

《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表&#xff0c;来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型&#xff08;VLM&#xff09;正在成…...

【达梦数据库】过程、函数、包头和包体详解零基础

目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题&#xff0c;学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口&#xff0c;包体主要用以实现包体中声明的存储过程、函数等。 包头 包体...

HarmonyOS开发样式布局

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…...

SpringCloud——EureKa

目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为服务。 优点&#xff1a; 降…...

【力扣刷题】LeetCode763-划分字母区间

文章目录 1. LeetCode763_划分字母区间 1. LeetCode763_划分字母区间 题目链接&#x1f517; &#x1f427;解题思路&#xff1a; 区间合并 题目中这句话很关键“我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。” 你这句话你可以理解为 把…...

使用for循环和字典功能,统计字符出现在一个英文句子中的次数(python)

本题目要求写出一段代码实现输入一个英文句子后&#xff0c;统计句子中各个字符&#xff08;不区分大小写,包含空格和标点符号&#xff09;出现的次数。 输入格式: 请例如&#xff1a;输入 Life is short,we need Python. 。 输出格式: 对每一个字符输出对应的出现次数&…...

带你搞懂@Valid和@Validated的区别

前言 有参数传递的地方都少不了参数校验。在实际开发过程中&#xff0c;参数校验是保证程序健壮性的重要环节&#xff0c;前端的参数校验是为了用户体验&#xff0c;后端的参数校验是为了安全。试想一下&#xff0c;如果在 Controller 层中没有经过任何校验的参数通过 Service层…...