C#基础之方法
文章目录
- 1 方法
- 1.1 定义方法
- 1.2 参数传递
- 1.2.1 按值传递参数
- 1.2.2 按引用传递参数
- 1.2.3 按输出传递参数
- 1.2.4 可变参数 params
- 1.2.5 具名参数
- 1.2.6 可选参数
- 1.3 匿名方法
- 1.3.1 Lambda 表达式
- 1.3.1.1 定义
- 1.3.1.2 常用类型
- 1.3.1.3 Lambda 表达式与 LINQ
- 1.3.1.4 Lambda 表达式的捕获变量
- 1.4 外部方法
- 1.4.1 定义
- 1.4.2 使用
- 1.5 扩展方法
- 1.5.1 定义
- 1.5.2 操作示例
1 方法
一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。
1.1 定义方法
当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{Method Body
}
下面是方法的各个元素:
Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void。Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。Method body:方法主体,包含了完成任务所需的指令集。
下面的代码片段显示一个函数 FindMax,它接受两个整数值,并返回两个中的较大值。它有 public 访问修饰符,所以它可以使用类的实例从类的外部进行访问。
class NumberManipulator
{public int FindMax(int num1, int num2){/* 局部变量声明 */int result;if (num1 > num2)result = num1;elseresult = num2;return result;}...
}
1.2 参数传递
当调用带有参数的方法时,需要向方法传递参数。在 C# 中,有三种向方法传递参数的方式:
| 方式 | 描述 |
|---|---|
| 值参数 | 这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。 |
| 引用参数 | 这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。 |
| 输出参数 | 这种方式可以返回多个值。 |
1.2.1 按值传递参数
这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。
实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。下面的实例演示了这个概念:
using System;
namespace CalculatorApplication
{class NumberManipulator{public void swap(int x, int y){int temp;temp = x; /* 保存 x 的值 */x = y; /* 把 y 赋值给 x */y = temp; /* 把 temp 赋值给 y */}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;int b = 200;Console.WriteLine("在交换之前,a 的值: {0}", a);Console.WriteLine("在交换之前,b 的值: {0}", b);/* 调用函数来交换值 */n.swap(a, b);Console.WriteLine("在交换之后,a 的值: {0}", a);Console.WriteLine("在交换之后,b 的值: {0}", b);Console.ReadLine();}}
}结果:
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:100
在交换之后,b 的值:200
结果表明,即使在函数内改变了值,值也没有发生任何的变化。
1.2.2 按引用传递参数
引用参数是一个对变量的内存位置的引用。当按引用传递参数时,与值参数不同的是,它不会为这些参数创建一个新的存储位置。引用参数表示与提供给方法的实际参数具有相同的内存位置。
在 C# 中,使用 ref 关键字声明引用参数。使用 ref,可以让方法直接操作调用方变量本身,而不是它的副本。
ref 的作用:
- 普通传值(按值传递):方法接收的是变量的副本,对副本的修改不会影响原变量。
- 引用传递(ref 传递):方法接收的是变量的引用,对引用指向的内存进行修改,会影响原变量。
栈与堆的关系:
- 值类型(如 int, float)通常存储在栈上。引用传递时,传递的是栈上变量的引用。
- 引用类型(如对象、数组)存储在堆上。引用传递时,
ref传递的是对堆上对象的引用。
下面的实例演示了这点:
using System;
namespace CalculatorApplication
{class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp = x; /* 保存 x 的值 */x = y; /* 把 y 赋值给 x */y = temp; /* 把 temp 赋值给 y */} static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;int b = 200;Console.WriteLine("在交换之前,a 的值: {0}", a);Console.WriteLine("在交换之前,b 的值: {0}", b);/* 调用函数来交换值 */n.swap(ref a, ref b);Console.WriteLine("在交换之后,a 的值: {0}", a);Console.WriteLine("在交换之后,b 的值: {0}", b);Console.ReadLine();}}
}
结果:
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:200
在交换之后,b 的值:100
结果表明,swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。
1.2.3 按输出传递参数
return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 out 关键字来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
下面的实例演示了这点:
using System;namespace CalculatorApplication
{class NumberManipulator{public void getValue(out int x ){int temp = 5;x = temp;}static void Main(string[] args){NumberManipulator n = new NumberManipulator();/* 局部变量定义 */int a = 100;Console.WriteLine("在方法调用之前,a 的值: {0}", a);/* 调用函数来获取值 */n.getValue(out a);Console.WriteLine("在方法调用之后,a 的值: {0}", a);Console.ReadLine();}}
}结果:
在方法调用之前,a 的值: 100
在方法调用之后,a 的值: 5
1.2.4 可变参数 params
当声明一个方法时,不能确定要传递给函数作为参数的参数数目。C# 参数数组解决了这个问题,参数数组通常用于传递未知数量的参数给函数。
在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。但是,一个方法中只能有一个可变参数 params,且必须在形参列表最后一个位置
params 的使用格式为:
public 返回类型 方法名称( params 类型名称[] 数组名称 )
实例
using System;
namespace ArrayApplication
{class ParamArray{public int AddElements(params int[] arr){int sum = 0;foreach (int i in arr){sum += i;}return sum;}}class TestClass{static void Main(string[] args){ParamArray app = new ParamArray();int sum = app.AddElements(512, 720, 250, 567, 889);Console.WriteLine("总和是: {0}", sum);Console.ReadKey();}}
}结果:
总和是: 2938
1.2.5 具名参数
具名参数允许调用方法时显式指定参数名称,而不是按位置传递参数。这对有多个参数的方法特别有用,因为可以选择性地设置某些参数,而忽略其他参数。
优点:
- 提高代码可读性。
- 避免因参数顺序出错而导致的问题
void PrintDetails(string name, int age, string city)
{Console.WriteLine($"Name: {name}, Age: {age}, City: {city}");
}// 具名参数调用
PrintDetails(name: "Alice", age: 25, city: "New York");// 顺序可以随意调整
PrintDetails(city: "Los Angeles", name: "Bob", age: 30);
1.2.6 可选参数
可选参数允许为方法的某些参数指定默认值,这样调用方法时可以省略这些参数
void Greet(string name, string greeting = "Hello")
{Console.WriteLine($"{greeting}, {name}!");
}// 调用时省略可选参数
Greet("Alice"); // 输出:Hello, Alice!// 调用时显式传递可选参数
Greet("Bob", "Hi"); // 输出:Hi, Bob!
1.3 匿名方法
在 C# 中,匿名函数是一种没有名字的方法,可以在代码中定义和使用。
匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。
在匿名方法中不需要指定返回类型,它是从方法主体内的 return 语句推断的。
1.3.1 Lambda 表达式
1.3.1.1 定义
Lambda 表达式是一个简洁的语法,用于创建匿名函数。它们通常用于 LINQ 查询和委托。
(parameters) => expression
// 或
(parameters) => { statement; }
其中:
parameters:传递给Lambda表达式的参数,可以省略括号 ()(当只有一个参数时)。=>:称为goes to操作符,分隔参数和方法体。expression 或 statements:要执行的代码,简单情况可以用一个表达式,复杂逻辑可以使用代码块{}。
注意:
- 作用范围:Lambda 表达式可以捕获外部变量,但要小心,这可能导致意外的闭包效果。
- 类型推断:C# 支持类型推断,Lambda 表达式的参数类型在多数情况下可以自动推断,无需显式声明类型。
- 简洁性:对于简单逻辑,可以直接写成 Lambda 表达式;对于复杂逻辑,最好用命名方法,避免代码难以阅读。
实例
// 示例:使用 Lambda 表达式定义一个委托
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(2, 3)); // 输出 5// 示例:使用 Lambda 表达式过滤数组中的元素
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{Console.WriteLine(num); // 输出 2 4
}
1.3.1.2 常用类型
Lambda 表达式通常用于定义委托或作为方法的参数,例如:
Func:定义具有返回值的Lambda表达式。Action:定义不具有返回值的Lambda表达式。Predicate:定义返回bool类型的Lambda表达式,常用于条件判断。
示例:不同类型的 Lambda 表达式
Func<int, int, int> multiply = (x, y) => x * y;
Console.WriteLine(multiply(3, 4)); // 输出:12Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
greet("Alice"); // 输出:Hello, Alice!Predicate<int> isEven = n => n % 2 == 0;
Console.WriteLine(isEven(4)); // 输出:True
1.3.1.3 Lambda 表达式与 LINQ
Lambda 表达式在 LINQ 查询中常用于指定筛选条件、排序方式等。例如,对一个 List<int> 进行筛选和排序:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0).OrderBy(n => n);foreach (var num in evenNumbers)
{Console.WriteLine(num); // 输出:2, 4, 6
}
1.3.1.4 Lambda 表达式的捕获变量
Lambda 表达式可以捕获外部作用域中的变量。捕获的变量与闭包类似,生命周期与 Lambda 表达式一致。
int factor = 3;
Func<int, int> multiplyByFactor = n => n * factor;
Console.WriteLine(multiplyByFactor(5)); // 输出:15
在这里,factor 是一个外部变量,multiplyByFactor 捕获了 factor,并在 Lambda 表达式中使用它。
1.4 外部方法
1.4.1 定义
外部方法是指那些用非托管代码(如C或C++)编写的函数,这些函数被编译成动态链接库(DLL)或其他形式的可执行文件。C#程序通过P/Invoke(Platform Invocation Services) 机制调用这些外部方法,P/Invoke 允许托管代码(如C#)调用非托管代码。
在C#中,调用外部方法(也称为外部函数或P/Invoke方法)之前需要先声明,这是因为C#是一种类型安全的语言,它需要在编译时知道方法的签名(即方法的名称、参数类型和返回类型)。外部方法通常指的是那些用非托管代码(如C或C++编写的DLL文件)实现的方法。
为什么需要先声明:
- 类型安全:
C#编译器需要在编译时知道方法的签名,以确保调用时传递的参数类型和数量是正确的。 - 元数据:声明外部方法时,可以提供关于方法的元数据(如
DLL名称、入口点名称等),这些信息是运行时环境(CLR,Common Language Runtime)用来加载和调用非托管代码所必需的。 - 编译时检查:通过声明外部方法,编译器可以在编译时检查调用的正确性,减少运行时错误。
1.4.2 使用
在C#中,可以使用DllImport属性来声明外部方法。DllImport属性指定了包含该方法的DLL文件的名称和入口点(即方法的名称)。以下是一个简单的例子:
using System;
using System.Runtime.InteropServices; class Program
{ // 声明外部方法 [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr GetModuleHandle(string lpModuleName); static void Main() { // 调用外部方法 IntPtr handle = GetModuleHandle("kernel32.dll"); Console.WriteLine("Handle: " + handle); }
}
在这个例子中,GetModuleHandle是一个外部方法,它位于kernel32.dll中。我们使用DllImport特性来声明这个方法,并在Main方法中调用它。
注意事项:
- 字符集:使用
CharSet属性指定字符集(如CharSet.Auto、CharSet.Ansi或CharSet.Unicode),这会影响字符串参数的传递方式。 - 调用约定:默认情况下,
P/Invoke使用stdcall调用约定。如果外部方法使用其他调用约定(如cdecl),需要使用CallingConvention枚举来指定。 - 错误处理:调用外部方法时,可能会遇到各种错误(如找不到DLL、方法签名不匹配等)。因此,适当的错误处理是非常重要的。
1.5 扩展方法
1.5.1 定义
在 C# 中,扩展方法(Extension Method)是允许在不修改类代码或创建子类的情况下,为现有类型添加 新方法的一种机制。扩展方法本质上是一个静态方法,但它的调用方式和实例方法类似,使得我们可以在不修改源代码的情况下增强类的功能。
扩展方法必须满足以下条件:
- 必须定义在
静态类中 - 方法本身必须是
静态的 - 第一个参数必须使用
this关键字修饰,并指定参数类型即要扩展的类型
this 关键字的作用:
- 标识扩展方法:
this关键字告诉编译器这是一个扩展方法,而不是普通的静态方法。 - 指定扩展类型:
this后面的参数类型就是要扩展的类型。 - 调用方式:可以像调用实例方法一样调用扩展方法。
扩展方法的优点:
- 无需修改原类:无需更改或继承现有类型即可添加新方法。
- 提高代码可读性:扩展方法让代码更具可读性,因为它们可以像实例方法一样调用。
- 方便维护:扩展方法通常集中在一个静态类中,有助于代码模块化和维护。
注意事项:
- 扩展方法的命名冲突:如果类型本身已经定义了一个与扩展方法同名的方法,实例方法优先。扩展方法只会在没有实例方法的情况下被调用。
this关键字仅用于第一个参数:扩展方法的第一个参数是要扩展的类型,必须用this关键字修饰。扩展方法只能有一个 this 参数。- 命名空间的引用:要使用扩展方法,必须引用扩展方法所在的命名空间。
- 适用场景:扩展方法通常用于增强不可修改的类(如第三方库类)或基础类型(如 string、int 等)而不推荐滥用
1.5.2 操作示例
以下示例演示如何为 string 类型定义一个扩展方法 ToCapitalize,用于将字符串的首字母大写:
// 定义一个静态类来容纳扩展方法
public static class StringExtensions
{// 定义一个静态扩展方法,用于将字符串首字母大写public static string ToCapitalize(this string input){if (string.IsNullOrEmpty(input))return input;return char.ToUpper(input[0]) + input.Substring(1).ToLower();}
}// 使用扩展方法
public class Program
{public static void Main(){string text = "hello world";// 调用扩展方法,就像调用实例方法一样string capitalizedText = text.ToCapitalize();Console.WriteLine(capitalizedText); // 输出 "Hello world"}
}
为 int 类型添加一个扩展方法,计算该整数的平方:
public static class IntExtensions
{public static int Square(this int number){return number * number;}
}public class Program
{public static void Main(){int number = 5;int square = number.Square(); // 调用扩展方法Console.WriteLine(square); // 输出 25}
}
相关文章:
C#基础之方法
文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...
JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】
前言: 前面我们分析怎么去预估系统资源,怎么去设置 JVM 参数以及怎么去看 GC 日志,本篇我们分享一些常用的 JVM 调优工具,我们在进行 JVM 调优的时候,通常需要借助一些工具来对系统的进行相关分析,从而确定…...
PostgreSQL 三种关库模式
PostgreSQL 三种关库模式 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777PostgreSQL 提供了三种关库模式&…...
《运放秘籍》第二部:仪表放大器专项知识点总结
一、差分放大器与仪表放大器的讨论 1.1. 仪放的前世今生——差分放大器原理? 1.2. 差分放大的原理 1.3. 差分放大器检测电流 1.4. 差分放大器端一:输入阻抗 1.5. 差分放大器端二:共模抑制比 1.6. 为什么关注输入阻抗?共模抑…...
C++STL之vector(超详细)
CSTL之vector 1.vector基本介绍2.vector重要接口2.1.构造函数2.2.迭代器2.3.空间2.3.1.resize2.3.2.capacity 2.4.增删查找 3.迭代器失效4.迭代器分类 🌟🌟hello,各位读者大大们你们好呀🌟🌟 🚀Ὠ…...
ubuntu环境下安装electron环境,并快速打包
1.配置镜像源 关闭防火墙,命令:sudo ufw disable 1.1配置国内镜像源: vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...
【Pytorch】优化器(Optimizer)模块‘torch.optim’
torch.optim 是 PyTorch 中提供的优化器(Optimizer)模块,用于优化神经网络模型的参数,更新网络权重,使得模型在训练过程中最小化损失函数。它提供了多种常见的优化算法,如 梯度下降法(SGD&#…...
API平台建设之路:从0到1的实践指南
在这个互联网蓬勃发展的时代,API已经成为连接各个系统、服务和应用的重要纽带。搭建一个优质的API平台不仅能为开发者提供便利,更能创造可观的商业价值。让我们一起探讨如何打造一个成功的API平台。 技术架构是API平台的根基。选择合适的技术栈对平台的…...
【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器
DataStream API编程模型 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 文章目录 DataStream API编程模型前言1.触发器1.1 代码示例 2.驱逐器2.1 代码示例 总结 前言 本小节我想…...
信号灯集以及 P V 操作
一、信号灯集 1.1 信号灯集的概念 信号灯集是进程间同步的一种方式。 信号灯集创建后,在信号灯集内部会有很多个信号灯。 每个信号灯都可以理解为是一个信号量。 信号灯的编号是从0开始的。 比如A进程监视0号灯,B进程监视1号灯。 0号灯有资源&…...
在 Flutter app 中,通过视频 URL 下载视频到手机相册
在 Flutter app 中,通过视频 URL 下载视频到手机相册可以通过以下步骤实现: 1. 添加依赖 使用 dio 下载文件,结合 path_provider 获取临时存储路径,以及 gallery_saver 将文件保存到相册。 在 pubspec.yaml 中添加以下依赖&…...
Nature Methods | 人工智能在生物与医学研究中的应用
Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能(AI)技术的迅速发展,尤其是深度学习和大规模预训练模型的出现,AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…...
Axure PR 9 随机函数 设计交互
大家好,我是大明同学。 这期内容,我们将深入探讨Axure中随机函数的用法。 随机函数 创建随机函数所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个矩形元件。 3.选中矩形元件,样式窗格中,将…...
【人工智能基础05】决策树模型
文章目录 一. 基础内容1. 决策树基本原理1.1. 定义1.2. 表示成条件概率 2. 决策树的训练算法2.1. 划分选择的算法信息增益(ID3 算法)信息增益比(C4.5 算法)基尼指数(CART 算法)举例说明:计算各个…...
【人工智能基础03】机器学习(练习题)
文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数,判断一个损失函数的好坏无监督分类:kmeans无监督分类,Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…...
HarmonyOS(60)性能优化之状态管理最佳实践
状态管理最佳实践 1、避免在循环中访问状态变量1.1 反例1.2 正例 2、避免不必要的状态变量的使用3、建议使用临时变量替换状态变量3.1 反例3.2 正例 4、参考资料 1、避免在循环中访问状态变量 在应用开发中,应避免在循环逻辑中频繁读取状态变量,而是应该…...
数据库课程设计报告 超市会员管理系统
一、系统简介 1.1设计背景 受到科学技术的推动,全球计算机的软硬件技术迅速发展,以计算机为基础支撑的信息化如今已成为现代企业的一个重要标志与衡量企业综合实力的重要标准,并且正在悄无声息的影响与改变着国内外广泛的中小型企业的运营模…...
C++算法练习-day54——39.组合总和
题目来源:. - 力扣(LeetCode) 题目思路分析 题目:给定一个整数数组 candidates 和一个目标数 target,找出所有独特的组合,这些组合中的数字之和等于 target。每个数字在每个组合中只能使用一次。 思路&a…...
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Linux的文件系统
这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点:多级索引…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
