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

Typescript学习教程,从入门到精通,TypeScript 函数语法知识点及案例代码(5)

TypeScript 函数语法知识点及案例代码

TypeScript 提供了丰富的函数语法特性,使得函数定义更加灵活和强大。以下将详细介绍 TypeScript 中函数的相关语法,包括函数定义、可选参数、默认参数、剩余参数、重载函数、递归函数、匿名函数、箭头函数以及回调函数。

函数定义

在 TypeScript 中,函数可以通过 function 关键字来定义,也可以使用箭头函数(=>)。

// 基本函数定义
function greet(name: string): string {return `Hello, ${name}!`;
}// 函数表达式
const greet2 = function(name: string): string {return `Hello, ${name}!`;
};// 调用函数
console.log(greet("Alice")); // 输出: Hello, Alice!
console.log(greet2("Bob"));  // 输出: Hello, Bob!// 无返回值函数
function logMessage(message: string): void {console.log(message);
}// 函数类型
type GreetFunction = (name: string) => string;
const greet3: GreetFunction = function(name) {return `Hello, ${name}!`;
};

可选参数、默认参数和剩余参数

可选参数

// 可选参数使用?标记
function buildName(firstName: string, lastName?: string): string {if (lastName) {return `${firstName} ${lastName}`;} else {return firstName;}
}console.log(buildName("Alice"));       // 输出: Alice
console.log(buildName("Alice", "Smith")); // 输出: Alice Smith

默认参数

// 默认参数
function buildName2(firstName: string, lastName: string = "Doe"): string {return `${firstName} ${lastName}`;
}console.log(buildName2("John"));       // 输出: John Doe
console.log(buildName2("John", "Smith")); // 输出: John Smith

剩余参数

// 剩余参数(可变参数)
function sum(...numbers: number[]): number {return numbers.reduce((total, num) => total + num, 0);
}console.log(sum(1, 2, 3));       // 输出: 6
console.log(sum(1, 2, 3, 4, 5)); // 输出: 15// 剩余参数也可以和其他参数一起使用
function greetPeople(greeting: string, ...names: string[]): string {return `${greeting} ${names.join(", ")}!`;
}console.log(greetPeople("Hello", "Alice", "Bob", "Charlie")); 
// 输出: Hello Alice, Bob, Charlie!

重载函数

函数重载允许一个函数接受不同数量或类型的参数时,做出不同的处理。

// 函数重载
function makeDate(timestamp: number): Date;
function makeDate(year: number, month: number, day: number): Date;
function makeDate(yearOrTimestamp: number, month?: number, day?: number): Date {if (month !== undefined && day !== undefined) {return new Date(yearOrTimestamp, month - 1, day);} else {return new Date(yearOrTimestamp);}
}const d1 = makeDate(1234567890000); // 使用时间戳
const d2 = makeDate(2023, 5, 17);   // 使用年月日console.log(d1); // 输出: 2009-02-13T23:31:30.000Z
console.log(d2); // 输出: 2023-05-16T16:00:00.000Z (注意月份是0-based)// 另一个重载例子
function reverse(value: string): string;
function reverse<T>(value: T[]): T[];
function reverse(value: string | any[]): string | any[] {if (typeof value === "string") {return value.split("").reverse().join("");} else {return value.slice().reverse();}
}console.log(reverse("hello"));      // 输出: olleh
console.log(reverse([1, 2, 3]));    // 输出: [3, 2, 1]

递归函数

递归函数是调用自身的函数,常用于解决分治问题。

// 阶乘函数
function factorial(n: number): number {if (n <= 1) return 1;return n * factorial(n - 1);
}console.log(factorial(5)); // 输出: 120// 斐波那契数列
function fibonacci(n: number): number {if (n <= 1) return n;return fibonacci(n - 1) + fibonacci(n - 2);
}console.log(fibonacci(10)); // 输出: 55// 尾递归优化版本(TypeScript目前不自动优化,但这是更好的写法)
function factorialTail(n: number, acc: number = 1): number {if (n <= 1) return acc;return factorialTail(n - 1, n * acc);
}console.log(factorialTail(5)); // 输出: 120

匿名函数

匿名函数是没有名称的函数,通常作为参数传递或立即执行。

// 作为参数传递
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(function(num) {return num * 2;
});
console.log(doubled); // 输出: [2, 4, 6, 8, 10]// 立即调用的函数表达式(IIFE)
(function() {console.log("This runs immediately");
})();// 带有类型的匿名函数
const greetAnonymous: (name: string) => string = function(name) {return `Hello, ${name}!`;
};
console.log(greetAnonymous("Dave")); // 输出: Hello, Dave!

箭头函数

箭头函数是ES6引入的简洁函数语法,自动绑定this。

// 基本箭头函数
const greetArrow = (name: string): string => `Hello, ${name}!`;
console.log(greetArrow("Eve")); // 输出: Hello, Eve!// 多行箭头函数
const sumArrow = (a: number, b: number): number => {const result = a + b;return result;
};
console.log(sumArrow(3, 4)); // 输出: 7// this绑定示例
class Counter {count = 0;increment() {setTimeout(function() {// 这里的this指向window/undefined,因为普通函数有自己的this// this.count++; // 会报错}, 1000);setTimeout(() => {// 箭头函数不绑定自己的this,所以这里的this指向Counter实例this.count++;console.log(this.count); // 1秒后输出: 1}, 1000);}
}const counter = new Counter();
counter.increment();// 箭头函数作为回调
const numbers = [1, 2, 3];
const squares = numbers.map(n => n * n);
console.log(squares); // 输出: [1, 4, 9]

回调函数

回调函数是作为参数传递给另一个函数的函数,在特定事件或条件发生时被调用。

// 基本回调函数
function fetchData(callback: (data: string) => void) {// 模拟异步操作setTimeout(() => {callback("Data received");}, 1000);
}fetchData((data) => {console.log(data); // 1秒后输出: Data received
});// 错误优先回调(Node.js风格)
function readFile(callback: (error: Error | null, data?: string) => void) {const success = Math.random() > 0.5;setTimeout(() => {if (success) {callback(null, "File content");} else {callback(new Error("Failed to read file"));}}, 1000);
}readFile((err, data) => {if (err) {console.error("Error:", err.message);} else {console.log("Data:", data);}
});// 使用接口定义回调类型
interface Callback<T> {(err: Error | null, result?: T): void;
}const dbQuery: Callback<string> = function(cb) {setTimeout(() => {cb(null, "Query results");}, 500);
};dbQuery((err, result) => {if (err) {console.error(err);} else {console.log(result); // 输出: Query results}
});

实战闯关——基础语法

闯关1:实现一个计算器函数

/*** 实现一个计算器函数* @param operator 运算符,可以是 '+', '-', '*', '/'* @param operands 操作数数组* @returns 计算结果*/
function calculate(operator: '+' | '-' | '*' | '/', ...operands: number[]): number {if (operands.length === 0) return 0;switch (operator) {case '+':return operands.reduce((sum, num) => sum + num, 0);case '-':return operands.slice(1).reduce((diff, num) => diff - num, operands[0]);case '*':return operands.reduce((product, num) => product * num, 1);case '/':return operands.slice(1).reduce((quotient, num) => quotient / num, operands[0]);default:throw new Error(`Unknown operator: ${operator}`);}
}console.log(calculate('+', 1, 2, 3));   // 输出: 6
console.log(calculate('-', 10, 2, 3));  // 输出: 5
console.log(calculate('*', 2, 3, 4));   // 输出: 24
console.log(calculate('/', 20, 2, 5));  // 输出: 2

闯关2:实现一个柯里化函数

/*** 柯里化函数* @param fn 要柯里化的函数* @returns 柯里化后的函数*/
function curry<T, R>(fn: (...args: T[]) => R): (...args: T[]) => R | ((...args: T[]) => R) {return function curried(...args: T[]): R | ((...args: T[]) => R) {if (args.length >= fn.length) {return fn(...args);} else {return (...moreArgs: T[]) => curried(...args, ...moreArgs);}};
}// 测试柯里化
function add(a: number, b: number, c: number): number {return a + b + c;
}const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3));     // 输出: 6
console.log(curriedAdd(1, 2)(3));    // 输出: 6
console.log(curriedAdd(1)(2, 3));    // 输出: 6
console.log(curriedAdd(1, 2, 3));    // 输出: 6

闯关3:实现一个记忆化函数

/*** 记忆化函数,缓存函数结果* @param fn 需要记忆化的函数* @returns 记忆化后的函数*/
function memoize<T extends (...args: any[]) => any>(fn: T): T {const cache = new Map<string, ReturnType<T>>();return function(...args: Parameters<T>): ReturnType<T> {const key = JSON.stringify(args);if (cache.has(key)) {return cache.get(key)!;}const result = fn(...args);cache.set(key, result);return result;} as T;
}// 测试记忆化
function expensiveCalculation(n: number): number {console.log(`Calculating for ${n}...`);return n * n;
}const memoizedCalculation = memoize(expensiveCalculation);
console.log(memoizedCalculation(5)); // 输出: Calculating for 5... 然后 25
console.log(memoizedCalculation(5)); // 直接输出: 25 (没有计算)
console.log(memoizedCalculation(3)); // 输出: Calculating for 3... 然后 9
console.log(memoizedCalculation(3)); // 直接输出: 9 (没有计算)

闯关4:实现一个管道函数

/*** 管道函数,将多个函数组合成一个从左到右执行的函数链* @param functions 要组合的函数数组* @returns 组合后的函数*/
function pipe<T>(...functions: Array<(arg: T) => T>): (arg: T) => T {return (input: T) => functions.reduce((acc, fn) => fn(acc), input);
}// 测试管道函数
function add5(x: number): number {return x + 5;
}function multiply3(x: number): number {return x * 3;
}function subtract10(x: number): number {return x - 10;
}const transform = pipe(add5, multiply3, subtract10);
console.log(transform(10)); // 计算过程: (10 + 5) = 15 → (15 * 3) = 45 → (45 - 10) = 35

闯关5:实现一个防抖函数

/*** 防抖函数,在延迟时间内只执行最后一次调用* @param fn 要防抖的函数* @param delay 延迟时间(毫秒)* @returns 防抖后的函数*/
function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void {let timeoutId: ReturnType<typeof setTimeout>;return function(...args: Parameters<T>): void {clearTimeout(timeoutId);timeoutId = setTimeout(() => {fn(...args);}, delay);};
}// 测试防抖函数
function search(query: string): void {console.log(`Searching for: ${query}`);
}const debouncedSearch = debounce(search, 500);// 快速连续调用
debouncedSearch("a");
debouncedSearch("ab");
debouncedSearch("abc");// 500毫秒后只会输出: Searching for: abc

这些示例涵盖了TypeScript函数的主要概念和实际应用场景,从基础到高级功能都有涉及。

相关文章:

Typescript学习教程,从入门到精通,TypeScript 函数语法知识点及案例代码(5)

TypeScript 函数语法知识点及案例代码 TypeScript 提供了丰富的函数语法特性&#xff0c;使得函数定义更加灵活和强大。以下将详细介绍 TypeScript 中函数的相关语法&#xff0c;包括函数定义、可选参数、默认参数、剩余参数、重载函数、递归函数、匿名函数、箭头函数以及回调…...

【51单片机定时器/计数器】

目录 简介 定时器配置流程 1.配置定时器工作方式寄存器TMOD 2.配置中断寄存器TCON 3.定时时间计算公式 4.配置中断允许寄存器IE 5.使用中断函数完成中断 简介 定时器/计数器本质都是对脉冲信号进行计数&#xff0c;区别在于作为定时器时的脉冲信号来自于晶振12分频&…...

Oracle 的 ASSM 表空间

Oracle 的 ASSM&#xff08;Automatic Segment Space Management&#xff09;表空间 是一种自动管理段空间的技术&#xff0c;通过位图&#xff08;Bitmap&#xff09;机制跟踪数据块的使用情况&#xff0c;替代传统的手动管理&#xff08;MSSM&#xff0c;即 Freelist 管理&am…...

C++学习:六个月从基础到就业——C++11/14:auto类型推导

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;auto类型推导 本文是我C学习之旅系列的第四十一篇技术文章&#xff0c;也是第三阶段"现代C特性"的第三篇&#xff0c;主要介绍C11/14中的auto类型推导机制。查看完整系列目录了解更多内容。 引言 在现代C…...

select语句的书写顺序

一.MySQL SELECT语句的执行顺序 MySQL中SELECT语句的执行顺序与SQL语句的书写顺序不同&#xff0c;理解这个执行顺序对于编写高效查询非常重要。 1.标准SELECT语句的执行顺序 FROM子句&#xff08;包括JOIN操作&#xff09; 首先确定数据来源表执行表连接操作 WHERE子句 对F…...

OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好&#xff0c;Open WebUI 迎来重要更新&#xff0c;现已正式支持 MCP 工具服务器&#xff0c;但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理&#xff0c;经测试&#xff0c;它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具&#xff…...

【Day28】

总结&#xff1a; Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句&#xff0c;并且后面跟着冒号 : 时&#xff0c;它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句&#xff08;即代码块是空的&am…...

STM32 | FreeRTOS 消息队列

01 一、概述 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任务间传递信息&#xff0c;实现了任务接收来自其他任务或中断的不固定长度的消息&#xff0c;任务能够从队列里面读取消息&#xff0c;当队列中的消…...

Vue-事件修饰符

事件修饰符 prevent &#xff08;阻止默认事件&#xff09; 超链接 点击事件 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>事件修饰符</title><!-- 引入Vue --><script …...

c++函数调用运算符及类型转换运算符重载

author: hjjdebug date: 2025年 05月 17日 星期六 14:44:48 CST descrip: c函数调用运算符及类型转换运算符重载 文章目录 0. 前言. 运算符包括以下运算符.1. 运算符重载语句一般格式:2. 函数调用运算符&#xff1a;3. 类型转换运算符&#xff1a; 例如 int(); double(); bool(…...

如何在 Windows 10 或 11 中安装 PowerShellGet 模块?

PowerShell 是微软在其 Windows 操作系统上提供的强大脚本语言,可用于通过命令行界面自动化各种任务,适用于 Windows 桌面或服务器环境。而 PowerShellGet 是 PowerShell 中的一个模块,提供了用于从各种来源发现、安装、更新和发布模块的 cmdlet。 本文将介绍如何在 PowerS…...

84.评论日记

原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现&#xff0c;无论是我这个账号&#xff0c;还是其他的账号&#xff0c;评论都无法看到。 我大胆猜测有一种机制&#xff0c;某些官号会被设置成一种高检测的等…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据添加修改删除操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 对数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误&#xff0c;还有一种情况是格式转换…...

荷兰国旗问题 之 指针划分区间问题

文章目录 首先介绍一下什么是荷兰国旗问题&#xff1f;问题描述为&#xff1a;给定一个由红色、白色和蓝色三种颜色组成的无序数组&#xff0c;将数组元素按颜色排序&#xff0c;使得所有红色元素在前&#xff0c;白色元素居中&#xff0c;蓝色元素在后。这里的 “颜色” 通常用…...

冒泡排序-java

public class BubbleSort{ public static void bubbleSort(int[] arr) { int n arr.length; boolean swapped; // 外层循环控制遍历的轮数 for (int i 0; i < n - 1; i) { swapped false; for (int j 0; …...

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…...

人工智能-自然语言与语音产品实现

一、语义相似度 &#xff08;一&#xff09;、文本向量化 1、文本向量化&#xff08;Text Vectorization&#xff09; 是自然语言处理&#xff08;NLP&#xff09;中的核心预处理步骤&#xff0c;旨在将人类语言的文本转换为计算机可处理的数值向量&#xff08;数学表达&…...

阿里巴巴开源移动端多模态LLM工具——MNN

MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练&#xff0c;并在设备端的推理和训练方面具有行业领先的性能。目前&#xff0c;MNN 已集成到阿里巴巴集团的 30 多个应用中&#xff0c;如淘宝、天猫、优酷、钉钉、闲鱼等&#xff0c;覆盖了直播、短视频…...

SpringBootAdmin:全方位监控与管理SpringBoot应用

监控的意义 1. 监控服务状态是否宕机 2. 监控服务运行指标 (内存,虚拟机,线程,请求等) 3. 监控日志 4. 管理服务 (服务下线) 可视化监控平台 Spring Boot Admin, 开源社区项目, 用于管理和监控SpringBoot应用程序. 客户端注册到服务端, 通过HTTP请求方式, 服务端定期从客…...

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…...

【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…...

2020CCPC河南省赛题解

A. 班委竞选 签到题&#xff0c;模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

C语言输入函数对比解析

目录 C语言输入函数全家福&#xff08;和它们的秘密&#xff09;fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈&#xff0c;看来你正在和C语言的输入函数们玩“大家来找茬”&#xff01;放心&#xff0c;我会用最接地气的方式给你讲明白&#xff0c;保证比看《甄嬛传》还…...

python四则运算计算器

python四则运算计算器 是谁说&#xff0c;python不好写计算器的&#xff0c;我亲自写个无ui的计算器功能&#xff0c;证明这是谣言 step1:C:\Users\wangrusheng\Downloads\num.txt 15 - 4 * 3 10 / 2(5 3) * 2 6 / 31/2 * 8 3/4 * 4 - 0.52.5 * (4 1.6) - 9 / 3-6 12 * (…...

BUUCTF——Nmap

BUUCTF——Nmap 进入靶场 类似于一个nmap的网站 尝试一下功能 没什么用 看看数据包 既然跟IP相关 伪造一个XXF看看 拼接了一下没什么用 果然没这么简单 尝试一下命令注入 构造payload 127.0.0.1 | ls 应该有过滤 加了个\ 直接构造个php木马上传试试 127.0.0.1 | <?…...

【Changer解码头详解及融入neck层数据的实验设计】

Changer解码头详解 ChangerEx中的 Changer 解码头&#xff08;定义在 [changer.py](file://opencd\models\decode_heads\changer.py)&#xff09;是基于双时相输入的&#xff0c;用于遥感变化检测任务。下面我将详细解释&#xff1a; &#x1f3af; 一、解码头输入数据来源 输…...

深度学习推理引擎---OpenVINO

OpenVINO&#xff08;Open Visual Inference & Neural Network Optimization Toolkit&#xff09;是英特尔开发的开源工具套件&#xff0c;旨在优化和加速深度学习模型在英特尔硬件&#xff08;CPU、GPU、VPU、FPGA等&#xff09;上的推理性能&#xff0c;同时支持从训练到…...

JavaScript splice() 方法

1. JavaScript splice() 方法 1.1. 定义和用法 splice() 方法用于添加或删除数组中的元素。   注意&#xff1a;这种方法会改变原始数组。   返回值&#xff1a;如果删除一个元素&#xff0c;则返回一个元素的数组。 如果未删除任何元素&#xff0c;则返回空数组。 1.2. …...

数据库故障排查指南:解决常见问题,保障数据安全与稳定

数据库故障排查指南&#xff1a;解决常见问题&#xff0c;保障数据安全与稳定 &#x1f4d6; 前言 数据库作为现代应用的核心组件&#xff0c;其稳定性直接影响业务连续性。本文总结六大常见数据库故障场景&#xff0c;提供快速排查思路与解决方案&#xff0c;助你化身"…...

gem5-gpu教程 第十章 关于topology 的Mesh network

问题一、L1和L2缓存之间的VI_hammer_fusion中指定了互连延迟,如何更改这些数字吗? 我已经实现了一个网格拓扑来连接cpu内核和GPU SM,并对VI_hammer*和网格文件进行了所有必要的更改。我的问题是: 1. There is interconnect latency specified in VI_hammer_fusion betwee…...

【C/C++】C++返回值优化:RVO与NRVO全解析

文章目录 C返回值优化&#xff1a;RVO与NRVO全解析1 简介2 RVO vs NRVO3 触发条件4 底层机制5 应用场景6 验证与限制7 性能影响8 补充说明9 总结 C返回值优化&#xff1a;RVO与NRVO全解析 返回值优化&#xff08;Return Value Optimization, RVO&#xff09;是编译器通过消除临…...

使用 Kaniko来构建镜像

使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具&#xff0c;其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析&#xff1a; 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...

2025.05.17淘天机考笔试真题第三题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ &#x1f449; 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师&#xff0c;她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...

history模式:让URL更美观

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为特殊方格&#xff0c;且称该棋盘为一特殊棋盘。 显然&#xff0c;特殊方格出现的位置有4k 种情况&#xff0c;即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…...

豆粕ETF投资逻辑整理归纳-20250511

目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...

使用 Python 连接 Oracle 23ai 数据库完整指南

方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...

构建集成差异化灵巧手和先进机器人控制技术的自动化系统

介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人&#xff08;机械臂、夹持器、视觉系统等&#xff09;&#xff0c;并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...

题单:汉诺塔问题

题目描述 如下图所示&#xff0c;设有 nn 个大小不等的中空圆盘&#xff0c;按照从小到大的顺序叠套在立柱 A 上&#xff0c;另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱&#xff08;称为源柱&#xff09;移到 C 柱&#xff08;称为目标柱&#xff09;&#xff0c;移动…...

Unable to get end effector tips from jmg

这个错误信息表明在使用MoveIt2时&#xff0c;moveit_visual_tools无法从关节模型组&#xff08;Joint Model Group&#xff0c;简称JMG&#xff09;中获取末端执行器&#xff08;End Effector&#xff0c;简称EE&#xff09;的尖端信息。这通常是因为配置文件中缺少相关信息&a…...

flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...

flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志&#xff0c;具体哪一步有问题flutter run --verbose使用这个&#xff0c;运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果&#xff1a;图片、字体文件等没有在pubspec.yam…...

STM32烧录程序正常,但是运行异常

一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动&#xff08;BOOT01&#xff0c;BOOT10&#xff09;&#xff0c;程序在掉电后无法保存&#xff0c;导致复位后无法正常运行。应确保BOOT00&#xff08;从Flash启动&#xff09;15。…...

TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器

1&#xff0c;项目简介 F5-TTS 于英文生成领域表现卓越&#xff0c;发音标准程度在本次评测软件中独占鳌头。再者&#xff0c;官方预设的多角色生成模式独具匠心&#xff0c;能够配置多个角色&#xff0c;一次性为多角色、多情绪生成对话式语音&#xff0c;别出心裁。 最低配置…...

ecmascript 第6版特性 ECMA-262 ES6

https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上&#xff0c;ES6在export和import的基础外&#xff0c;还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…...

角点特征:从传统算法到深度学习算法演进

1 概述 图像特征是用来描述和分析图像内容的关键属性&#xff0c;通常包括颜色、纹理和形状等信息。颜色特征能够反映图像中不同颜色的分布&#xff0c;常通过 RGB 值或色彩直方图表示。纹理特征则关注图像表面的结构和细节&#xff0c;例如通过灰度共生矩阵或局部二值模式&…...

免费代理IP服务有哪些隐患?如何安全使用?

代理IP已经成为互联网众多用户日常在线活动中不可或缺的一部分。无论是为了保护个人隐私、突破地理限制&#xff0c;还是用于数据抓取、广告投放等商业用途&#xff0c;代理IP都扮演着关键角色。然而&#xff0c;市场上存在大量的免费代理IP服务&#xff0c;尽管它们看起来颇具…...

深入了解 VPC 端点类型 – 网关与接口

什么是VPC 端点 VPC 端点&#xff08;VPC Endpoint&#xff09;是 Amazon Web Services (AWS) 提供的一种服务&#xff0c;允许用户在 Virtual Private Cloud (VPC) 内部安全地访问 AWS 服务&#xff0c;而无需通过公共互联网。VPC 端点通过私有连接将 VPC 与 AWS 服务直接连接…...

Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用

在现代移动应用中&#xff0c;屏幕采集已成为一个广泛使用的功能&#xff0c;尤其是在实时直播、视频会议、远程教育、游戏录制等场景中&#xff0c;屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API&#xff0c;这使得屏幕录制和采集变得更加简单…...

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)

个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的&#xff0c;做计算题要保持头脑清晰&#xff0c;认真读题把PV、…...