Python数据容器:dict(字典、映射)

1、什么是字典

Python中的字典是通过key找到对应的Value(相当于现实生活中通过“字”找到“该字的含义”

我们前面所学习过的列表、元组、字符串以及集合都不能够提供通过某个东西找到其关联的东西的相关功能,字典可以。

例如  这里有一份成绩单,记录了学生的姓名和考试总成绩:

姓名成绩
王一

77

王二88
王三99

现在需要将其通过Python录入至程序中,并可以通过学生姓名检索学生的成绩:

使用字典最为合适,可以通过Key(学生姓名),取到对应的Value(考试成绩):

{"王一":77,"王二":88,"王三":99
}

2、字典的定义

字典同样使用{},不过存储的元素是一个一个的键值对,语法如下:

{key:value,   key:value,    key:value}

定义空字典:

my_dict = {}                  # 空字典定义方式1

my_dict = dict()           # 空字典定义方式2

字典的key是不允许重复的,当定义了重复的key时,后面的 键值对 会把前面的 键值对 覆盖掉(只保留最后一个)。

字典同集合一样,不可以使用下标索引,但是字典可以通过Key值来取得对应的Value。

字典的key不可以为字典。

字典有如下特点:
1、可以容纳多个数据
2、可以容纳不同类型的数据
3、每一份数据是Keyvalue键值对
4、可以通过Key获取到Value,Key不可重复(重复会覆盖)
5、不支持下标索引
6、可以修改(增加或制除更新元素等)
7、支持for循环,不支持while循环

3、示例代码 

# 定义空字典,两种方式
my_dict_empty = dict()
my_dict_empty1 = {}
"""为什么在前面集合处,定义空的集合只有my_set = set()?  因为 ={} 被字典占用了,所以只能使用set()
"""# 定义字典,键值对:学号:成绩
my_dict = {"2023001": "99", "2023002": "88", "2023003": "77"}
print(f"my_dict 的内容是: {my_dict},  类型是{type(my_dict)}")
"""输出:my_dict 的内容是: {'2023001': '99', '2023002': '88', '2023003': '77'},  类型是<class 'dict'>
"""# 定义重复Key的字典
my_dict_KeyRepeat = {"2023001": "99", "2023002": "88", 
"2023003": "77", "2023001": "60"}
print(f"my_dict_KeyRepeat  的内容是: {my_dict_KeyRepeat }")
"""输出:my_dict_KeyRepeat  的内容是: {'2023001': '60', '2023002': '88','2023003': '77'}"2023001": "60" 把 "2023001": "99" 覆盖掉了
"""# 从字典中基于Key获取Value
score = my_dict["2023001"]
print(f"学号为2023001的同学的考试成绩为: {score}")
# 输出:学号为2023001的同学的考试成绩为: 99
score = my_dict.get("2023002")  # 使用get()方法同样可以
print(f"学号为2023002的同学的考试成绩为: {score}")
# 输出:学号为2023002的同学的考试成绩为: 88# 定义嵌套字典
"""假如有一张成绩单为:姓名   语文  数学  英语王一   99    60   78王二   98    78   91王三   59    66   61…… ……那么这时候使用嵌套字典就很合适了
"""
Multiple_subjects_scores = {"王一": {"语文": "99",  "数学": "60",  "英语": "78"},"王二": {"语文": "98",  "数学": "78",  "英语": "91"},"王三": {"语文": "59",  "数学": "66",  "英语": "61"}
}
# 从嵌套字典中获取数据
someone_score = Multiple_subjects_scores["王一"]["语文"]
print(f"王一的语文成绩是{someone_score}")
# 输出:王一的语文成绩是99

4、字典的常用操作 

操作语法结构
新增元素字典[key] =Value字典被修改,新增了元素
更新元素字典[key] =Value

字典被修改,元素被更新

(字典key不可以重复,所以对已存在的key执行新增元素操作,

就是更新Value值)

删除元素字典.pop(key)获得指定Key的Value,同时字典被修改,指定Key的数据被删除
清空元素字典.clear( )得到空字典,得到:{}

获取全部

的key值

字典.keys()得到字典中全部key
遍历字典for key in 字典:因为不支持下标索引,所以不支持while循环,只能使用for循环

统计字典内

的元素数量

len(字典)得到字典的元素数量
# 新增元素
Multiple_subjects_scores = {"王一": {"语文": "99",  "数学": "60",  "英语": "78"},"王二": {"语文": "98",  "数学": "78",  "英语": "91"},"王三": {"语文": "59",  "数学": "66",  "英语": "61"}
}
Multiple_subjects_scores["王一"]["政治"] = "100"
print(f"新增元素后的Multiple_subjects_scores为: Multiple_subjects_scores = {Multiple_subjects_scores}")
"""输出:新增元素后的Multiple_subjects_scores为: Multiple_subjects_scores = {'王一': {'语文': '99', '数学': '60', '英语': '78', '政治': '100'}, '王二': {'语文': '98', '数学': '78', '英语': '91'}, '王三': {'语文': '59', '数学': '66', '英语': '61'}}王一新增了政治成绩
"""# 更新元素
Multiple_subjects_scores["王三"]["语文"] = "88"
print(f"更新元素后的Multiple_subjects_scores为: Multiple_subjects_scores = {Multiple_subjects_scores}")
"""输出:更新元素后的Multiple_subjects_scores为: Multiple_subjects_scores = {'王一': {'语文': '99', '数学': '60', '英语': '78', '政治': '100'}, '王二': {'语文': '98', '数学': '78', '英语': '91'}, '王三': {'语文': '88', '数学': '66', '英语': '61'}}王三的语文成绩从59 改成了 88
"""
# 删除元素
Multiple_subjects_scores_Del = {"王一": {'语文': '99', '数学': '60', '英语': '78', '政治': '100'},"王二": {'语文': '98', '数学': '78', '英语': '91'},"王三": {'语文': '88', '数学': '66', '英语': '61'},"王四": {'语文': '82', '数学': '68', '英语': '69'}}
Delete_Value_four = Multiple_subjects_scores_Del.pop("王四")   # 删除王四整个同学的成绩
Delete_Value_one = Multiple_subjects_scores_Del["王一"].pop("政治")     # 注意王一写在了pop的前面
del Multiple_subjects_scores_Del["王二"]["英语"]    # 删除王二的英语成绩
print(f"执行完上面三条删除操作后的Multiple_subjects_scores_Del为: "f"Multiple_subjects_scores_Del = {Multiple_subjects_scores_Del}")
"""输出:执行完上面三条删除操作后的Multiple_subjects_scores_Del为: Multiple_subjects_scores_Del = {'王一': {'语文': '99', '数学': '60', '英语': '78'},   政治成绩被删除'王二': {'语文': '98', '数学': '78'},                 英语成绩被删除'王三': {'语文': '88', '数学': '66', '英语': '61'}王四整行被删除}
"""# 获取全部的key值
All_Keys = Multiple_subjects_scores_Del.keys()
print(f"Multiple_subjects_scores_Del字典的全部key为: {All_Keys}")
# 输出:Multiple_subjects_scores_Del字典的全部key为: dict_keys(['王一', '王二', '王三'])# 遍历字典
print(f"Multiple_subjects_scores_Del字典的key分别为", end=":  ")
for key in Multiple_subjects_scores_Del:print(key, end=",  ")
print()print(f"Multiple_subjects_scores_Del字典的Value为", end=": ")
for key in Multiple_subjects_scores_Del:print(Multiple_subjects_scores_Del[key], end=",  ")
print()print(f"Multiple_subjects_scores_Del字典中王一的key为", end=": ")
for key in Multiple_subjects_scores_Del["王一"]:print(key, end=",  ")
print()print(f"Multiple_subjects_scores_Del字典中王一的Value为", end=": ")
for key in Multiple_subjects_scores_Del["王一"]:print(Multiple_subjects_scores_Del["王一"][key], end=",  ")
print()
"""输出:Multiple_subjects_scores_Del字典的key分别为:  王一,  王二,  王三,  Multiple_subjects_scores_Del字典的Value为: {'语文': '99', '数学': '60', '英语': '78'},  {'语文': '98', '数学': '78'},  {'语文': '88', '数学': '66', '英语': '61'},  Multiple_subjects_scores_Del字典中王一的key为: 语文,  数学,  英语, Multiple_subjects_scores_Del字典中王一的Value为: 99,  60,  78, 
"""# 统计字典内的元素数量
count = len(Multiple_subjects_scores_Del)
print(f"Multiple_subjects_scores_Del的长度为: {count}")
# 输出: Multiple_subjects_scores_Del的长度为: 3

5、键值对

什么是键值对:

        键值对是一种数据结构,它由一个唯一的键(Key)和与之关联的值(Value)组成键用于唯一标识数据,而值则是与键相关联的数据。键值对在编程中被广泛应用,可以用于存储、表示和操作数据。在键值对中,键(Key)是唯一的,它用于标识或索引数据。

        通常情况下,键可以是字符串、数字或其他类型的数据。值(Value)则是与键相关联的数据,可以是任意类型的数据,如字符串、数字、布尔值、对象等。通过键,可以快速访问和检索与之关联的值。

        使用键值对可以实现快速的数据存储和检索,因为键的唯一性可以确保不会出现重复的键,而值可以根据键进行快速的访问和操作。例如,可以使用键值对来表示字典中的单词和对应的定义,或者用来存储用户的 ID 和相关的用户信息等。

        总结起来,键值对是一种由唯一的键和与之关联的值组成的数据结构,用于存储和操作数据。通过键可以快速地访问和检索与之关联的值,使得键值对成为一种常用的数据组织和操作方式。

常见的由键值对组成的结构: 

 1. 字典(Dictionary):

        字典也称“关联数组”、“映射”。字典是Python中内置的数据结构,它使用大括号 `{}` 表示,每个元素都包含一个键和对应的值。字典可以用于存储和管理键值对数据,键是唯一的且不可变,值可以是任意类型的对象。字典的语法:字典={key:value,   key:value,    key:value}

  2.  JSON(JavaScript Object Notation):

JSON的语法衍生自JavaScript,但已经成为一种独立于编程语言的通用数据格式,JSON 是一种轻量级的数据交换格式,广泛应用于各种语言中。因其轻量、简洁、易用的特点,JSON广泛应用于Web开发、API设计和数据交换等场景。常见的应用包括将服务器返回的数据以JSON格式传输给前端,或将前端发送的数据以JSON格式传输给服务器。许多API也使用JSON作为数据的传输格式。它的数据结构也是基于键值对的形式。

        JSON的语法:在JSON中,数据通过键值对的方式表示,使用大括号 {} 和方括号 [] 来表示对象和数组。

例如,以下是一个简单的JSON示例:

{"name": "John","age": 30,"isStudent": true,"hobbies": ["reading", "music"],"address": {"street": "123 Main St","city": "New York"},"phones": [{"type": "home", "number": "1234567890"},{"type": "work", "number": "9876543210"}]
}

在上面的示例中,"name": "John" 表示一个键值对,键是 "name",值是 "John"。 "hobbies" 的值是一个包含两个元素的数组。

"address" 的值是一个嵌套的对象。

"phones" 的值是一个包含两个对象元素的数组。

请注意,JSON的语法要求严格遵循上述规则,键必须使用双引号括起来,并且字符串值也必须使用双引号。同时,JSON不支持注释和多行字符串。

3. 命名元组(NamedTuple):

命名元组是一个Python标准库中的数据结构,它是元组的子类,其中每个元素都有一个名称(键)。命名元组可以像元组一样进行索引和切片操作,但是可以通过`<命名元组>.<键名称>`的方式访问元素。

 命名元组的语法:

        在Python中,创建命名元组的语法使用`collections`模块中的`namedtuple`函数。
        创建命名元组的基本语法:

from collections import namedtuple
# 定义命名元组的类名和字段名
MyTuple = namedtuple('MyTuple', ['field1', 'field2', 'field3'])
# 创建命名元组对象
my_tuple = MyTuple('value1', 'value2', 'value3')

在上面的示例中,我们首先从`collections`模块导入`namedtuple`函数。然后,使用`namedtuple`函数创建一个命名元组类`MyTuple`,其中`MyTuple`是类的名字,`['field1', 'field2', 'field3']`是字段名的列表。你可以根据需要指定不同的字段名。

一旦我们定义了命名元组类`MyTuple`,我们可以使用这个类来创建命名元组对象。在上面的示例中,我们使用`MyTuple`类创建了一个名为`my_tuple`的命名元组对象,并给每个字段分配了一个值。

可以像访问普通元组一样访问命名元组的字段值,例如`my_tuple.field1`会返回`'value1'`。此外,命名元组还提供了一些其他方法和属性,如`_asdict()`、`_replace()`等,可以进一步操作和处理命名元组对象。

4. 配置文件:

        在配置文件中,常使用键值对的形式来表示配置项和相应的值。例如INI文件格式中,使用方括号标记配置项的区域,并使用等号将配置项和值进行分隔。这些结构中的键值对可以用于存储和组织数据,提供了灵活性和可读性,使得代码更易于理解和维护。

        配置文件是一种文本文件,用于存储应用程序或系统的配置信息。它通常用于存储各种参数、选项和设置,以便在应用程序运行时进行读取和修改。配置文件的目的是将特定的配置数据与源代码分离,使得可以轻松修改和管理应用程序的行为。配置文件可以包含键值对(key-value)的形式,其中键表示配置项的名称,值表示配置项的对应值。配置文件还可以使用不同的格式,如INI格式、JSON格式、YAML格式等,不同格式的配置文件具有不同的语法和特点。

通过使用配置文件,可以实现以下功能:
- 配置应用程序的默认设置和选项。
- 允许用户根据自己的需求定制应用程序的行为。
- 简化应用程序的部署和配置。
- 将敏感的信息(如数据库密码、API密钥)从源代码中分离,提高安全性。

配置文件通常可以手动编辑,也可以通过读取和写入配置文件的代码来进行操作。读取配置文件时,程序可以解析配置文件并将配置项加载到内存中供应用程序使用。修改配置文件时,可以更新配置值或添加新的配置项,以调整应用程序的行为。

  5. 关系型数据库(例如MySQL、PostgreSQL、Oracle):

        关系型数据库使用表格的形式来存储数据,并使用键值对来表示数据的列名和对应的值。(和字典十分类似)

6. URL参数(Query String):

        在URL中,可以通过使用键值对的形式来传递参数。例`https://www.example.com/search?keyword=apple`,其中`keyword`是键,`apple`是对应的值。

        URL的组成:

        一个URL(Uniform Resource Locator,统一资源定位符)通常包含以下几个部分:

        1. 协议(Protocol):URL的协议部分指定了访问资源所使用的协议,比如HTTP、HTTPS、FTP等。协议通常在URL的开头,后跟`://`。

        2. 主机名(Host):主机名部分标识了资源所在的主机或服务器的域名或IP地址。主机名通常紧跟在协议之后,并由斜杠或端口号结束。

        3. 端口号(Port):端口号是一个可选项,用于标识要连接到的服务器上的特定进程。如果没有显式指定端口号,则使用协议的默认端口号。

        4. 路径(Path):路径部分指定了服务器上资源的具体路径或位置。路径以斜杠`/`开头,可以根据需要包含多个目录和文件名称。

        5. 查询参数(Query Parameters):查询参数允许在URL中传递附加的参数和数据。查询参数通常以问号`?`开头,多个参数之间以`&`分隔,每个参数由参数名和值组成

        6. 片段标识符(Fragment Identifier):片段标识符允许在URL中指定某个资源的特定片段或锚点位置。片段标识符通常以井号`#`开头

综上所述,一个完整的URL示例可能如下所示:
 

https://www.example.com:8080/path/to/resource
?param1=value1&param2=value2#fragment


其中,协议是`https`,主机名是`www.example.com`,端口号是`8080`,路径是`/path/to/resource`,查询参数是`param1=value1&param2=value2`,片段标识符是`fragment`。具体的URL结构和含义可以根据不同的协议和实际需求而有所变化。

7. HTTP请求头(HTTP Headers):

        HTTP请求头包含了一系列的键值对,用来传递额外的信息和控制请求的行为。例如`Content-Type: application/json`,其中`Content-Type`是键,`application/json`是对应的值。

8. 缓存(Cache):

        在计算机科学中,缓存是一种用来临时存储数据的技术。缓存常常使用键值对的形式来存储数据,其中键是用来标识数据的唯一值,而值则是要存储的数据本身。

9. 数据存储桶(Data Storage Buckets):

        在云计算和分布式系统中,数据存储桶是一种用于存储和组织数据的容器。其中的数据可以使用键值对的形式进行存储和检索,其中键用于唯一标识数据,而值是数据本身。

10.哈希表:

        在哈希表中,数据以键值对的形式存储,其中键是数据的唯一标识符,值是与该键关联的数据。通过使用哈希函数,将键映射到哈希表的索引位置,以便更快地访问和检索数据。

        哈希表通常用于需要高效的数据查找和检索操作的场景,例如字典、数据库索引等。通过将键进行哈希函数计算,可以将数据均匀地分布到哈希表的不同位置上,从而提供快速的数据访问性能。在哈希表中,键具有唯一性,每个键对应一个值,可以通过键快速定位到对应的值,这使得哈希表成为一种高效的键值对存储和检索的数据结构。

11. 堆(Heap):

        堆是一种具有特殊性质的完全二叉树,常用于优先级队列等场景。堆中的每个节点都有一个关键字,其中键可以用来对节点进行排序。堆通常通过键值对的形式来表示,其中键用来排序节点,值用来存储真实的数据。

12. 树(Tree):

        树是一种用于存储层次化数据的数据结构,其中每个节点可以包含一个或多个子节点。在一些特定的树结构中,节点可以通过键值对的形式来表示,其中键用于标识节点,值用于存储节点的数据。

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

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

相关文章

vue修改node_modules打补丁步骤和注意事项

当我们使用 npm 上的第三方依赖包&#xff0c;如果发现 bug 时&#xff0c;怎么办呢&#xff1f; 想想我们在使用第三方依赖包时如果遇到了bug&#xff0c;通常解决的方式都是绕过这个问题&#xff0c;使用其他方式解决&#xff0c;较为麻烦。或者给作者提个issue&#xff0c;然…

【Java 基础篇】Java后台线程和守护线程详解

在Java多线程编程中&#xff0c;有两种特殊类型的线程&#xff1a;后台线程&#xff08;Daemon Thread&#xff09;和守护线程&#xff08;Daemon Thread&#xff09;。这两种线程在一些特定的场景下非常有用&#xff0c;但也需要谨慎使用。本文将详细介绍后台线程和守护线程的…

根据实体类生成表生成语句

新接手一个项目&#xff0c;没有数据库文件&#xff0c;并且Entity实体类放在不同的文件路径中&#xff0c;写了个转换工具&#xff0c;如下&#xff1a; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.annotations.TableId; import io.swagge…

(JavaEE)(多线程案例)线程池 (简单介绍了工厂模式)(含经典面试题ThreadPoolExector构造方法)

线程诞生的意义&#xff0c;是因为进程的创建/销毁&#xff0c;太重了&#xff08;比较慢&#xff09;&#xff0c;虽然和进程比&#xff0c;线程更快了&#xff0c;但是如果进一步提高线程创建销毁的频率&#xff0c;线程的开销就不能忽视了。 这时候我们就要找一些其他的办法…

Ansible之Playbook的任务控制

一&#xff09;Ansible 任务控制基本介绍 这⾥主要来介绍PlayBook中的任务控制。 任务控制类似于编程语⾔中的if … 、for … 等逻辑控制语句。 这⾥我们给出⼀个实际场景应⽤案例去说明在PlayBook中&#xff0c;任务控制如何应⽤。 在下⾯的PlayBook中&#xff0c;我们创建了…

pnpm入门教程

一、概述 1、更小 使用 npm 时&#xff0c;依赖每次被不同的项目使用&#xff0c;都会重复安装一次。 而在使用 pnpm 时&#xff0c;依赖会被存储在内容可寻址的存储中。 2、更快 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。目录结构计算。 node_modules 目录结构是…

什么是GPT磁盘?介绍GPT(GUID 分区表)磁盘及其优势!

GPT概述 GPT磁盘是什么意思&#xff1f;GPT是全局唯一标识符分区表&#xff08;GUID Partition Table&#xff09;的简称&#xff0c;它是硬盘分区表结构的一个标准模式。在我们深入了解GPT磁盘的特性之前须知&#xff0c;MBR磁盘的分区信息直接保存在主引导记录&#xff0…

【探索C语言中VS调试技巧】:提高效率和准确性

文章目录 前言1. 什么是bug&#xff1f;2. 调试是什么&#xff1f;有多重要&#xff1f;2.1 调试是什么&#xff1f;2.2 调试的基本步骤2.3 Debug和Release的介绍 3. Windows环境调试介绍3.1 调试环境的准备3.2 学会快捷键3.3 调试的时候查看程序当前信息3.3.1 查看临时变量的值…

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…

RK3568-drm框架

1 DRM 概述 DRM 全称是 Direct Rendering Manager,进行显示输出管理、buffer 分配、帧缓冲。对应 userspace 库 为 libdrm,,libdrm 库提供了一系列友好的控制封装,使用户可以方便的进行显示的控制和 buffer 申请。DRM 的设备节点为 "/dev/dri/cardX", X 为 0-15…

Android 富文本SpannableString

一、认识SpannableString 为什么要使用富文本 在Android开发中&#xff0c;有很多UI会画出一些特别炫酷的界面出来&#xff0c;比如一个字符串里有特殊的字会有其他颜色并加粗、变大变小、插入小图片、给某几个文字添加边框&#xff0c;如果我们使用笨办法用几个TextView或者Im…

单片机第三季-第三课:STM32开发板原理图、配置、浮点运算单元

目录 1&#xff0c;开发板原理图 2&#xff0c;浮点运算单元&#xff08;FPU&#xff09; 1&#xff0c;开发板原理图 课程视频比较早&#xff0c;介绍了三款开发板。观看视频时用的开发板说和51单片机共板的STM32核心板&#xff0c;将51单片机从底座拆下来后&#xff0c;安…

avi怎么转换成视频?

avi怎么转换成视频&#xff1f;在我们日常使用的视频格式中&#xff0c;AVI是一种常见且经常被使用的音频视频交叉格式之一。它的优点之一是占用的存储空间相对较小&#xff0c;但也明显存在着画质损失的缺点。虽然AVI格式的视频在某种程度上也很常见&#xff0c;但与最常见的M…

zabbix的原理与安装

一、Zabbix介绍 1、zabbix 是什么&#xff1f; zabbix是一个开源的IT基础监控软件&#xff0c;能实时监控网络服务&#xff0c;服务器和网络设备的状态&#xff0c;如网络使用&#xff0c;CPU负载、磁盘空间等&#xff0c;主要是包括数据的收集、报警和通知的可视化界面zabbi…

需求文档书写规范

需求文档的格式应该清晰易读&#xff0c;便于阅读和理解&#xff0c;应该有一个明确的标题和编号。需求文档应该包含以下内容&#xff1a;背景、目的、需求、功能、性能、接口、安全、测试和质量保证等。需求应该明确具体&#xff0c;避免歧义&#xff0c;同时考虑用户的需求和…

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的&#xff0c;QEMU模拟VHOST SCSI设备配置空间等&#xff0c;而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。 在QEMU中VHOST SCSI设备继承关系如下&#xff1a; 其它设备以及对应class_init函数和realize具现化实现与V…

LLM微调(一)| 单GPU使用QLoRA微调Llama 2.0实战

最近LLaMA 2在LLaMA1 的基础上做了很多优化&#xff0c;比如上下文从2048扩展到4096&#xff0c;使用了Grouped-Query Attention&#xff08;GQA&#xff09;共享多头注意力的key 和value矩阵&#xff0c;具体可以参考&#xff1a; 关于LLaMA 2 的细节&#xff0c;可以参考如下…

zotero通过DOI快速导入文献

之前我经常采用两种方式导入文献&#xff1a; &#xff08;1&#xff09;下载PDF&#xff0c;然后拖入zotero 这种方法比较费时间&#xff0c;有些文献无法下载pdf &#xff08;2&#xff09;通过google scholar检索文献&#xff0c;然后点击引用——EndNote&#xff0c;chorme…

Kotlin中函数的基本用法以及函数类型

函数的基本用法 1、函数的基本格式 2、函数的缺省值 可以为函数设置指定的初始值&#xff0c;而不必要传入值 private fun fix(name: String,age: Int 2){println(name age) }fun main(args: Array<String>) {fix("张三") }输出结果为&#xff1a;张三2 …

WebGL层次模型——多节点模型

目录 多节点模型 MultiJointModel中的层次结构 控制各部件旋转角度的变量 示例程序——共用顶点数据&#xff0c;通过模型矩阵缩放实现&#xff08;MultiJointModel.js&#xff09; MultiJointModel.js&#xff08;按键响应部分&#xff09; MultiJointModel.js&#x…