Pytorch 复习总结 1
Pytorch 复习总结,仅供笔者使用,参考教材:
- 《动手学深度学习》
本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。
Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1;
Pytorch 线性神经网络 部分 见 Pytorch 复习总结 2;
Pytorch 多层感知机 部分 见 Pytorch 复习总结 3;
Pytorch 深度学习计算 部分 见 Pytorch 复习总结 4;
Pytorch 卷积神经网络 部分 见 Pytorch 复习总结 5;
Pytorch 现代卷积神经网络 部分 见 Pytorch 复习总结 6;
目录
- 一. 数据操作
- 1. 张量的创建
- 2. 张量的基本操作
- 3. 按元素运算
- 4. 原地运算
- 5. 索引和切片
- 6. 数据类型转换
- 二. 数学运算
- 1. 线性代数
- 2. 高等数学
- 3. 概率论
一. 数据操作
张量 tensor 是 PyTorch 中的核心数据结构,类似于 Numpy 中的数组 ndarray。张量的本质是 n 维数组,可以很好地支持 GPU 加速计算,并且支持自动微分。使用张量需要导入头文件 torch
,type
类型为 torch.Tensor
。
1. 张量的创建
torch.arange(start=0, end, step=1)
:创建等差数列的行向量;import torch x = torch.arange(6) # tensor([0, 1, 2, 3, 4, 5]) y = torch.arange(1,6,2) # tensor([1, 3, 5])
torch.zeros((a, b, ...))
/torch.ones((a, b, ...))
/torch.randn(a, b, ...)
/torch.tensor([...])
:创建元素全为 0 / 1 / 随机 / 指定的张量;import torch a = torch.zeros((2, 3, 4)) b = torch.ones((5)) c = torch.randn(3, 4) d = torch.tensor([[[2, 1], [4, 3]], [[1, 2], [3, 4]], [[4, 3], [2, 1]]])
torch.zeros_like(x)
:创建与 x 形状相同的全零张量;import torch x = torch.tensor([[1, 2, 3], [4, 5, 6]]) y = torch.zeros_like(x) # tensor([[0, 0, 0], [0, 0, 0]])
张量中的数据类型可以通过 dtype
属性指定:
类型 | 说明 |
---|---|
torch.float64 | 双精度浮点数 |
torch.float32 | 单精度浮点数 |
torch.float16 | 半精度浮点数 |
torch.int64 | 64 位有符号整数 |
torch.int32 | 32 位有符号整数 |
torch.int16 | 16 位有符号整数 |
torch.int8 | 8 位有符号整数 |
torch.uint8 | 8 位无符号整数 |
2. 张量的基本操作
x.shape
/x.numel()
:返回张量的形状 / 元素总数;import torch x = torch.randn(3, 4) print(x.shape) # torch.Size([3, 4]) print(x.numel()) # 12
x.reshape(a, b)
:改变原有张量的形状并返回新的张量,可以用 -1 自动计算某一维度的维数;import torch x = torch.arange(12) y = x.reshape(3, 4) print(y.shape) # torch.Size([3, 4]) z = x.reshape(2, 3, -1) print(z.shape) # torch.Size([2, 3, 2])
torch.cat((a, b), dim=n)
:将张量沿第 i 个轴拼接;import torch a = torch.arange(12, dtype=torch.float32).reshape((3,4)) b = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) x = torch.cat((a, b), dim=0) # tensor([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 2., 1., 4., 3.], [ 1., 2., 3., 4.], [ 4., 3., 2., 1.]]) y = torch.cat((a, b), dim=1) # tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.], [ 4., 5., 6., 7., 1., 2., 3., 4.], [ 8., 9., 10., 11., 4., 3., 2., 1.]])
x.clone()
:张量的深拷贝(=
这是浅拷贝,两个张量共享同一内存地址);
3. 按元素运算
+
/-
/*
//
/**
/%
:按元素加 / 减 / 乘 / 除 / 幂 / 模;import torch x = torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2, 2, 2, 2]) a = x + y # tensor([ 3., 4., 6., 10.]) b = x - y # tensor([-1., 0., 2., 6.]) c = x * y # tensor([ 2., 4., 8., 16.]) d = x / y # tensor([0.5000, 1.0000, 2.0000, 4.0000]) e = x ** y # tensor([ 1., 4., 16., 64.]) f = x % y # tensor([1., 0., 0., 0.])
torch.sin(x)
/torch.cos(x)
/torch.tan(x)
/torch.sinh(x)
/torch.cosh(x)
/torch.tanh(x)
:按元素计算三角函数;torch.exp(x)
/torch.log(x)
:按元素计算指数 / 对数函数;torch.logical_and(a, b))
/torch.logical_or(a, b))
/torch.logical_not(a)
:按元素逻辑与 / 或 / 非;>
、<
、=
、torch.eq(a, b)
/torch.gt(a, b)
/torch.lt(a, b))
/torch.ge(a, b)
/torch.le(a, b)
:按元素比较;
上面按元素运算都是在相同形状的两个张量上执行的,如果两个形状不同的张量调用按元素运算操作,会按 广播机制 执行。广播机制会先适当复制元素将两个张量补全成相同形状,再按元素操作:
import torcha = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a+b) # tensor([[0, 1], [1, 2], [2, 3]])
4. 原地运算
上一节介绍的运算都会为返回的张量分配新的内存,可以通过 id()
函数检查变量的内存地址:
import torchx = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(id(x)) # 2479607808944
x = x + y
print(id(x)) # 2479608211632
如果是在深度学习训练等场景中,参数会被不断更新,这样重复的操作会导致大量内存的无效占用。这时可以 执行原地操作,如 Z[:] = <expression>
或 X+=Y
:
import torchx = torch.tensor([1, 2, 4, 8])
y = torch.tensor([1, 3, 5, 7])
z = torch.zeros_like(x)
print(id(x)) # 2049176339296
print(id(z)) # 2049176741984
z[:] = x + y
print(id(z)) # 2049176741984
x+=y
print(id(x)) # 2049176339296
5. 索引和切片
Pytorch 中的索引和切片和 Python 数组中操作一样:
import torchx = torch.arange(12).reshape((3,4))
print(x[-1]) # tensor([ 8, 9, 10, 11])
print(x[1:3]) # tensor([[ 4, 5, 6, 7], [ 8, 9, 10, 11]])
print(x[:, 1:3]) # tensor([[ 1, 2], [ 5, 6], [ 9, 10]])
x[2, 2] = 15
x[0:2, :] = 12
print(x) # tensor([[12, 12, 12, 12], [12, 12, 12, 12], [ 8, 9, 15, 11]])
6. 数据类型转换
张量可以通过 torch.tensor()
、.numpy()
、.tolist()
函数实现与 list、ndarray 的相互转化:
import numpy as np
import torchnumpy_array = np.array([[1, 2, 3], [4, 5, 6]])
tensor = torch.tensor([[7, 8, 9], [10, 11, 12]])
python_list = [[1, 2, 3], [4, 5, 6]]tensor_from_numpy = torch.tensor(numpy_array)
numpy_from_tensor = tensor.numpy()
tensor_from_list = torch.tensor(python_list)
list_from_tensor = tensor.tolist()
当张量 只含单个元素 时,还可以使用 .item()
函数将其转化为标量:
import torchx = torch.tensor([3])
n = x.item() # 3
二. 数学运算
1. 线性代数
A.T
:矩阵转置,转置矩阵与原矩阵 共享内存空间;A*B
:Hadamard 积,即形状相同的两个张量按元素乘,记为 A ⊙ B A \odot B A⊙B;torch.dot(x, y)
:列向量点积,记为 ⟨ x , y ⟩ \langle x, y\rangle ⟨x,y⟩ 或 x T y x^Ty xTy;torch.mv(A, x)
:矩阵-向量积,记为 A x Ax Ax;torch.mm(A, B)
:矩阵-矩阵积,记为 A B AB AB;torch.matmul(A, B)
:通用矩阵乘法,可以计算向量 / 矩阵的积;torch.abs(u).sum()
/torch.norm(u)
:矩阵或向量的 L 1 L_1 L1 / L 2 L_2 L2 范数;import torch x = torch.tensor([3.0, -4.0]) y = torch.tensor([[1, 2], [2, 3], [3, 4]], dtype=torch.float32) print(torch.abs(x).sum()) # tensor(7.) print(torch.norm(x)) # tensor(5.) print(torch.abs(y).sum()) # tensor(15.) print(torch.norm(y)) # tensor(6.5574)
2. 高等数学
如果想要计算张量的梯度,在创建张量的时候需要 将 requires_grad
属性设置为 True。然后对张量的函数值调用 .backward()
方法计算张量的梯度(即偏导数),张量的梯度与原张量具有相同形状。.backward()
方法的可选属性如下:
gradient
属性可以指定梯度的初始值,一般用于深度学习训练中梯度控制;retain_graph
属性可以保留计算图以供后续的反向传播使用,以节省计算资源和时间。如果调用.backward()
方法时不设置retain_graph=True
,多次使用同一个计算图进行反向传播时就会出现 RuntimeError,因为计算图已经被释放;create_graph
属性在可以指定计算梯度的同时创建计算图,以计算高阶导数时使用;
调用 .backward()
方法后,PyTorch 会自动 计算张量的梯度,并将梯度存储在张量的 .grad
属性中。如果想要继续计算高阶导数,需要清空 .grad
属性值:x.grad = None
或 x.grad.zero_()
。
-
张量的一阶导数:
import torchx = torch.tensor(2.0, requires_grad=True) y = x**2 y.backward() print("Gradient of x:", x.grad.item()) # Gradient of x: 4.0 print("Type of x.grad:", type(x.grad)) # Type of x.grad: <class 'torch.Tensor'>
-
张量的二阶导数:
import torchx = torch.tensor(2.0, requires_grad=True) y = x**3 y.backward(create_graph=True) # 计算一阶导数 first_derivative = x.grad.clone() # 获取一阶导数值 x.grad = None # 清空一阶导数值,以便存储二阶导数 first_derivative.backward() # 计算二阶导数 second_derivative = x.grad # 获取二阶导数值 print("Second derivative of x:", second_derivative.item()) # Second derivative of x: 12.0
然而,将 .backward()
函数的 create_graph
属性设置为 True
可能会导致内存泄漏。为了避免这种情况,创建计算图时经常使用 autograd.grad()
函数:
import torchx = torch.tensor(2.0, requires_grad=True)
y = x**4
first_derivative = torch.autograd.grad(y, x, create_graph=True)[0] # 计算一阶导数
second_derivative = torch.autograd.grad(first_derivative, x)[0] # 计算二阶导数
print("First derivative of x:", first_derivative.item()) # First derivative of x: 32.0
print("Second derivative of x:", second_derivative.item()) # Second derivative of x: 48.0
需要注意的是,求导的目标函数必须是标量,否则无法隐式创建梯度。
3. 概率论
-
聚合函数:使用
torch.sum(x)
/torch.mean(x)
/torch.max(x)
/torch.min(x)
/torch.std(x)
/torch.var(x)
计算张量元素的和 / 均值 / 最大值 / 最小值 / 标准差 / 方差,用法同x.sum()
/x.mean()
/x.max()
/x.min()
/x.std()
/x.var()
。聚合函数可以通过axis
指定聚合的维度:import torch x = torch.tensor([[[1, 2], [2, 3], [3, 4]], [[4, 5], [5, 6], [6, 7]]], dtype=torch.float32) a = x.sum() # tensor(48.) b = x.sum(axis=0) # tensor([[ 5., 7.], [ 7., 9.], [ 9., 11.]]) c = x.sum(axis=1) # tensor([[ 6., 9.], [15., 18.]]) d = x.sum(axis=2) # tensor([[ 3., 5., 7.], [ 9., 11., 13.]]) e = x.sum(axis=[0, 1]) # tensor([21., 27.])
还可以通过
keepdims
属性保持轴数不变:import torch x = torch.tensor([[[1, 2], [2, 3], [3, 4]], [[4, 5], [5, 6], [6, 7]]], dtype=torch.float32) a = x.sum(axis=1, keepdims=True) print(a) ''' tensor([[[ 6., 9.]],[[15., 18.]]]) '''
-
采样函数:可以使用
.sample()
函数对torch.distributions
模块中的各种概率分布对象进行采样,常见分布如下:torch.distributions.Categorical
:分类分布,是一种离散型随机变量分布,用于描述随机变量取每个类别值的概率;import torch import torch.distributions as dist probs = torch.tensor([0.2, 0.3, 0.5]) categorical_dist = dist.Categorical(probs) sample = categorical_dist.sample((20,))
torch.distributions.Bernoulli
:伯努利分布,也叫两点分布,是一种离散型随机变量分布,用于描述二值变量取每个值的概率;import torch.distributions as dist p = 0.6 bernoulli_dist = dist.Bernoulli(p) sample = bernoulli_dist.sample((20,))
torch.distributions.Multinomial
:多项式分布,是一种离散型随机变量分布,是二项分布的一般形式;import torch import torch.distributions as dist n = 10 probs = torch.tensor([0.1, 0.2, 0.7]) multinomial_dist = dist.Multinomial(n, probs) sample = multinomial_dist.sample()
torch.distributions.Poisson
:泊松分布,是一种离散型随机变量分布,用于描述随机变量在固定间隔中发生次数的概率;import torch.distributions as dist lam = 3 poisson_dist = dist.Poisson(lam) sample = poisson_dist.sample((20,))
torch.distributions.Uniform
:均匀分布,是一种连续型随机变量分布,用于描述随机变量在连续区间上均匀取值的情况;import torch.distributions as dist a, b = 3, 5 uniform_dist = dist.Uniform(a, b) sample = uniform_dist.sample((5,))
torch.distributions.Exponential
:指数分布,是一种连续型随机变量分布,是 Gamma 分布形状参数为 1 时的特例;import torch.distributions as dist lam = 3 exponential_dist = dist.Exponential(lam) sample = exponential_dist.sample((20,))
torch.distributions.Normal
:正态分布,是一种连续型随机变量分布,是最常见最一般的分布;import torch.distributions as dist mu = 0 sigma = 1 normal_dist = dist.Normal(mu, sigma) sample = normal_dist.sample((20,5))
torch.distributions.Gamma
:Gamma 分布,是一种连续型随机变量分布,用于描述某一事件发生的等待时间;import torch.distributions as dist gamma_dist = dist.Gamma(2, 1) sample = gamma_dist.sample((20,))
torch.distributions.Beta
:Beta 分布,是一种连续型随机变量分布,用于描述随机变量在有界区间 [0, 1] 上的取值情况;import torch.distributions as dist alpha, beta = 2, 5 beta_dist = dist.Beta(alpha, beta) sample = beta_dist.sample((5,))
.sample()
函数内可以加入采样张量的维度,为空则默认只采样一次,如果是一维张量,需要在维度后加上逗号,如:.sample((20,))
。
想要查找模块中更多的函数和类,可以调用 dir()
函数:
import torch
print(dir(torch.distributions))
想要查找特定函数和类的用法,可以调用 help()
函数:
import torch
help(torch.ones)
相关文章:
Pytorch 复习总结 1
Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》 本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。 Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1&…...
谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)
目录 模糊测试的智能化和自动化 模糊测试不能代替安全设计原则 AI驱动的漏洞修补...

华为配置内部人员接入WLAN网络示例(802.1X认证)
配置内部人员接入WLAN网络示例(802.1X认证) 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络,使用802.1X客户端进行认证,输入正确的用户名和密…...

EXCEL中如何调出“数据分析”的菜单
今天发现,原来WPS还是和EXCEL比,还是少了“数据分析”这个日常基本做统计的菜单,只好用EXCEL了,但奇怪发现我的EXCEL中没发现这个菜单,然后查了下,才发现,要用如下的方法打开: 1&…...

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)
完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>...

书生谱语-大语言模型测试demo
课程内容简介 通用环境配置 开发机 InterStudio 配置公钥 在本地机器上打开 Power Shell 终端。在终端中,运行以下命令来生成 SSH 密钥对: ssh-keygen -t rsa您将被提示选择密钥文件的保存位置,默认情况下是在 ~/.ssh/ 目录中。按 Enter …...

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI
文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…...

shell脚本编译与解析
文章目录 shell变量全局变量(环境变量)局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...
第64讲个人中心用户操作菜单实现
静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...
线性代数的本质——1 向量
向量是线性代数中最为基础的概念。 何为向量? 从物理上看, 向量就是既有大小又有方向的量,只要这两者一定,就可以在空间中随便移动。 从计算机应用的角度看,向量和列表很接近,可以用来描述某对象的几个不同…...

工业以太网交换机引领现代工厂自动化新潮流
随着科技的飞速发展,现代工厂正迎来一场前所未有的自动化变革,而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成,探讨这一集成如何推动工业生产的智能化、效率提升以及未…...

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理
通过“添加自定义菜单”来学习menuconfig图形化配置原理,将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”,此配置项处于菜单“My test m…...

推荐高端资源素材图库下载平台整站源码
推荐高端图库素材下载站的响应式模板和完整的整站源码,适用于娱乐网资源网。该模板支持移动端,并集成了支付宝接口。 演示地 址 : runruncode.com/tupiao/19692.html 页面设计精美,不亚于大型网站的美工水准,并且用户…...
Redis实现:每个进程每30秒执行一次任务
前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由
文章目录 前言一、RWKV-Runner是什么?RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示:这里可以添加本文要记录的大概内容: ChatGPT的横空出世,打开了AI的大门ÿ…...
Dockerfile和.gitlab-ci.yml文件模板
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum,也就是Linux系统的应用商店 Linux--基础开…...

Learn LaTeX 017 - LaTex Multicolumn 分栏
在科学排版中进行分栏操作,能够有效的利用页面中的空间,避免空白位置的浪费。 好的分栏设计能对你的排版增色不少! https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...
Android 9.0 禁用adb install 安装app功能
1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...

华为第二批难题五:AI技术提升六面体网格生成自动化问题
有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实,OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码,还没有仔细去学习。 “HybridOctree_Hex”的开发者说:六面体网格主要是用在数值模拟领域的,比如汽车…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...