【Flutter 开发实战】Dart 基础篇:List 详解

在这里插入图片描述

嗨,各位朋友们,欢迎来到这篇博客!今天我们将一起踏入 Dart 语言的神奇世界,深入了解 Dart 中的 List 类型。不用担心,我会尽可能用最通俗易懂的语言,让你对 List 有一个更深刻的理解。

Dart 中的 List

List - 让数据变得有趣!

在 Dart 语言中,List 就像一个神奇的盒子,可以放进去各种各样的东西,比如数字、文字,甚至是其他盒子(List)!今天,我们就来揭开 List 的神秘面纱,看看它是如何让数据变得有趣的。

在这里插入图片描述

// 创建一个充满数字的盒子
List<int> numbers = [1, 2, 3, 4, 5];// 创建一个装满水果的盒子
List<String> fruits = ['apple', 'banana', 'orange'];

咦,看起来好像挺简单的吧?方括号里面放东西,逗号分隔,就是一个 List 了!

List 的小魔法

获取盒子的长度
List<int> numbers = [1, 2, 3, 4, 5];
int length = numbers.length;print('盒子里有多少东西呢?答案是:$length 个!'); // 输出:盒子里有多少东西呢?答案是:5 个!

嘿,这个 length 就像是盒子的秘密标签,告诉你里面到底有多少东西。

拿出盒子里的东西
List<String> fruits = ['apple', 'banana', 'orange'];
String firstFruit = fruits[0];print('盒子里的第一样东西是什么呢?是:$firstFruit'); // 输出:盒子里的第一样东西是什么呢?是:apple

哎呀,索引就像是盒子的小抽屉,从 0 开始,想拿出哪个就说出它的位置,比如 fruits[0] 就是拿出第一个水果。

往盒子里加新东西
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');print('往盒子里加了一颗葡萄,现在是这样的:$fruits'); // 输出:往盒子里加了一颗葡萄,现在是这样的:[apple, banana, orange, grape]

fruits 盒子里原本有 apple、banana、orange,来了一颗新水果 grape,用 add 方法就能轻松加入盒子。

从盒子里拿掉东西
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');print('把香蕉拿出去了,盒子里现在是这样的:$fruits'); // 输出:把香蕉拿出去了,盒子里现在是这样的:[apple, orange]

remove 方法,就像把盒子里的东西拿出来一样,轻松又方便。

盒子漫游之遍历

遍历就像是打开盒子,逐个看看里面有什么,这可是盒子漫游的时刻!

for 循环遍历
List<int> numbers = [1, 2, 3, 4, 5];
for (int number in numbers) {print('这个数字是啥呢?是:$number');
}

for 循环,一个个数字出来亮相,好像数字们在做小秀一样。

forEach 方法遍历
List<String> fruits = ['apple', 'banana', 'orange'];
fruits.forEach((fruit) {print('这个水果是啥呢?是:$fruit');
});

forEach 方法更简单,像是盒子里的每个东西都过来和你打招呼,一点都不会掉队。

不得不说,List 可真是个有趣的小伙伴,让我们的数据变得生动起来!

List 的小秘密

在 Dart 的舞台上,List 扮演着一个神奇的角色,但在使用它的过程中,可能会遇到一些小问题。让我们一一解决这些谜题吧!

如何判断 List 是否为空?
List<String> fruits = [];
if (fruits.isEmpty) {print('哎呀,水果盒子空空如也!');
} else {print('水果盒子里有${fruits.length}种水果哦!');
}

通过 isEmpty 属性,我们可以轻松地判断 List 是否为空,就像翻开水果盒子看看里面有没有惊喜。

如何查找 List 中的最大值和最小值?
List<int> numbers = [10, 5, 8, 15, 3];
int maxNumber = numbers.reduce((value, element) => value > element ? value : element);
int minNumber = numbers.reduce((value, element) => value < element ? value : element);print('最大值是:$maxNumber,最小值是:$minNumber');

通过使用 reduce 方法,我们可以像找宝藏一样,找到 List 中的最大值和最小值。

List 的进阶冒险

现在,让我们进入一些高级的 List 冒险,让你的 Dart 旅程更加丰富多彩。

使用 map 转换 List 中的元素
List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

map 方法就像是 List 的魔法师,可以将每个元素进行转换,创造出一个全新的 List。

使用 where 过滤 List 中的元素
List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

where 方法就像是一位聪明的导游,可以根据你的喜好,为你筛选出特定的元素。

使用 sort 对 List 进行排序
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
numbers.sort();print('排序后的数字列表:$numbers');

sort 方法就像是整理房间,可以按照顺序排列,让一切井然有序。

使用 contains 判断 List 是否包含某个元素
List<String> fruits = ['apple', 'banana', 'orange'];
bool containsBanana = fruits.contains('banana');if (containsBanana) {print('水果盒子里有香蕉哦!');
} else {print('水果盒子里没有香蕉。');
}

contains 方法就像是查找宝藏的探险者,可以告诉你是否在 List 中找到了特定的元素。

List 的奇妙嵌套

在 Dart 的舞台上,List 可以变得更加神奇,通过嵌套,你可以创建更复杂的数据结构。

在这里插入图片描述

List<List<int>> matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9],
];print('矩阵的第二行:${matrix[1]}');

这就像是在盒子里装盒子,通过嵌套,我们可以创建出更有趣的数据结构。

使用 List 的小心事项

在使用 List 的冒险中,一些小心事项也需要我们注意。

List 是可变的

在 Dart 中,List 是一位非常随和的小伙伴,你可以随时添加、删除或修改其中的元素。但别忘了,有时候要小心,避免意外发生。

List<int> numbers = [1, 2, 3, 4, 5];
numbers[0] = 10;print('修改后的数字列表:$numbers');

通过索引,我们可以直接修改 List 中的元素值,就像给小伙伴们换了新衣服一样。

避免空指针异常

在冒险的过程中,千万要确保不要走进“越界”的陷阱,以免出现空指针异常。

List<String> fruits = ['apple', 'banana', 'orange'];if (fruits.length > 2) {print('第三个水果是:${fruits[2]}');
} else {print('水果盒子里没有第三个水果。');
}

在这个例子中,我们先判断盒子的大小,再去取第三个元素,确保一切安全。

Dart 中 List 的其他花样

除了上面的操作,List 在 Dart 中还有更多花样,比如在函数中传递多个参数、实现队列和栈等。

使用 List 传递多个参数
void printNumbers(List<int> numbers) {for (int number in numbers) {print(number);}
}printNumbers([1, 2, 3, 4, 5]);

通过将参数声明为 List 类型,我们可以方便地一次传递多个值给函数,就像给朋友送上一箱好吃的糖果。

实现队列和栈
// 队列(先进先出)
Queue<int> queue = Queue();
queue.addAll([1, 2, 3, 4, 5]);int firstElement = queue.removeFirst();
print('队列的第一个元素是:$firstElement');// 栈(后进先出)
List<int> stack = [];
stack.addAll([1, 2, 3, 4, 5]);int lastElement = stack.removeLast();
print('栈的最后一个元素是:$lastElement');

通过使用 Dart 中的 Queue 类和 List 的 removeFirstremoveLast 方法,我们可以模拟队列和栈的玩法,就像在玩游戏一样。

在 Dart 的大舞台上,List 是个多才多艺的演员,有了这些花样,你就能更自如地编写出丰富多彩的代码了!

List 魔法手册

在 Dart 的大舞台上,List 扮演着一个强大而灵活的角色。上面的部分我们介绍了 Dart 中 List 的常见用法,但在 Dart 中还有其它的一些属性和用法,接下来,就让我们一起来总结 List 的一些神奇属性和方法吧!

List 常用属性:

属性描述
length获取 List 的长度
reversed翻转 List 中的元素
isEmpty判断 List 是否为空
isNotEmpty判断 List 是否不为空
1. length - 长度

length 属性用于获取 List 的长度,即 List 中元素的个数。

List<int> numbers = [1, 2, 3, 4, 5];
int length = numbers.length;print('List 的长度是:$length'); // 输出:List 的长度是:5

这个属性非常简单,但在很多场景中都是必不可少的。

2. reversed - 翻转

reversed 属性用于将 List 中的元素翻转。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> reversedNumbers = numbers.reversed.toList();print('翻转后的数字列表:$reversedNumbers');

这样我们就能得到一个反向排列的 List。

3. isEmpty - 是否为空

isEmpty 属性用于判断 List 是否为空,返回一个布尔值。

List<String> fruits = [];
if (fruits.isEmpty) {print('水果列表为空!');
} else {print('水果列表不为空,有${fruits.length}种水果。');
}

这是一个常见的判断,以避免在空列表上执行不必要的操作。

4. isNotEmpty - 是否不为空

相应地,isNotEmpty 属性则判断 List 是否不为空,也返回一个布尔值。

List<String> fruits = ['apple', 'banana', 'orange'];
if (fruits.isNotEmpty) {print('水果列表不为空,有${fruits.length}种水果。');
} else {print('水果列表为空!');
}

这两个属性在条件判断中经常被用到。

List 常用方法:

方法描述
add向 List 的末尾添加一个元素
addAll将一个 List 中的所有元素添加到另一个 List 的末尾
indexOf查找 List 中某个特定值的索引,如果未找到则返回 -1
remove删除 List 中指定值的第一个匹配项
removeAt删除 List 中指定索引位置的元素
fillRange修改 List 中一定范围内的元素值
insert在 List 的指定位置插入一个元素
insertAll在 List 的指定位置插入另一个 List 中的所有元素
toList将其他类型的集合转换为 List
join将 List 中的元素连接成一个字符串,可以指定连接符
split将一个字符串按照指定的分隔符拆分成 List
forEach遍历 List 中的每个元素,对每个元素执行指定的操作
map对 List 中的每个元素执行指定的操作,并返回一个新的 List
where根据指定的条件过滤 List 中的元素,返回一个新的 List
any检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值
every检查 List 中是否所有元素都满足指定的条件,返回一个布尔值
1. add - 增加

add 方法用于向 List 的末尾添加一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.add('grape');print('添加葡萄后的水果列表:$fruits');

这是一个简单而常见的操作,用于动态地向 List 中添加元素。

2. addAll - 拼接数组

addAll 方法用于将一个 List 中的所有元素添加到另一个 List 的末尾。

List<int> numbers1 = [1, 2, 3];
List<int> numbers2 = [4, 5, 6];
numbers1.addAll(numbers2);print('拼接后的数字列表:$numbers1');

这是一个很方便的方法,可以将两个 List 合并成一个。

3. indexOf - 查找

indexOf 方法用于查找 List 中某个特定值的索引,如果未找到则返回 -1。

List<String> fruits = ['apple', 'banana', 'orange'];
int indexOfBanana = fruits.indexOf('banana');print('香蕉的索引是:$indexOfBanana'); // 输出:香蕉的索引是:1

通过这个方法,我们可以迅速找到某个元素在 List 中的位置。

4. remove - 删除

remove 方法用于删除 List 中指定值的第一个匹配项。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.remove('banana');print('去掉香蕉后的水果列表:$fruits');

使用这个方法可以轻松地从 List 中移除指定的元素。

5. removeAt - 删除

removeAt 方法用于删除 List 中指定索引位置的元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.removeAt(1);print('去掉索引为1的水果后的水果列表:$fruits');

这个方法对于根据索引值删除元素非常有用。

6. fillRange - 修改

fillRange 方法用于修改 List 中一定范围内的元素值。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.fillRange(1, 3, 10);print('修改范围后的数字列表:$numbers');

这个方法让我们可以在 List 中指定范围内进行批量修改。

7. insert - 指定位置插入

insert 方法用于在 List 的指定位置插入一个元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insert(1, 'grape');print('在索引1处插入葡萄后的水果列表:$fruits');

通过这个方法,我们可以灵活地在 List 中的任意位置插入元素。

8. insertAll - 指定位置插入 List

insertAll 方法用于在 List 的指定位置插入另一个 List 中的所有元素。

List<String> fruits = ['apple', 'banana', 'orange'];
fruits.insertAll(1, ['grape', 'kiwi']);print('在索引1处插入葡萄和猕猴桃后的水果列表:$fruits');

这个方法对于批量插入元素非常方便。

9. toList - 其他类型转换成 List

toList 方法用于将其他类型的集合(如 Set)转换为 List。

Set<int> uniqueNumbers = {1, 2, 3, 4, 5};
List<int> numbersList = uniqueNumbers.toList();print('Set 转换成 List 后的数字列表:$numbersList');

这个方法对于在不同集合类型之间进行转换很有用。

10. join - List 转换成字符串

join 方法用于将 List 中的元素连接成一个字符串,可以指定连接符。

List<String> fruits = ['apple', 'banana', 'orange'];
String fruitString = fruits.join(', ');print('水果列表转换成字符串:$fruitString');

通过这个方法,我们可以方便地将 List 转换为可读性更好的字符串。

11. split - 字符串转化成 List

split 方法用于将一个字符串按照指定的分隔符拆分成 List。

String fruitsString = 'apple,banana,orange';
List<String> fruitsList = fruitsString.split(',');print('字符串转换成水果列表:$fruitsList');

这个方法在处理从文件或网络获取的逗号分隔的数据时非常实用。

12. forEach

forEach 方法用于遍历 List 中的每个元素,对每个元素执行指定的操作。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {print('当前数字是:$number');
});

这是一种简洁的方式来遍历 List。

13. map

map 方法用于对 List 中的每个元素执行指定的操作,并返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();print('原始数字列表:$numbers');
print('每个数字的平方列表:$squaredNumbers');

通过这个方法,我们可以方便地对 List 进行转换。

14. where

where 方法用于根据指定的条件过滤 List 中的元素,返回一个新的 List。

List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();print('原始数字列表:$numbers');
print('偶数列表:$evenNumbers');

这是一种强大的方法,可以根据需要筛选 List 中的元素。

15. any

any 方法用于检查 List 中是否至少有一个元素满足指定的条件,返回一个布尔值。

List<int> numbers = [1, 2, 3, 4, 5];
bool hasEvenNumber = numbers.any((number) => number % 2 == 0);if (hasEvenNumber) {print('列表中有偶数。');
} else {print('列表中没有偶数。');
}

这个方法对于检查是否存在符合条件的元素很有用。

16. every

every 方法用于检查 List 中是否所有元素都满足指定的条件,返回一个布尔值。

List<int> numbers = [2, 4, 6, 8, 10];
bool allEvenNumbers = numbers.every((number) => number % 2 == 0);if (allEvenNumbers) {print('列表中所有数字都是偶数。');
} else {print('列表中至少有一个不是偶数。');
}

这个方法对于检查是否所有元素都满足条件很有用。

结语

通过这篇博客,我们深入探讨了 Dart 中 List 的方方面面。从基本操作到高级应用,希望你现在对 Dart 中的 List 有了更清晰的认识。

  • 我们学习了如何创建、访问和操作 List。
  • 了解了如何遍历 List,并解决了一些常见问题。
  • 探讨了一些高级操作,包括转换、过滤和排序。
  • 知道了 List 可以嵌套,用于处理更复杂的数据结构。
  • 注意了在使用 List 时的一些小细节,避免了一些常见错误。

希望通过这篇博客,你对 Dart 中的 List 有了更深入的理解。在你的 Dart 之旅中,List 将是一个非常有力的工具,帮助你处理各种数据。加油,各位朋友们,愿你们在 Dart 的世界中越走越远!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SegVol: Universal and Interactive Volumetric Medical Image Segmentation

Abstract 精确的图像分割为临床研究提供了有意义且结构良好的信息。尽管在医学图像分割方面取得了显著的进展&#xff0c;但仍然缺乏一种能够分割广泛解剖类别且易于用户交互的基础分割模型。 本文提出了一种通用的交互式体医学图像分割模型——SegVol。通过对90k个未标记的C…

kibana查看和展示es数据

本文来说下使用kibana查看和展示es数据 文章目录 数据准备查询所有文档示例kibana查看和展示es数据 数据准备 可以使用es的命令或者java程序来往&#xff0c;es进行新增数据 查询所有文档示例 在 apifox 中&#xff0c;向 ES 服务器发 GET请求 &#xff1a;http://localhost:92…

rust跟我学二:模块编写与使用

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info中模块的使用。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]g…

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型

在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型 0. 背景1. 安装依赖2. 开发 main.py3. 运行 main.py 0. 背景 看了一些文章之后&#xff0c;今天尝试在 Windows 11 上通过 Autoawq 启动 Mixtral 8*7B 大语言模型。 1. 安装依赖 pip install torch torchvision …

Spring框架的背景学习

Spring 的前世今生 相信经历过不使用框架开发 Web 项目的 70 后、80 后都会有如此感触&#xff0c;如今的程序员开发项目太轻松了&#xff0c;基本只需要关心业务如何实现&#xff0c;通用技术问题只需要集成框架便可。早在 2007 年&#xff0c;一个基于 Java语言的开源框架正…

计算机网络 网络安全

网络安全 网络安全问题概述 计算机网络面临的女全性威胁 计算机网络的通信而临两大类威胁&#xff0c;即被动攻击和主动攻击 被动攻击是指攻击者从网络上窃听他人的通信内容。通常把这类攻击称为截获。在被动攻击中&#xff0c;攻击者只是观察和分析某一个协议数据单元 PDU…

4、Redis高并发分布式锁实战

引言 在分布式系统中&#xff0c;保证数据的一致性和避免竞争条件是至关重要的。分布式锁是一种常用的机制&#xff0c;而Redis作为一款高性能的内存数据库&#xff0c;提供了简单而强大的分布式锁方案。本文将深入探讨如何利用Redis高并发分布式锁来解决分布式系统中的并发控…

Armv8-R AArch32 architecture概念学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。阅读该文章&#xff0c;可以先查看AArch64 Exception Model学习&…

idea 安装免费Ai工具 codeium

目录 概述 ide安装 使用 chat问答 自动写代码 除此外小功能 概述 这已经是我目前用的最好免费的Ai工具了&#xff0c;当然你要是有钱最好还是用点花钱的&#xff0c;比如copilot&#xff0c;他可以在idea全家桶包括vs&#xff0c;还有c/c的vs上运行&#xff0c;还贼强&am…

力扣白嫖日记(sql)

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 586.订单最多的客户 表&#xff1a;Orders 列名类型order_numberintcustomer_numberint 查找下了最多订单的…

机器人持续学习基准LIBERO系列7——计算并可视化点云

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…

用Perl采集美容化妆目标网站做一个深度调研

在Perl中编写爬虫程序涉及到几个关键步骤&#xff0c;包括使用相关的库来发送HTTP请求和解析HTML内容。首先我们要了解Perl爬虫程序编程得几大步骤&#xff1a;安装必要的Perl模块—创建一个用户代理—发送HTTP请求—解析响应内容—提取所需数据—存储或进一步处理数据。所以说…

【ChatGPT VS baidu】:提升程序员开发效率的智能助手

在现代软件开发中&#xff0c;ChatGPT&#xff08;Chat Generative Pre-trained Transformer&#xff09;作为一种基于人工智能的对话模型&#xff0c;为程序员带来了许多便利和效率提升。ChatGPT 结合了先进的自然语言处理和生成技术&#xff0c;能够理解和生成人类语言&#…

springcloud Alibaba中gateway和sentinel联合使用

看到这个文章相信你有一定的sentinel和gateway基础了吧。 官网的gateway和sentinel联合使用有些过时了&#xff0c;于是有了这个哈哈&#xff0c;给你看看官网的&#xff1a; 才sentinel1.6&#xff0c;现在都几了啊&#xff0c;所以有些过时。 下面开始讲解&#xff1a; 首先…

虚拟服务器的监控和管理

IT 网络中虚拟环境的出现给 IT 管理员带来了一些挑战&#xff0c;虚拟环境降低了管理硬件和软件的成本和复杂性&#xff0c;同时&#xff0c;他们通常需要 IT 管理员管理更多的空间&#xff0c;以确保完全可见和快速解决问题。 虚拟服务器在现代 IT 基础架构中越来越普遍&…

LabVIEW模拟荧光显微管滑动实验

LabVIEW模拟荧光显微管滑动实验 在现代生物医学研究中&#xff0c;对微观生物过程的精准模拟和观察至关重要。本案例展示了如何利用LabVIEW软件和专业硬件平台&#xff0c;创新地模拟荧光显微管在滑动实验中的动态行为&#xff0c;这一过程不仅提升了实验效率&#xff0c;还为…

pycharm学生认证免费使用专业版

进入pycharm官网Monthly and yearly plans with JetBrains Toolboxhttps://www.jetbrains.com/store/?fromMenu#discounts ​​​ 按照要求填写&#xff0c;但是如果遇到这个提示&#xff0c;恭喜你&#xff0c;你的学校获得了美国商务部认证。 ​ 遇到这个不要慌&#…

美创科技助力江苏有线通过DSMM二级认证

近日&#xff0c;经中国信通院泰尔认证中心评审&#xff0c;美创科技助力江苏省广电有线信息网络股份有限公司&#xff08;以下简称“江苏有线”&#xff09;顺利通过DSMM数据安全能力成熟度二级认证&#xff0c;成为广电行业内首家获得二级认证的单位&#xff01; 背景概述 江…

什么是防火墙?

目录 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f;防火墙与交换机、路由器对比防火墙和路由器实现安全控制的区别防火墙的发展史1989年至1994年1995年至2004年2005年至今 什么是防火墙&#xff0c;为什么需要防火墙&#xff1f; “防火墙”一词起源于建筑领域&#x…

部署本地GPT

在现实生活中&#xff0c;很多公司或个人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果&#xff1a; 查资料不用愁 家教不…