JS进阶01-异步编程、跨域、懒加载
目录
一、异步编程
1.1.异步编程的基本概念与重要性
1.2.事件循环(Event Loop)机制
1.3.JavaScript异步编程的常见方式及详解
示例
1.4.异步编程的最佳实践
二、跨域
2.1.什么是跨域
2.2.怎么解决跨域
1. JSONP(JSON with Padding)
2. CORS(Cross-Origin Resource Sharing)
3. 反向代理/Nginx反向代理
4. WebSocket
5. postMessage
6. Node.js中间件代理
三、懒加载
1. 懒加载原理
2. 懒加载思路及实现
3. 图片的懒加载
案例
一、异步编程
1.1.异步编程的基本概念与重要性
异步编程是一种编程方式,它允许程序在等待某些操作(如网络请求、文件读取、定时器等)完成的同时,继续执行其他任务。这种编程方式可以显著提高程序的执行效率,特别是在处理I/O密集型任务时表现出色。
在JavaScript中,由于它是单线程语言,即同一时间只能执行一个任务,因此异步编程显得尤为重要。如果使用同步编程模型来处理需要大量时间的任务,会阻塞整个线程,导致页面或程序卡顿。而异步编程则可以让程序在执行这些长时间任务时,继续执行其他代码,从而优化用户体验。
1.2.事件循环(Event Loop)机制
1.事件循环(Event Loop):
JavaScript的执行环境是单线程的,这意味着它同一时间只能执行一个任务。
事件循环是JavaScript实现异步编程的核心机制。它包含一个执行栈(Call Stack)和一个或多个任务队列(Task Queue)。
执行栈用于执行同步代码,而任务队列则用于存放异步任务的回调函数。
当执行栈为空时,事件循环会从任务队列中取出任务并执行。
2.任务类型:
宏任务(Macro Task):如setTimeout、setInterval、I/O操作等。
微任务(Micro Task):如Promise的回调、process.nextTick等。
微任务的优先级高于宏任务。在每一次事件循环中,执行栈中的任务执行完毕后,会先检查微任务队列,执行所有微任务,再执行下一个宏任务。
1.3.JavaScript异步编程的常见方式及详解
1、回调函数(Callback Functions)
回调函数是最早的异步处理方式。它通过将一个函数作为参数传递给另一个函数,在异步任务完成后调用该函数来处理结果。
回调函数的优点是简单易懂,但在处理多个异步任务时,会导致回调函数嵌套过多,形成“回调地狱”,使代码难以维护和理解。
2、Promise对象
Promise是ES6引入的一种异步编程解决方案,它是一个表示未来某个事件(通常是一个异步操作)的结果的对象。
Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。状态一旦改变就不能再变。
Promise对象提供了then()和catch()方法来处理异步操作的结果和异常。then()方法用于处理成功的情况,catch()方法用于处理失败的情况。
Promise支持链式调用,可以避免回调地狱,使代码更加简洁易读。
Promise.all()和Promise.race()是Promise对象的两个静态方法。
Promise.all()接受一个包含多个Promise的数组,并返回一个新的Promise。当所有Promise都完成时,这个Promise才会完成;如果其中有一个Promise失败,Promise.all()会立即失败。
Promise.race()则只要数组中的任意一个Promise完成或失败,就会立即完成或失败。
有关promise的更详细讲解在ES6基础知识
https://blog.csdn.net/m0_64455070/article/details/143714359
3、async/await
async/await是基于Promise的语法糖,是ES2017引入的用于处理异步代码的方式。
async用来声明一个异步函数,该函数会隐式地返回一个Promise。
await只能在async函数内部使用,用于等待一个Promise的完成。它返回的是Promise成功的结果值,如果Promise失败,则抛出异常。
async/await使得异步代码看起来像是同步的,提高了代码的可读性和可维护性。它避免了回调地狱,并且错误处理更加方便。
有关async/await更详细讲解在本文作者的ES6基础知识
https://blog.csdn.net/m0_64455070/article/details/143714359
示例
以下是一个使用async/await实现异步网络请求的示例代码:
async function fetchData(url) {try {const response = await fetch(url); // 等待fetch函数的Promise完成if (!response.ok) {throw new Error('Network response was not ok');}const data = await response.json(); // 等待响应的JSON数据解析完成return data;} catch (error) {console.error('Fetch error:', error);throw error; // 将错误抛出给调用者处理}
}// 使用 async/await 处理异步请求结果
(async () => {try {const data = await fetchData('https://api.example.com/data');console.log('Request succeeded:', data);} catch (error) {console.error('Request failed:', error);}
})();
在这个示例中,fetchData函数是一个异步函数,它使用await关键字等待fetch函数的Promise完成,并获取响应的JSON数据。然后,我们使用一个立即执行的异步函数来调用fetchData函数,并处理异步请求的结果。如果请求失败,则捕获异常并打印错误信息。
1.4.异步编程的最佳实践
避免回调地狱:使用Promise或async/await来避免回调地狱,使代码更加简洁易读。
错误处理:在异步代码中添加适当的错误处理逻辑,以确保程序的健壮性。
代码可读性:使用有意义的函数名和变量名,以及适当的注释来提高代码的可读性。
性能优化:避免不必要的异步操作,以减少资源消耗和提高程序性能。
二、跨域
2.1.什么是跨域
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。在Web开发中,由于同源策略(Same-Origin Policy)的限制,浏览器默认不允许跨域请求。如果尝试进行跨域请求,浏览器会抛出安全错误。
什么是同源策略?
同源策略是一种安全功能,它要求协议、域名和端口三者必须相同,才允许访问资源。
2.2.怎么解决跨域
1. JSONP(JSON with Padding)
原理:
JSONP是一种通过<script>标签实现跨域请求的技术。由于<script>标签不受同源策略的限制,可以加载其他域的JavaScript文件。
优点:
兼容性好,可以解决主流浏览器的跨域问题
缺点:
仅支持GET请求。
不安全,可能遭受XSS攻击。
实现步骤
JSONP的工作流程如下:
前端:动态创建一个
<script>标签,并设置其src属性为跨域的URL,同时在URL中传入一个回调函数名(如callback=myFunction)。后端:服务器接收到请求后,将返回的数据作为回调函数的参数,并包装成JavaScript代码返回(如
myFunction({"key":"value"}))。前端:当浏览器加载这段JavaScript代码时,会自动调用回调函数
myFunction,从而实现跨域数据传输。
但JSONP只能发送GET请求,且存在安全风险,容易受到XSS攻击。
2. CORS(Cross-Origin Resource Sharing)
原理
CORS是一种由服务器设置响应头来允许跨域请求的机制。服务器通过设置特定的HTTP响应头,如Access-Control-Allow-Origin,来指定哪些域名或IP地址可以跨域访问资源。
优点
灵活,可以细粒度地控制哪些源可以访问资源。
前端无需配置,只需后端设置响应头。
缺点
需要服务器支持
实现步骤
前端:无需特殊配置,只需发送跨域请求即可。
后端:服务器需要在响应头中设置Access-Control-Allow-Origin等CORS相关的头部字段。
CORS支持所有类型的HTTP请求,且安全性较高,是跨域请求的推荐解决方案。但需要注意的是,CORS需要服务器和浏览器同时支持才能实现。
3. 反向代理/Nginx反向代理
原理
反向代理是一种在服务器端设置代理服务器,将前端的跨域请求转发到目标服务器,并将目标服务器的响应返回给前端的技术。Nginx是一种常见的反向代理服务器。
优点
解决跨域问题:通过反向代理,前端可以与目标服务器进行跨域通信,而无需修改前端代码。
安全性:反向代理可以作为一道安全屏障,隐藏目标服务器的真实地址,防止直接攻击。
负载均衡:在大型应用中,反向代理可以将请求分发到多个目标服务器,实现负载均衡,提高系统的可用性和性能。
缓存:反向代理可以缓存目标服务器的响应,减少对目标服务器的请求次数,提高响应速度。
缺点
配置复杂性:反向代理需要服务器端的配置和管理,这可能需要一定的技术知识和经验。
单点故障:如果反向代理服务器出现故障,整个系统可能会受到影响,导致服务中断。
性能瓶颈:虽然反向代理可以提高性能,但在高并发场景下,它也可能成为性能瓶颈。
实现步骤
前端:无需特殊配置,只需发送请求到反向代理服务器即可。
后端:需要在服务器端(如Nginx)配置反向代理规则,将请求转发到目标服务器。
通过反向代理,前端可以认为是在与同源服务器通信,从而绕过浏览器的同源策略限制。但需要注意的是,反向代理需要服务器端的配置和管理。
4. WebSocket
原理
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。它默认支持跨域请求,可以在客户端和服务器之间建立持久的连接,并通过该连接进行实时数据传输。
优点
支持全双工通信,实时性好。
不受同源策略限制。
缺点
需要服务器支持WebSocket协议。
可能存在性能问题,如页面建立多个WebSocket连接。
实现步骤
前端:使用WebSocket API(如new WebSocket('ws://example.com/socket'))建立连接。
后端:服务器需要支持WebSocket协议,并处理连接和数据传输。
WebSocket适用于需要实时通信或双向通信的场景,如聊天室、实时数据监控等。
5. postMessage
原理
postMessage是HTML5中提供的一个API,用于在不同窗口、标签页或iframe之间进行跨域通信。
优点
安全,可以通过origin参数控制消息的来源。
支持复杂的通信场景,如跨域iframe之间的通信。
缺点
需要双方配合实现。
实现步骤
前端:使用window.postMessage方法发送消息到目标窗口或iframe。
接收端:目标窗口或iframe需要监听message事件,并处理接收到的消息。
postMessage适用于不同窗口之间的通信,如父子窗口、跨域iframe等。但需要在接收端进行安全验证以防止恶意攻击。
6. Node.js中间件代理
原理
当前端发送跨域请求到Node.js服务器时,Node.js服务器使用中间件拦截并处理这些请求。中间件可以检查请求的头信息、参数等,并根据配置将请求转发到目标服务器。目标服务器处理请求后,将响应返回给Node.js服务器,Node.js服务器再将响应转发给前端。通过这种方式,Node.js服务器作为中间层,实现了跨域通信。常见的中间件有cors、http-proxy-middleware等。
优点
灵活性:Node.js中间件代理可以灵活地处理跨域请求,并与其他Node.js应用集成。
易于配置:与Nginx等反向代理服务器相比,Node.js中间件代理的配置通常更加简单和直观。
可扩展性:Node.js中间件代理可以轻松地与其他中间件和路由集成,实现更复杂的功能。
缺点
性能:与Nginx等高性能反向代理服务器相比,Node.js中间件代理的性能可能稍逊一筹。
资源消耗:Node.js中间件代理需要额外的资源来运行和处理请求,这可能会增加服务器的负载。
维护成本:与Nginx等成熟的反向代理服务器相比,Node.js中间件代理可能需要更多的维护和支持
实现步骤
前端:发送请求到Node.js服务器。
后端:Node.js服务器使用中间件拦截并处理跨域请求,将请求转发到目标服务器,并将响应返回给前端。
Node.js中间件代理需要服务器端的配置和管理,但可以灵活地处理跨域请求,并与其他Node.js应用集成。
三、懒加载
1. 懒加载原理
懒加载,即按需加载或延迟加载,是指当页面或应用中的某些资源(如图片、视频、数据等)在需要时才进行加载,而不是在页面初始化时一次性加载所有资源。这种技术的核心原理是减少初始加载时间和网络流量,提高页面响应速度和用户体验。
懒加载的原理主要基于以下几点:
按需加载:只加载用户当前需要或即将需要的资源,避免加载无用资源。
异步加载:将资源的加载推迟到用户需要使用时再进行,不阻塞用户界面的渲染。
动态加载:根据用户的行为和需求,动态地生成和加载页面内容或资源。
2. 懒加载思路及实现
- 确定需要懒加载的资源:根据页面或应用的需求,确定哪些资源可以或应该进行懒加载。
- 设置占位符:在资源实际加载之前,使用占位符(如低分辨率图片、默认图标等)来占据资源的位置。
- 监听用户行为:通过事件监听(如滚动事件、点击事件等)来检测用户何时需要加载资源。
- 加载资源:当用户需要资源时,触发加载逻辑,从服务器获取资源并替换占位符。
懒加载的实现方式有多种,包括但不限于:
- 图片懒加载:通过监听滚动事件和判断图片是否进入可视区域来实现图片的延迟加载。
- 视频懒加载:在视频播放器进入用户视野或用户点击播放按钮时才开始加载视频内容。
- 数据懒加载:在用户滚动到页面底部或进行分页操作时,加载更多的数据。
3. 图片的懒加载
图片的懒加载是懒加载技术中最常见的应用之一。
步骤:
在HTML中为需要懒加载的图片设置占位符,并使用自定义属性(如data-src)存储真实图片的路径。
在JavaScript中监听滚动事件,判断图片是否进入可视区域。
当图片进入可视区域时,将占位符替换为真实图片
// 获取页面中的所有懒加载图片
var imgs = document.querySelectorAll('img[data-src]');// 监听滚动事件
window.addEventListener('scroll', function() {// 遍历所有懒加载图片imgs.forEach(function(img) {// 判断图片是否进入可视区域if (isImageInViewport(img)) {// 替换占位符为真实图片img.src = img.getAttribute('data-src');// 移除data-src属性,避免重复加载img.removeAttribute('data-src');}});
});// 判断图片是否进入可视区域的函数
function isImageInViewport(img) {var rect = img.getBoundingClientRect();var inViewport = (rect.top >= 0 &&rect.left >= 0 &&rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&rect.right <= (window.innerWidth || document.documentElement.clientWidth));return inViewport;
}
现代浏览器支持:
现代浏览器(如Chrome、Firefox、Safari等)通常支持图片的懒加载属性。可以在<img>标签中使用loading="lazy"属性来告诉浏览器延迟加载图片,直到它们出现在视口中。
例如:<img src="placeholder.jpg" data-src="real-image.jpg" loading="lazy" alt="Description">
案例
1. 图片懒加载(使用JavaScript和Intersection Observer API)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Image Lazy Load Example</title>
<style>.lazy-load {opacity: 0;transition: opacity 0.3s;}.lazy-load.loaded {opacity: 1;}
</style>
</head>
<body><!-- 图片列表,使用 data-src 属性存储真实图片 URL -->
<img class="lazy-load" data-src="image1.jpg" alt="Image 1">
<img class="lazy-load" data-src="image2.jpg" alt="Image 2">
<img class="lazy-load" data-src="image3.jpg" alt="Image 3">
<!-- ...更多图片... --><script>// 获取所有需要懒加载的图片const lazyImages = document.querySelectorAll('.lazy-load');// 创建 Intersection Observer 实例const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {// 当图片进入可视区域时,加载图片const img = entry.target;img.src = img.dataset.src;img.classList.add('loaded');// 停止观察这个图片observer.unobserve(img);}});});// 开始观察每个图片lazyImages.forEach(img => {observer.observe(img);});
</script></body>
</html>
2. 视频懒加载(使用JavaScript和事件监听)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Video Lazy Load Example</title>
</head>
<body><!-- 视频列表,使用 data-src 属性存储视频 URL -->
<div class="video-container"><video class="lazy-load" controls><source data-src="video1.mp4" type="video/mp4">Your browser does not support the video tag.</video>
</div>
<div class="video-container"><video class="lazy-load" controls><source data-src="video2.mp4" type="video/mp4">Your browser does not support the video tag.</video>
</div>
<!-- ...更多视频... --><script>// 获取所有需要懒加载的视频const lazyVideos = document.querySelectorAll('.lazy-load video');// 为每个视频容器添加点击事件监听器lazyVideos.forEach(videoContainer => {const video = videoContainer.querySelector('video');const source = video.querySelector('source');videoContainer.addEventListener('click', () => {// 当视频容器被点击时,加载视频video.src = source.dataset.src;video.load(); // 触发浏览器加载视频资源// 移除 data-src 属性,避免重复加载source.removeAttribute('data-src');// 移除点击事件监听器,避免重复操作videoContainer.removeEventListener('click', arguments.callee);});});
</script></body>
</html>
3. 数据懒加载(使用JavaScript和滚动事件监听)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Lazy Load Example</title>
<style>#content {max-height: 400px;overflow-y: auto;}.item {padding: 10px;border-bottom: 1px solid #ccc;}
</style>
</head>
<body><div id="content"><!-- 初始内容 --><div class="item">Item 1</div><div class="item">Item 2</div><!-- ...更多初始内容... --><!-- 占位符,用于加载更多内容 --><div id="load-more">Load More</div>
</div><script>let currentPage = 1; // 当前页码// 为“加载更多”按钮添加点击事件监听器document.getElementById('load-more').addEventListener('click', () => {loadMoreData(currentPage);currentPage++; // 更新页码});// 滚动事件监听器,当用户滚动到底部时自动加载更多数据window.addEventListener('scroll', () => {const content = document.getElementById('content');const loadMore = document.getElementById('load-more');const bottomOfWindow = window.scrollY + window.innerHeight === document.body.offsetHeight;const bottomOfContent = content.scrollTop + content.clientHeight >= content.scrollHeight - 10; // 减去10是为了避免因为滚动条或内容高度计算误差导致的重复加载if (bottomOfWindow || bottomOfContent) {loadMoreData(currentPage);currentPage++; // 更新页码// 可以选择隐藏或禁用“加载更多”按钮,直到新数据加载完成loadMore.style.display = 'none';}});// 模拟加载更多数据的函数function loadMoreData(page) {setTimeout(() => {const content = document.getElementById('content');const loadMore = document.getElementById('load-more');// 清除之前的占位符(如果存在)if (loadMore.style.display === 'none') {loadMore.style.display = 'block';}// 创建新的内容项并添加到页面中for (let i = 0; i < 5; i++) {const newItem = document.createElement('div');newItem.className = 'item';newItem.textContent = `Item ${(page - 1) * 5 + i + 3}`; // 假设每页加载5个项,从Item 3开始content.appendChild(newItem);}}, 1000); // 模拟网络延迟,设置为1秒}
</script></body>
</html>
相关文章:
JS进阶01-异步编程、跨域、懒加载
目录 一、异步编程 1.1.异步编程的基本概念与重要性 1.2.事件循环(Event Loop)机制 1.3.JavaScript异步编程的常见方式及详解 示例 1.4.异步编程的最佳实践 二、跨域 2.1.什么是跨域 2.2.怎么解决跨域 1. JSONP(JSON with Padding&…...
2012年 数模美赛 C题 犯罪克星
一、问题重述 银河犯罪建模中心(ICM)正在调查一个犯罪阴谋。调查人员已经识别出一些阴谋成员,但希望在逮捕之前确定其他成员和领导人。所有嫌疑人和可能的同谋者都受雇于同一家公司,并在一个大的综合办公室里工作。该公司正在开发…...
社区团购中 2+1 链动模式商城小程序的创新融合与发展策略研究
摘要:本文聚焦于社区团购这一新兴零售模式的发展态势,深入探讨 21 链动模式商城小程序与之融合的创新机制与应用策略。通过剖析社区团购的运营模式、优势特点以及发展现状,结合 21 链动模式商城小程序的功能特性,研究二者协同作用…...
【Go底层】time包Ticker定时器原理
目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究…...
RoBERTa- 稳健优化的 BERT 预训练模型详解
一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...
【C++】continue语句、goto语句
1、continue 语句 作用:在循环语句中,跳过本次循环中余下尚未执行的语句。继续下一次循环。 注意:continue只能用于循环中。 示例: 代码: //continue的用法 #include<iostream> using namespace std; int ma…...
postgresql与pgvector安装与使用
环境变量修改 打开 .bashrc 文件进行编辑: vim ~/.bashrc在文件的末尾添加上面的环境变量配置 # 添加 PostgreSQL 可执行文件路径到系统 PATH export PATH/home/....../pg/postgresql-12.4/bin:$PATH# 设置 PostgreSQL 数据目录 export PGDATA/home/....../pg/pos…...
开箱即用,阿里开源!专业AI 聊天界面工具包:Ant Design X
Ant Design X是一个基于Ant Design体系的创新解决方案,为构建高效的AI交互界面提供了便利和支持。从精细的原子组件到快速集成的模型服务,Ant Design X让开发者能轻松应对各种需求。本文将结合实际场景,展示Ant Design X的功能与使用方法。 为…...
详解版本控制工作原理及优势,常见的版本控制系统对比(HelixCore、Git、SVN等)
什么是版本控制软件?从基础层面来说,版本控制(也可称版本管理)就是随时间跟踪和管理文件变更的过程,而版本控制软件有助于实现这一过程的自动化。但这仅仅是其功能及其重要性的开端。 什么是版本控制? 版本…...
Vue2 vs Vue3:核心原理与性能优化详解
Vue2 vs Vue3:核心原理与性能优化详解 Vue.js 是目前主流的前端框架之一,随着 Vue3 的发布,框架内部的实现和使用方式都发生了显著变化。本文将从 Vue2 和 Vue3 的核心实现原理出发,详细解析两者的区别,并分析 Vue3…...
Qt+GDAL属性计算软件开发记录
一.GDAL添加字段 void MainWindow::addField(QString fieldName){OGRFieldDefn * fieldDefn new OGRFieldDefn(fieldName.toStdString().c_str(), OFTInteger);ly->CreateField(fieldDefn);srand((int)time(NULL));while (true){OGRFeature * feature ly->GetNextFeat…...
在超表面中琼斯矩阵的使用
琼斯矩阵(Jones Matrix) 是一种线性代数方法,用于描述光的偏振状态和偏振变化,是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用,尤其是在设计和调控光与物质相互作用时,例如偏振控制、相位调制…...
在macOS上从源码部署RAGFlow-0.14.1
一、macOS配置 1. macOS配置 我使用MacBook Pro,chip 是 Apple M3 Pro,Memory是18GB,macOS是 Sonoma 14.6.1。 2.安装Docker和Docker compose 官方要求 Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1,我的版本如下&#x…...
2-2-18-9 QNX系统架构之文件系统(二)
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
【经管数据】上市公司企业审计报告时滞数据、 年报披露时滞数据(2001-2022年)
测算方式:参考C刊《审计研究》窦笑晨(2022)老师的研究,从审计报告约定披露日期到审计报告实际披露日期之间的时间间隔。有关审计报告时滞的度量,现有研究大多采用资产负债表日与审计报告实际披露日期之间的间隔天数进行…...
debian ubuntu armbian部署asp.net core 项目 开机自启动
我本地的环境是 rk3399机器,安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库,但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…...
无人机地面遥控遥测技术与算法概述!
一、地面系统遥控检测核心技术 卫星遥测技术: 定义:卫星遥测技术是实现卫星与地面之间遥测数据传输的关键环节。 功能:传输卫星的状态信息、传感器采集的环境参数等。 关键技术: 调制解调技术:用于将数字遥测数据…...
游戏引擎学习第30天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始,…...
Django drf 快速使用
1. 安装: pip install djangorestframework 2. 添加rest_framework到您的INSTALLED_APPS设置。 settings.pyINSTALLED_APPS [...rest_framework, ] 3. 定义模型 models.pyfrom django.db import modelsclass BookModel(models.Model):name models.CharField(max_length64)…...
机器学习介绍与实战:案例解析与未来展望
一、机器学习概述 1. 什么是机器学习? 机器学习(Machine Learning, ML)是一种通过数据训练模型,使计算机能够自动从经验中学习的技术。它旨在让计算机在没有显式编程的情况下,能够从数据中提取模式、进行预测或决策。…...
QMC音频解密终极指南:如何快速无损转换QQ音乐加密文件
QMC音频解密终极指南:如何快速无损转换QQ音乐加密文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了QQ音乐平台的歌曲,却发现只能…...
终极指南:如何用Sketch MeaXure插件实现高效设计标注
终极指南:如何用Sketch MeaXure插件实现高效设计标注 【免费下载链接】sketch-meaxure 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-meaxure 在UI/UX设计工作流中,设计标注是连接设计与开发的关键桥梁。Sketch MeaXure作为一款基于Type…...
BudgetMLAgent:多智能体协作与模型级联,低成本自动化机器学习任务
1. 项目概述与核心挑战在机器学习(ML)项目实践中,从数据清洗、特征工程到模型调优、部署上线,每一步都充满了重复性劳动和细节陷阱。对于数据科学家和算法工程师而言,将宝贵的时间耗费在编写样板代码、调试超参数或处理…...
C#基于TCP通信协议的实现示例
1. 客户端代码(TCpClient/Program.cs)该代码实现了一个基础的 TCP 客户端程序,核心逻辑是与指定 IP 和端口的 TCP 服务器建立连接,向服务器发送控制台输入的字符串数据,并接收服务器的响应数据,最后释放连接…...
多目标优化模型MO-OBAM:在数据匿名化中权衡隐私保护与数据效用
1. 项目概述与核心挑战在金融风控、医疗研究和精准营销这些数据驱动的核心领域,我们每天都在面对一个看似无解的悖论:数据越详细、越原始,从中挖掘出的价值就越大,但随之而来的隐私泄露风险也呈指数级增长。我处理过不少项目&…...
Z变换与数字滤波器设计:从零极点分析到Python实战
1. 从理论到代码:Z变换如何成为数字信号处理的“瑞士军刀”如果你刚开始接触数字信号处理,可能会觉得Z变换是个有点抽象的数学工具。但在我十多年的音频算法和通信系统开发经历里,Z变换远不止是教科书上的公式——它是我们设计、分析和调试数…...
ml_edm:基于成本敏感的时间序列早期分类Python工具包详解
1. 项目概述在工业监控、医疗诊断和金融风控这些领域,我们常常面对一个共同的困境:数据是随着时间一点点“流”进来的,但决策却不能等到所有数据都齐备了再做。比如,一台设备传感器传回的振动信号刚开始出现异常,你是立…...
PearSAN框架:用PearSOL损失与VCA采样破解纳米光子学逆设计难题
1. 项目概述:当机器学习遇上纳米光子学逆设计在纳米光子学领域,我们常常面临一个“反着来”的工程难题:给定一个我们梦寐以求的光学性能目标,比如在特定波段实现近乎完美的光吸收,如何从浩如烟海的可能结构中ÿ…...
从视网膜到脑肿瘤:手把手复现CAS-UNet与DA-TransUNet,搞定医学图像分割的细节与代码
从视网膜到脑肿瘤:手把手复现CAS-UNet与DA-TransUNet,搞定医学图像分割的细节与代码医学图像分割一直是计算机视觉领域最具挑战性的任务之一。不同于自然图像,医学影像往往存在边界模糊、噪声干扰大、目标形态多变等特点。传统的分割方法在这…...
医疗AI公平性评估:从数据复杂性到系统任意性的三支柱分析框架
1. 项目概述:当医疗AI遇上公平性拷问在医疗健康领域,机器学习模型正从实验室的“概念验证”阶段,大步迈向临床决策支持的“实战”前线。无论是预测糖尿病风险,还是辅助诊断心脏病,这些算法模型的核心承诺是:…...
