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

6_TypeScript 函数 --[深入浅出 TypeScript 测试]

在 TypeScript 中,函数是编程的核心组成部分之一。TypeScript 不仅继承了 JavaScript 的所有函数特性,还添加了静态类型检查和其他一些增强功能,使得函数更加安全和易于理解。以下是关于 TypeScript 函数的一些关键点和两个具体的示例:

TypeScript 函数的基本概念

  1. 函数声明

    • 使用 function 关键字来声明一个函数。
  2. 函数表达式

    • 将函数作为值赋给变量。
  3. 箭头函数

    • 一种更简洁的函数定义方式,没有自己的 thisargumentssupernew.target 绑定。
  4. 参数类型注解

    • 可以为每个参数指定类型。
  5. 返回值类型注解

    • 指定函数的返回值类型。
  6. 可选参数

    • 使用 ? 来标记参数为可选。
  7. 默认参数

    • 为参数提供默认值。
  8. 剩余参数

    • 使用 ... 来表示可以传递任意数量的参数。
  9. 重载

    • 提供多个函数签名以支持多种调用方式。

函数定义

在 TypeScript 中,函数定义可以非常灵活,并且可以通过添加类型注解来确保参数和返回值的类型正确性。以下是几种定义函数的方式,包括普通函数、箭头函数以及带有类型注解的函数定义。

1. 普通函数定义

使用 function 关键字来定义一个函数。你可以为每个参数指定类型,并且可以指定返回值的类型。

function greet(name: string): string {return `Hello, ${name}!`;
}// 使用示例
console.log(greet("Alice")); // 输出:Hello, Alice!

在这个例子中,greet 函数接收一个 string 类型的参数 name 并返回一个 string 类型的问候信息。

2. 箭头函数定义

箭头函数提供了一种更简洁的语法来定义函数。它们没有自己的 this 绑定,通常用于较短的函数表达式。

const add = (a: number, b: number): number => a + b;// 使用示例
console.log(add(5, 3)); // 输出:8

这里我们定义了一个名为 add 的箭头函数,它接收两个 number 类型的参数并返回它们的和。

3. 函数类型注解

你也可以定义一个函数类型的变量或接口,这有助于更好地描述函数的结构。

函数类型别名
type GreetFunction = (name: string) => string;const greetPerson: GreetFunction = (name) => `Hello, ${name}!`;// 使用示例
console.log(greetPerson("Bob")); // 输出:Hello, Bob!
接口定义函数类型
interface IGreetFunction {(name: string): string;
}const greetVisitor: IGreetFunction = function(name) {return `Welcome, ${name}!`;
};// 使用示例
console.log(greetVisitor("Charlie")); // 输出:Welcome, Charlie!

4. 可选参数和默认参数

TypeScript 支持可选参数(通过在参数后加 ?)和默认参数(直接赋值给参数)。

function createUser(name: string, age?: number, country: string = "Unknown"): string {return `User: ${name}, Age: ${age !== undefined ? age : 'Not provided'}, Country: ${country}`;
}// 使用示例
console.log(createUser("David")); // 输出:User: David, Age: Not provided, Country: Unknown
console.log(createUser("Eve", 29, "Canada")); // 输出:User: Eve, Age: 29, Country: Canada

5. 剩余参数(Rest Parameters)

当你不确定会有多少个参数时,可以使用剩余参数。这些参数会被收集到一个数组中。

function sum(...numbers: number[]): number {return numbers.reduce((acc, curr) => acc + curr, 0);
}// 使用示例
console.log(sum(1, 2, 3, 4, 5)); // 输出:15

6. 函数重载

TypeScript 允许为同一个函数提供多个调用签名,以支持多种调用方式。这是通过函数重载实现的。

function makeArray<T>(...items: T[]): T[];
function makeArray(): any[];function makeArray<T>(...items: T[]): T[] {return items;
}// 使用示例
console.log(makeArray<number>(1, 2, 3)); // 输出:[1, 2, 3]
console.log(makeArray()); // 输出:[]

以上就是 TypeScript 中定义函数的一些常见方式。每种方法都有其适用场景,选择合适的方法可以使代码更加清晰和易于维护。通过使用类型注解,我们可以提前捕获许多潜在的错误,提高代码的质量。

调用函数

调用函数在 TypeScript 中与 JavaScript 中的方式相同,但 TypeScript 提供了类型检查来确保传入的参数和返回值符合预期。以下是两个具体的示例,展示了如何定义并调用函数。

示例 1: 调用一个简单的函数

假设我们有一个函数 greet,它接收一个名字作为参数,并返回一个问候信息。我们将展示如何定义这个函数以及如何调用它。

// 定义函数
function greet(name: string): string {return `Hello, ${name}!`;
}// 调用函数并输出结果
const message = greet("Alice");
console.log(message); // 输出:Hello, Alice!

在这个例子中,我们定义了一个名为 greet 的函数,它接受一个字符串类型的参数 name 并返回一个字符串。然后,我们通过传递参数 "Alice" 来调用该函数,并将返回的结果存储在变量 message 中,最后打印出这条消息。

示例 2: 调用带有多个参数和默认参数的函数

接下来,我们定义一个更复杂的函数 createProfile,它可以接收多个参数,包括可选参数和默认参数。我们将演示如何使用不同的参数组合来调用这个函数。

// 定义函数
function createProfile(name: string, age?: number, country: string = "Unknown"): string {return `Profile - Name: ${name}, Age: ${age !== undefined ? age : 'Not provided'}, Country: ${country}`;
}// 第一次调用函数,只提供必填参数
const profile1 = createProfile("Bob");
console.log(profile1); // 输出:Profile - Name: Bob, Age: Not provided, Country: Unknown// 第二次调用函数,提供所有参数
const profile2 = createProfile("Charlie", 30, "Canada");
console.log(profile2); // 输出:Profile - Name: Charlie, Age: 30, Country: Canada

在这个例子中:

  • createProfile 函数定义了三个参数:name 是必需的,age 是可选的(通过 ? 标记),而 country 则有一个默认值 "Unknown"
  • 我们首先调用了 createProfile,仅提供了必需的 name 参数。由于 age 是可选的且未提供,因此它的值被显示为 'Not provided',同时 country 使用了默认值。
  • 然后,我们再次调用 createProfile,这次提供了所有的参数,因此输出中包含了完整的个人信息。

这两个示例展示了 TypeScript 中调用函数的基本方式,以及如何处理不同类型的参数(如必需参数、可选参数和默认参数)。TypeScript 的类型系统确保了即使在编译时也能捕捉到错误的参数类型或数量,从而提高了代码的健壮性和安全性。

函数返回值

在 TypeScript 中,函数的返回值类型可以通过显式声明来确保代码的安全性和可预测性。通过指定返回值类型,TypeScript 可以帮助开发者捕获潜在的错误,并使代码更易于理解。以下是两个具体的示例,展示了如何定义具有明确返回值类型的函数以及如何使用这些函数。

示例 1: 返回简单数据类型

假设我们有一个函数 calculateArea,它接收一个圆的半径并返回该圆的面积。我们将展示如何定义这个函数并调用它,同时指定返回值类型为 number

// 定义函数,指定返回值类型为 number
function calculateArea(radius: number): number {return Math.PI * radius * radius;
}// 调用函数并输出结果
const area = calculateArea(5);
console.log(`圆的面积是: ${area.toFixed(2)}`); // 输出:圆的面积是: 78.54

在这个例子中:

  • calculateArea 函数接收一个 number 类型的参数 radius 并返回一个 number 类型的结果。
  • 我们通过传递参数 5 来调用该函数,并将返回的面积值存储在变量 area 中。
  • 使用 toFixed(2) 方法格式化输出,保留两位小数。

示例 2: 返回复杂数据类型(对象)

接下来,我们定义一个函数 createUserProfile,它接收用户信息并返回一个包含这些信息的对象。我们将演示如何定义和调用这个函数,同时指定返回值类型为一个接口或类型别名。

// 定义返回值的类型
interface UserProfile {name: string;age: number;country: string;
}// 定义函数,指定返回值类型为 UserProfile 接口
function createUserProfile(name: string, age: number, country: string): UserProfile {return {name,age,country};
}// 调用函数并输出结果
const profile = createUserProfile("Alice", 30, "China");
console.log(`用户资料 - 名字: ${profile.name}, 年龄: ${profile.age}, 国家: ${profile.country}`);
// 输出:用户资料 - 名字: Alice, 年龄: 30, 国家: China

在这个例子中:

  • 我们首先定义了一个 UserProfile 接口,用于描述返回对象的结构。
  • createUserProfile 函数接收三个参数,并返回一个符合 UserProfile 接口的对象。
  • 我们通过传递参数 "Alice", 30, 和 "China" 来调用该函数,并将返回的对象存储在变量 profile 中。
  • 最后,我们打印出用户资料的信息。

这两个示例展示了如何在 TypeScript 中为函数指定返回值类型。第一个例子处理的是简单的数值计算,而第二个例子则涉及到了返回复杂的数据结构(如对象)。通过明确指定返回值类型,我们可以确保函数的行为更加清晰和可靠,同时也提高了代码的维护性和扩展性。

带参数函数

在 TypeScript 中,定义带参数的函数是非常常见的操作。通过为参数指定类型,可以确保传入的数据符合预期,从而提高代码的安全性和可读性。以下是两个具体的示例,展示了如何定义和使用带参数的函数。

示例 1: 带有基本类型参数的函数

假设我们有一个函数 calculateDiscount,它接收商品的价格和折扣率,并返回打折后的价格。我们将展示如何定义这个函数并调用它,同时指定参数和返回值的类型。

// 定义函数,指定参数和返回值类型
function calculateDiscount(price: number, discountRate: number): number {return price * (1 - discountRate);
}// 调用函数并输出结果
const originalPrice = 200;
const discountRate = 0.2; // 20% 折扣
const discountedPrice = calculateDiscount(originalPrice, discountRate);
console.log(`原价 ${originalPrice} 打折后是: ${discountedPrice.toFixed(2)}`); // 输出:原价 200 打折后是: 160.00

在这个例子中:

  • calculateDiscount 函数接收两个 number 类型的参数 pricediscountRate,并返回一个 number 类型的结果。
  • 我们通过传递参数 200(原价)和 0.2(20%折扣率)来调用该函数,并将返回的打折后价格存储在变量 discountedPrice 中。
  • 使用 toFixed(2) 方法格式化输出,保留两位小数。

示例 2: 带有对象参数的函数

接下来,我们定义一个函数 greetUser,它接收一个包含用户信息的对象作为参数,并返回一个个性化的问候消息。我们将演示如何定义和调用这个函数,同时指定参数类型为一个接口或类型别名。

// 定义参数类型的接口
interface User {name: string;age?: number; // 可选属性country: string;
}// 定义函数,指定参数类型为 User 接口
function greetUser(user: User): string {return `Hello, ${user.name}! You are from ${user.country}.${user.age !== undefined ? ` You are ${user.age} years old.` : ''}`;
}// 调用函数并输出结果
const user1: User = { name: "Alice", country: "China" };
const user2: User = { name: "Bob", age: 30, country: "USA" };console.log(greetUser(user1)); // 输出:Hello, Alice! You are from China.
console.log(greetUser(user2)); // 输出:Hello, Bob! You are from USA. You are 30 years old.

在这个例子中:

  • 我们首先定义了一个 User 接口,用于描述用户对象的结构,其中 age 是一个可选属性。
  • greetUser 函数接收一个符合 User 接口的对象作为参数,并返回一个字符串类型的个性化问候消息。
  • 我们创建了两个不同的用户对象 user1user2,分别调用 greetUser 函数,并根据用户的详细信息打印出不同的问候消息。

这两个示例展示了如何在 TypeScript 中定义带参数的函数。第一个例子处理的是简单的数值计算,而第二个例子则涉及到了更复杂的数据结构(如对象)。通过明确指定参数类型,我们可以确保函数的行为更加清晰和可靠,同时也提高了代码的维护性和扩展性。

匿名函数

在 TypeScript 中,匿名函数是没有名字的函数表达式。它们可以被赋值给变量、作为参数传递给其他函数(即回调函数),或者立即执行(IIFE)。匿名函数同样支持 TypeScript 的类型系统,允许你为参数和返回值指定类型。以下是两个具体的示例,展示了如何定义和使用匿名函数。

示例 1: 匿名函数作为变量

在这个例子中,我们将一个匿名函数赋值给变量 addNumbers,然后调用这个变量来执行函数。

// 定义匿名函数并赋值给变量
const addNumbers = function (a: number, b: number): number {return a + b;
};// 调用匿名函数
console.log(addNumbers(5, 3)); // 输出:8

在这个例子中:

  • 我们定义了一个匿名函数,并将其赋值给常量 addNumbers
  • 这个匿名函数接收两个 number 类型的参数 ab,并返回它们的和。
  • 我们通过调用 addNumbers 来执行该匿名函数,并输出结果。

示例 2: 匿名函数作为回调函数

在这个例子中,我们创建一个名为 processNumbers 的函数,它接受一个数组和一个处理每个元素的回调函数作为参数。我们将匿名函数作为回调函数传递给 processNumbers

// 定义一个函数,接收数组和一个回调函数作为参数
function processNumbers(numbers: number[], callback: (num: number) => number): number[] {return numbers.map(callback);
}// 使用匿名函数作为回调函数
const squaredNumbers = processNumbers([1, 2, 3, 4], function (num: number): number {return num * num;
});console.log(squaredNumbers); // 输出:[1, 4, 9, 16]

在这个例子中:

  • processNumbers 函数接收一个数字数组 numbers 和一个回调函数 callback。它使用 map 方法将数组中的每个元素传递给回调函数,并返回一个新的数组。
  • 我们调用 processNumbers,并将一个匿名函数作为回调函数传递给它。这个匿名函数接收一个 number 类型的参数 num,并返回它的平方。
  • 最后,我们打印出处理后的数组 squaredNumbers,其内容是原数组中每个元素的平方。

这两个示例展示了匿名函数在 TypeScript 中的两种常见用途:作为变量存储的函数表达式和作为回调函数传递给其他函数。通过这种方式,你可以创建灵活且易于复用的代码结构,同时利用 TypeScript 的类型检查确保代码的安全性和可读性。

构造函数

在 TypeScript 中,构造函数是用于创建和初始化对象的特殊方法。它们通常与类一起使用,当通过 new 关键字实例化类时自动调用。构造函数可以接受参数来设置新对象的初始状态。以下是两个具体的示例,展示了如何定义和使用构造函数。

示例 1: 带有基本类型属性的类构造函数

假设我们有一个 Person 类,它包含姓名和年龄两个属性。我们将展示如何定义这个类以及它的构造函数,并实例化该类以创建新的 Person 对象。

// 定义一个带有构造函数的 Person 类
class Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}// 定义一个方法来描述对象describe(): string {return `${this.name} is ${this.age} years old.`;}
}// 使用构造函数创建 Person 实例
const alice = new Person("Alice", 30);
console.log(alice.describe()); // 输出:Alice is 30 years old.const bob = new Person("Bob", 25);
console.log(bob.describe()); // 输出:Bob is 25 years old.

在这个例子中:

  • Person 类有两个属性 nameage,以及一个构造函数,它接收两个参数并分别赋值给这两个属性。
  • describe 方法返回一个字符串,描述了 Person 对象的信息。
  • 我们使用 new 关键字和构造函数来创建 alicebob 这两个 Person 实例,并调用 describe 方法输出它们的描述信息。

示例 2: 构造函数参数属性简化

TypeScript 提供了一种更简洁的方式来定义构造函数参数和类属性。你可以直接在构造函数参数前添加访问修饰符(如 public, private, 或 protected),这将自动创建相应的类属性,并将其初始化为传入的值。

// 定义一个带有构造函数参数属性简化的 Book 类
class Book {constructor(public title: string, public author: string, private year: number) {}// 定义一个方法来获取书籍信息getInfo(): string {return `${this.title} by ${this.author}, published in ${this.year}`;}
}// 使用构造函数创建 Book 实例
const book1 = new Book("The Great Gatsby", "F. Scott Fitzgerald", 1925);
console.log(book1.getInfo()); // 输出:The Great Gatsby by F. Scott Fitzgerald, published in 1925// 注意:year 是私有属性,不能从外部访问
// console.log(book1.year); // 编译错误:'year' 是私有的,只能在类 'Book' 内部访问。

在这个例子中:

  • Book 类使用了构造函数参数属性简化语法,其中 titleauthor 被标记为 public,因此可以直接在实例上访问;而 year 被标记为 private,所以它只能在类内部访问。
  • getInfo 方法返回一个字符串,包含了书籍的详细信息。
  • 我们创建了一个 book1Book 实例,并调用了 getInfo 方法来输出书籍信息。
  • 尝试访问私有属性 year 会导致编译错误,体现了 TypeScript 的访问控制机制。

这两个示例展示了如何在 TypeScript 中定义和使用构造函数。第一个例子提供了一个基本的例子,说明了如何在构造函数中初始化属性;第二个例子则展示了如何利用 TypeScript 的特性来简化代码,同时保持良好的封装性和安全性。

函数重载

TypeScript 的函数重载(Function Overloading)允许你为同一个函数提供多个调用签名。这使得你可以根据传入参数的数量和类型,以不同的方式调用同一个函数。通过定义多个函数声明来描述所有可能的调用方式,然后编写一个通用的实现。以下是两个具体的示例,展示了如何使用函数重载。

示例 1: 处理不同类型的数据

假设我们有一个 format 函数,它可以根据传入的是字符串还是数字来格式化输出。我们将展示如何定义这个函数的重载签名以及其实现。

// 定义函数重载签名
function format(input: string): string;
function format(input: number): string;// 实现通用函数
function format(input: string | number): string {if (typeof input === 'string') {return `"${input}"`;} else if (typeof input === 'number') {return input.toFixed(2);}throw new Error('Unsupported type');
}// 使用示例
console.log(format("Hello")); // 输出:"Hello"
console.log(format(3.14159)); // 输出:3.14

在这个例子中:

  • 我们定义了两个重载签名,分别处理字符串和数字类型的输入。
  • 实现部分接受联合类型 string | number,并根据实际传入的参数类型进行相应的处理。
  • 当传递字符串时,返回带引号的字符串;当传递数字时,返回保留两位小数的字符串表示。
  • 如果传入了不支持的类型,则抛出错误。

示例 2: 接受不同数量的参数

接下来,我们定义一个 createRectangle 函数,它可以创建矩形对象。该函数既可以接收宽度和高度作为参数,也可以只接收一个正方形的边长。我们将展示如何使用函数重载来实现这一点。

// 定义函数重载签名
function createRectangle(width: number, height: number): { width: number; height: number };
function createRectangle(size: number): { width: number; height: number };// 实现通用函数
function createRectangle(a: number, b?: number): { width: number; height: number } {if (b !== undefined) {// 如果提供了两个参数,则认为是宽和高return { width: a, height: b };} else {// 如果只提供了一个参数,则认为是正方形的边长return { width: a, height: a };}
}// 使用示例
const rect1 = createRectangle(10, 20);
console.log(`Rectangle with width ${rect1.width} and height ${rect1.height}`); // 输出:Rectangle with width 10 and height 20const square = createRectangle(5);
console.log(`Square with side length ${square.width}`); // 输出:Square with side length 5

在这个例子中:

  • 我们定义了两个重载签名,一个用于接收两个参数(宽度和高度),另一个用于接收单个参数(正方形的边长)。
  • 实现部分检查是否提供了第二个参数。如果有,则创建一个具有指定宽度和高度的矩形;如果没有,则创建一个边长为给定值的正方形。
  • 通过调用 createRectangle 并传递不同数量的参数,我们可以创建不同类型的几何图形。

这两个示例展示了 TypeScript 中函数重载的强大功能。第一个例子说明了如何根据参数类型的不同来改变函数的行为,而第二个例子则展示了如何根据提供的参数数量来调整函数的功能。函数重载使代码更加灵活且易于扩展,同时保持了类型安全性和清晰的接口定义。

相关文章:

6_TypeScript 函数 --[深入浅出 TypeScript 测试]

在 TypeScript 中&#xff0c;函数是编程的核心组成部分之一。TypeScript 不仅继承了 JavaScript 的所有函数特性&#xff0c;还添加了静态类型检查和其他一些增强功能&#xff0c;使得函数更加安全和易于理解。以下是关于 TypeScript 函数的一些关键点和两个具体的示例&#x…...

Apifox=Postman+Swagger+Jmeter+Mock

A. 开发人员接口管理使用(Swagger 工具管理接口) B. 后端开发人员通过Postman 工具&#xff0c;一边开发一边测试 C. 前端开发人员需要Mock 工具提供前端调用 D. 测试人员通过(Postman、Jmeter)等工具进行接口测试 为了后台开发、前端开发、测试工程师等不同角色更加便捷管理…...

升级 Spring Boot 3 配置讲解 —— Spring Boot 3 核心源码专讲

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; Spring Boot 3 是 Spring 生态中的重要里程碑&#xff0c;它不仅全面支持 Java 17&#xff0c;还引入了许多新特性&#xff0c;如对 GraalVM 原生镜像的支持、改进的性能优化以及更灵活的…...

接口开发完后,个人对于接下来接口优化的一些思考

优化点 入参的合法性和长度范围&#xff0c;必填项的检查验证 因为没有入参&#xff0c;所以不需要考虑。 批量思想解决N1问题 // 假设要查询100个订单及其对应的用户信息 List<Order> orders orderMapper.selectList(new QueryWrapper<>().last("limit …...

jenkins 使用 ssh-agent向windows进行部署

背景&#xff1a; jenkins在linux的docker环境内&#xff0c;应用服务部署在windows。需要使用jenkins实现自动化部署。 实现方式&#xff1a; jenkins上构建pipeline任务&#xff0c;脚本如下&#xff1a; 遇到问题&#xff1a; 1、问题&#xff1a;jenkins 调用部署bat脚…...

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式&#xff08;像素格式&#xff09;、分辨率、帧率信息&#xff1a; ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 &#xff08;…...

如果Adobe 退出中国后怎么办

最近听说Adobe要退出中国了?那咱们的设计师们可得好好想想怎么搞到正版软件了。别急&#xff0c;今天教大家一个超酷的福利——Edu邮箱&#xff01; Edu邮箱是什么&#xff1f;有什么好处&#xff1f; Edu邮箱就是学校给学生和老师们发的邮箱&#xff0c;一般结尾是.edu。有了…...

欧几里得距离在权重矩阵中的物理意义

欧几里得距离在权重矩阵中的物理意义 目录 欧几里得距离在权重矩阵中的物理意义**衡量神经元差异程度**:**反映模型变化程度**:**聚类和分组的依据**:自然语言处理中的模型更新:**神经网络聚类分组**:欧几里得距离在权重矩阵中的物理意义衡量神经元差异程度: 在神经网络中…...

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…...

Linux-----进程通讯(管道Pipe)

目录 进程不共享内存 匿名管道 通过匿名管道实现通讯 有名管道 库函数mkfifo() 案例 进程不共享内存 不同进程之间内存是不共享的。是相互独立的。 #include <stdio.h> #include <stdlib.h> #include <errno.h>int num 0;int main(int argc, char con…...

【C++11】列表初始化、右值引用和移动语义、引用折叠、完美转发

C11 一.C的发展历史二.列表初始化1.C98的{}2.C11的{}3.C11中的std::initializer_list 三.右值引用和移动语义1.左值和右值2.左值引用和右值引用3.引用延长生命周期4.左值和右值的参数匹配5.右值引用和移动语义使用场景1.左值引用使用场景2.移动构造和移动赋值3.右值引用和移动语…...

Openssl1.1.1s rpm包构建与升级

rpmbuild入门知识 openssh/ssl二进制升级 文章目录 前言一、资源准备1.下载openssh、openssl二进制包2.安装rpmbuild工具3.拷贝源码包到SOURCES目录下4.系统开启telnet&#xff0c;防止意外导致shh无法连接5.编译工具安装6.补充说明 二、制作 OpenSSL RPM 包1.编写 SPEC 文件2.…...

递归思想的深度理解——汉诺塔问题和青蛙跳台阶问题

递归的深度理解——汉诺塔问题and青蛙跳台阶问题 青蛙跳台阶问题汉诺塔问题 青蛙跳台阶问题 问题&#xff1a;一只青蛙可以一次跳一级台阶&#xff0c;也可以一次跳两级台阶&#xff0c;如果青蛙要跳n级台阶&#xff0c;共有多少种跳法&#xff1f; 解答&#xff1a;我们可以先…...

从数据到诊断:朴素贝叶斯算法助力肿瘤预测之路

1.案例概述 肿瘤性质的判断影响着患者的治疗方式和痊愈速度。传统的做法是医生根据数十个指标来判断肿瘤的性质&#xff0c;预测效果依赖于医生的个人经验而且效率较低&#xff0c;而通过机器学习有望能快速预测肿瘤的性质。 2.数据集 本次肿瘤预测使用的数据集共有569组样本…...

Element-UI:如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中?

如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中&#xff1f; 在使用 Element UI 的 Table 组件时&#xff0c;如果你想要禁用某一行的选中&#xff08;特别是在多选模式下&#xff09;&#xff0c;可以通过自定义行的 selectable 属性来实现。selectable …...

Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py

此脚本的主要功能是可视化点云数据文件&#xff08;.pcd 文件&#xff09;&#xff0c;并通过键盘交互选择演示数据的起始帧和结束帧&#xff0c;生成片段标记文件 (clip_marks.json) 主要流程包括&#xff1a; 用户指定数据目录&#xff1a;检查目录是否存在并处理标记文件 -…...

JWT理解

前言 随着互联网的快速发展&#xff0c;身份验证和授权成为了许多应用的重要需求。JWT&#xff08;JSON Web Token&#xff09;作为一种轻量级的身份验证和授权机制&#xff0c;得到了广泛的应用。本文将为您详细介绍JWT的原理、结构和优点&#xff0c;帮助您更好地理解和应用…...

一种融合联邦学习和大模型特点的全新系统架构

一种融合联邦学习和大模型特点的全新系统架构 以下是一种融合联邦学习和大模型特点的全新系统架构设计: 分层分布式架构 底层 - 数据采集与预处理层:由大量的边缘设备和终端节点组成,如智能手机、物联网传感器等。这些设备负责采集本地数据,并在本地进行初步的数据预处理,…...

html表格table导出excel,主从表格式,带样式.自动分列

html的table导出成excel, vue模板 项目使用xlsx-js-style 源代码从https://github.com/gitbrent/xlsx-js-style/releases/tag/v1.2.0 下载 用里面的dist目录下的文件即可. 复制到vue项目的public目录下的XLSX目录下. 在index.hml中引入js脚本, 为啥要在这里引入? 是因为这里…...

U8G2库使用案例(stm32)

目录 一、小球在 OLED 屏幕平面内运动并碰撞反弹的效果 二、 简单的波形生成和显示程序: 三、三维三角形旋转展示 四、正方形平面内顺时针旋转 五、带有旋转点的空心圆圈应用 六、字幕滚动效果 七、下雪动画效果 八、进度条动画效果 自己移植的U8g2库&#xff0c;OLED库…...

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含&#xff1a;发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习&#xff0c;学员可以掌握Biomod2模型最新版本的使用方法&#xff0c;最新版包含12个模型&#xff08;ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…...

【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜

AI的两次寒冬&#xff1a;从感知机困局到深度学习前夜 引用&#xff08;中英双语&#xff09; 中文&#xff1a; “第一次AI寒冬&#xff0c;是因为感知机局限性被揭示&#xff0c;让人们失去了对算法可行性的信心。” “第二次AI寒冬&#xff0c;则是因为专家系统的局限性和硬…...

141.《mac m系列芯片安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…...

【Linux】sed编辑器

一、基本介绍 sed编辑器也叫流编辑器&#xff08;stream editor&#xff09;&#xff0c;它是根据事先设计好得一组规则编辑数据流。 交互式文本编辑器&#xff08;如Vim&#xff09;中&#xff0c;可以用键盘命令交互式地插入、删除或替换文本数据。 sed编辑器是根据命令处理…...

unity3d-搞个场景漫游如何实现Alpha

要处理两个问题&#xff1a; 如何设置地面人不掉下去 方法一、 游戏物体加刚体&#xff0c;将游戏物体和地面加collider。如果是地形&#xff0c;可以使用 Terrain Collider&#xff1b;如果是简单的平面&#xff0c;可以添加 Box Collider 或者 Mesh Collider&#xff08;如果…...

概率基本概念 --- 离散型随机变量实例

条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y&#xff0c;它们代…...

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…...

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…...

UnionTech OS Server 20 网页无法访问yum源地址

统信yum地址 https://euler-packages.chinauos.com/server-euler/fuyu/1060/everything/sw_64/Packages/ 浏览器访问401报错无权限&#xff0c;查看linux uos环境下yum配置的用户名和密码 cat /etc/yum/vars/auth_* 然后自己组装生成Basic Authorization def generate_basic_…...

WPF区域导航+导航参数使用+路由守卫+导航日志

背景&#xff1a;使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的&#xff0c;不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel&#xff1a; private object body;public object Body {get { retu…...

jvm基础

jvm的基本结构‌‌ ‌类加载器&#xff08;ClassLoader&#xff09;‌&#xff1a;加载class文件到内存中进行使用。 ‌运行时数据区&#xff08;Runtime Data Area&#xff09;‌&#xff1a;这是JVM在运行Java程序期间管理的内存区域&#xff0c;包括方法区&#xff08;Meta…...

kaggle竞赛:纽约出租车行程时间NYC Taxi Trip Duration

1.引言 作为一名&#xff08;坦白说有点懒的&#xff09;图像处理方向的研究生&#xff0c;说实话最近新开一个坑&#xff0c;可能是因为要寒假了比较无聊&#xff0c;这次带来的系列是kaggle数据处理竞赛的经典例题&#xff1a;纽约出租车行程时间问题。希望大家多多支持&…...

Python提取目标Json键值:包含子嵌套列表和字典

目标&#xff1a;取json中所有的Name、Age字典 思路&#xff1a;递归处理字典中直接包含子字典的情况&#xff0c; import jsondef find_targ_dicts(data,key1,key2):result {}if isinstance(data, dict):if key1 in data and key2 in data: # 第一层字典中包含key1和key2re…...

<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么

$t是Vue I18n插件提供的一种方法&#xff0c;用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例&#xff0c;展示如何在Vue I18n中定义消息&#xff1a; const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…...

win32汇编环境,在对话框中画五边形与六边形

;运行效果 ;win32汇编环境,在对话框中画五边形与六边形 ;展示五边形与六边形的画法 ;将代码复制进radasm软件里,直接编译可运行.重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>&g…...

小白学Pytorch

小白学Pytorch 发现一个比较好的教程&#xff0c;对于自己来说比较合适&#xff0c;适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚&#xff1a; 我们使用nn包中的Sequential搭建网络&#…...

[A-25]ARMv8/v9-GIC的系统架构(中断的硬件基础)

ver0.1 前言 我们在观看很多的影视剧过程中,尤其是军旅体裁类型的布景中,经常会看见高级干部的办公桌上都会有几部电话机。这样的电话可不能小看,重要的事情尤其是突发和紧急的情况都要通过这几部电话第一时间通知给决策者。这几部电话,必须举报几个特点:及时性好、稳定…...

毕业项目推荐:基于yolov8/yolov5的行人检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

学习threejs,导入AWD格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AWDLoader AWD模型加…...

C# 事件

目录 1、事件模型的5个组成部分2、使用内置委托类型声明事件2.1 EventHandler2.1.1 &#xff1f;2.1.2 this2.1.3 使用匿名函数和lamda表达式2.1.3.1 匿名函数2.1.3.2 lamda表达式 2.1.4 异常处理 2.2 EventHandler<TEventArgs> 3、使用自定义委托类型声明事件3.1 事件的…...

WebRtc02: WebRtc架构、目录结构、运行机制

整体架构 WebRtc主要分为三层&#xff1a; CAPI层&#xff1a;外层调用Session管理核心层&#xff1a;包括视频引擎、音频引擎、网络传输 可由使用者重写视频引擎&#xff1a;编解码器、视频缓存、视频增强音频引擎&#xff1a;编解码器、音频缓存、回音消除、降噪传输&#x…...

耐高压26V输入5V升压充电8.4V芯片

HU6877作为一款集成了26V高耐压保护的5V升压至8.4V两节锂电池充电管理IC&#xff0c;凭借其高效升压、智能充电管理、多重安全保护及高耐压特性&#xff0c;在高端手电筒、便携式医疗设备、无人机等领域展现出了广泛的应用前景。本文将详细探讨HU6877的技术特点、工作原理、应用…...

【连续学习之LwM算法】2019年CVPR顶会论文:Learning without memorizing

1 介绍 年份&#xff1a;2019 期刊&#xff1a; 2019CVPR 引用量&#xff1a;611 Dhar P, Singh R V, Peng K C, et al. Learning without memorizing[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 5138-5146. 本文提…...

数组和指针

数组和指针 数组初始化特殊的字符数组 指针的引入指针的定义和初始化指针操作指针和const限定符 C风格字符串 C提供了两种类似于vector和迭代器的低级复合类型&#xff1a;数组和指针。与vector类似&#xff0c;数组也可以保存某种类型的一组对象&#xff0c;只是数组一经创建就…...

【数电尾灯设计】2022-8-16

缘由数电尾灯设计问题&#xff0c;求解答--CSDN问答 从题目可以列出 000 100 010 111-----------4进制 000 100 010 110 001 101 011 111-----------8进制 由列出可知用16进制芯片的3个引脚可以获得8进制推导出4进制从而可用逻辑处理为4进制实现尾灯功能。之上第一步实现了尾灯…...

F.interpolate函数

F.interpolate 是 PyTorch 中用于对张量&#xff08;通常是图像数据&#xff09;进行插值操作的函数&#xff0c;常用于调整张量的大小&#xff0c;例如改变图像的分辨率。它支持多种插值方法&#xff0c;包括最近邻插值、双线性插值和三次插值等。 语法 torch.nn.functional…...

Tableau数据可视化与仪表盘搭建-基础图表制作

目录 对比分析&#xff1a;比大小 柱状图 条形图 数据钻取 筛选器 热力图 气泡图 变化分析&#xff1a;看趋势 折线图 预测 面积图 关系分布&#xff1a;看位置 散点图 直方图 地图 构成分析&#xff1a;看占比 饼图 树地图 堆积图 对比分析&#xff1a;比大…...

Sentinel-5P遥感数据下载及预处理教程【20250105】

Sentinel-5P是欧空局&#xff08;Europe Space Agency&#xff0c;ESA&#xff09;于2017年10月13日发射的一颗全球大气污染监测卫星。卫星搭载了对流层观测仪&#xff08;Tropospheric Monitoring Instrument&#xff0c;TROPOMI&#xff09;&#xff0c;可以有效的观测全球各…...

快速学习 pytest 基础知识

全篇大概 5000 字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间10min 简介 Pytest是一个非常成熟的测试框架&#xff0c;适用于但愿测试、UI测试、接口测试。 简单灵活、上手快支持参数化具有多个第三方插件可以直接使用 assert 进行断言 一、Pytest安装 pip inst…...