《人工智能导论》(python版)第2章 python基础2.2编程基础

  书写这篇博客的目的在于实践并记录《人工智能导论》(Pyhton版)微课视频版这本书的内容,便于对人工智能有更深层次的理解。

参考文献:姜春茂.人工智能导论(Python版)微课视频版[M]. 北京:清华大学出版社,2021.

目录

2.1 Python的安装--省略

2.2 编程基础

2.2.1 数据类型与变量

1.数据类型

1)数值

2)字符串

3)布尔值

4)列表

5)转义字符

2.变量

2.2.2 字符串和编码

1.Python的字符串

1)字符串的创建

2)字符串的截取

3)字符串的拼接

4)字符串的统计

5)字符串的切割

6)查找字符串下标

1.Python的编码与转换

1)ASCII

2.2.3 列表、元组及字典

1.列表

1)创建列表

2)访问列表中的值

3)列表的切片

4)列表的相加

5)列表的扩展

6)列表的更新

7)列表的删除

2.元组

3.字典

1)创建字典

2)访问字典中的值

3)字典的修改


2.1 Python的安装--省略

2.2 编程基础

2.2.1 数据类型与变量

1.数据类型

Python一共有5种数据类型,分别是:数值、字符串、布尔值、列表和转义字符。(该书只列举了这5种类型,可能是因为面对初学者)

1)数值

只能存放一个值,定义之后不可更改,可以直接访问。

Python的数值类型又分为整型(int)、长整型(long)、浮点型(float)、复数(complex)。

整型:整数,包括正整数与负整数,也可以用十六进制、十进制、八进制表示整数。

print(10)
print(oct(10))  # Octal:八进制
print(hex(10))  # Hexadecimal:十六进制

其中,八进制中的个位数表示8的0次方,也就是1;八进制中的十位数表示8的1次方也就是8。10是由1个8的1次方和2个8的0次方组成,因为其结果为0o12,其中“0o”这一前缀表示12是一个八进制的数字。

浮点型:小数,对于很大和很小的浮点数可以用科学计数法表示

例如,1.5e3是科学计数法表示1.5×10的三次方,既是1.5e3也是1500.0(浮点保留一位小数)

复数:数学中的复数,由实数和虚数两部分组成。与数学复数不同的是:虚数部分用j表示,一般形式为x+yj,其中x是复数的实部,y是复数的虚部,x和y都是实数。

# 复数
c1 = 3 + 4j
print(c1)          # 输出: (3+4j)
print(c1.real)     # 输出实部: 3.0
print(c1.imag)     # 输出虚部: 4.0# 复数运算
c2 = 1 - 2j
print(c1 + c2)     # 输出: (4+2j)
print(c1 * c2)     # 输出: (11-2j)

其中c1*c2的过程为:(3+4j)*(1-2j)=3*1+3*(-2j)+4j*1+4j*(-2j)=3-6j+4j-8(j*j)=8+3-2j=11-2j

备注:j*j=-1

2)字符串

一个有序的字符的集合,用于存储和表示基本的文本信息,指的是单引号或双引号括起来的文本部分。

s1 = 'Hello Python!'
s2 = '人工智能'
print(s1+s2)
print(s1[0])
print(s2[1])

3)布尔值

布尔值只为True或False(首字母大写),也就是对或错。一些公式的计算结果也是布尔值

# 布尔值
print(True)
print(False)
print(3 > 1)
print(3 > 9)

例如第34行代码中,显然3小于9,所以返回结果就是False。

同时,布尔值也可以使用与运算(and)、或运算(or)和非运算(not)进行运算,相当于逻辑运算。

print(True and True)
print(True and True and False)
print(False or True)
print(False or False)
print(not False)
print(not True)

其中,and表示左右两个公式都为真时才为真。那么真 and 假(True and False)有一个为假,所以返回值为假(False);

or表示或者,也就是左右两个公式一个为真即为真。例如,假或真(False or True)只要有一个为真,其返回值就为真(True)。

4)列表

列表是Python中内置有序、可变的序列,可以存储大多数集合类的数据结构,支持字符、数字、字符串,甚至可以包括列表。用[ ]标识,所有元素均放在方括号内部。

通过下面的代码演示列表的有序性和可变性。

list = ["苹果", "香蕉", "橙子"]
print(list)
list[1] = "蓝莓"
print(list)
list.append("葡萄")
print(list)
list.remove("橙子")
print(list)

5)转义字符

转义字符是帮助机器理解一些存在歧义内容的字符。

例如,字符串s的内容为let's go!

s = 'let's go!'

在Python中会将s = 'let's go!' 标红和加粗的单引号看作一对,这显然发生了歧义,因此可以用s = 'let\'s go!' 来表示,“\”表示后面的引号只是一个普通字符。

转义字符描述转义字符描述
\续行符\000
\\反斜杠符号\f换页
\'单引号\v纵向制表符
\"双引号\t横向制表符
\a响铃\r回车
\b退格\e转义
\n换行

接下来举例说明不加转义字符和加了转义字符的代码结果:

显然,不加转义字符就会出现错误。

2.变量

变量是存储在内存中的值,创建变量时会在内存中开辟一个空间。

变量不仅可以是数字,还可以是任意数据类型。

变量名必须为大小写英文字母、数字、下划线的组合,且不能由数字开头。

Python中的变量赋值不需要类型声明(这一点与c语言不一样),在变量使用前必须赋值,赋值后变量才会被创建。使用“=”给变量赋值,Python中可以同时对多个变量赋值。

变量中的赋值:

number = 125
distance = 123.4
city = "Beijing"
print(number)
print(distance)
print(city)

多个变量赋值:

a = b = c = 1
print(a,b,c)

2.2.2 字符串和编码

1.Python的字符串
1)字符串的创建

在2.2.1中已经简单介绍了字符串,使用单引号(‘’)或双引号(“”)创建字符串,字符串的创建只要为变量分配一个值即可

str1 = 'Where are you from?'
str2 = "你来自哪里?"
print(str1)
print(str2)

可以看到字符串是由引号所包裹而成的,那么如果存在多个引号,就需要特殊处理,其中错误例子已经在5)转义字符中提到了。

有以下两个解决方法,分别是使用不同引号和使用转义字符。

使用不同引号:

str_name1 = "I'm Joy"
print(str_name1)

使用转义字符:

PS:这里感觉教材写错了,教材中写的是str3 = 'he said:" I\\'m Joy"'

str3 = 'he said:" I\'m Joy"'
print(str3)

其中"\'"表示就是一个单引号,而不是创建一个字符串的意思。

2)字符串的截取

在Python中,使用方括号来截取字符串,遵循左闭右开的原则,字符串的索引值从0开始。

例如:var = "Python!",那么var[0]就是P,var[6]就是!,var[1,3]就是yt

var1 = 'Hello World!'
var2 = "Welcome to China"
print("var1[1]:", var1[1])
print("var2[1:3]:", var2[1:3])

指定元素截取方式:

其中,str[1:]是从下标为1开始(e),一直到最后一个字符

str[1::2]是指从下标为1开始(e),每隔两个字符(算开始字符)截取一次,一直到最后一个字符

带负号的索引是指从右到左的索引,最右边的字符的索引是-1,那么-6就是“C”前面的空格,-10就是“welcome”的最后一个“e”,所以从-10到-6应该是“e to”(左闭右开,不包括str[-6])

而str[::-1]则是翻转,也就是前后置换,也就是翻转

3)字符串的拼接

字符串有3种拼接方式,分别是:乘法重叠、加法拼接和使用join拼接

join()用于连接字符串数组,将序列中的元素以指定字符连接成新的字符串

str1 = "Hello" * 3
str2 = 'Hello' + 'World'
a = 'world'
str3 = ' '.join(a)
print(str1)
print(str2)
print(str3)

可以看到str1和str2都好理解,而str3使用了join函数,也就是让字符串a中每两个字符之间都用空格隔开

4)字符串的统计

在Python中,使用len()函数计算字符串的长度,空格也会被计算在内

str = "Hello World"
print(len(str))

其中,Hello有5个字符,World也有5个,算上一个空格一共就是11个

5)字符串的切割

使用split()对字符串进行分割,有多种分割方式

str = "Aspring people have become a success"
print(str.split(" "))
print(str.split("e"))
print(str.split(" ", 2))

第一行是遇到空格就分割,显然字符串中有5个空格,因此会分割成6个字符串

第二行是遇到e就分割,字符串中一共有6个e,因此会分割成7个字符串

Aspring people have become a success

第三行则是遇到空格就分割,最大分割次数为2(前两行没有写分割次数的参数,因此就是无限次分割),因此会分割成3个字符串

6)查找字符串下标

使用find()函数查找字符串的下标位置,如果找不到则返回-1

find_str = "Aspiring people have become a success"
s1 = "become a success"
print(find_str.find(s1))
print(find_str.find("people"))
print(find_str.find('e', 11))
print(find_str.find('k'))

其中,Aspiring一共有7个字符,加上空格就是8个,之后就是people,因为索引从0开始计数,所以people的起始索引位置就是9,其他问题同理

第三个print不是很好理解,这里给出find()函数的说明

str.find(sub[, start[, end]])

  • str‌:待搜索的原字符串。
  • sub‌:必选参数,需要查找的子串。
  • start‌/‌end‌:可选参数,限定搜索范围的起始和结束位置索引(左闭右开区间)

因此,print(find_str.find('e', 11))的意思是,从索引为11的位置开始找“e”字符,索引为11的字符是people的o,那么下一个“e”就是people的最后一个“e”,其索引为14.

1.Python的编码与转换

常见的编码方式有以下5种

编码制定时间作用所占字符数
ASCII1967年表示英语及西欧语言8/1B
GB 23121980年国家简体中文字符集,兼容ASCII2B
GBK1995年GB 2312的扩展字符集,支持繁体字,兼容GB 23122B
Unicode1991年国际标准组织统一标准字符集2B
UTF-81992年不定长编码1~3B

在7年计算机的求学过程中,个人认为ASCII码的应用范围更广,因此只说明ASCII。

1)ASCII

ASCII的常见规则:

  1. 数字比字母小,如'9'<'A';
  2. 数字按从大到小顺序递增,如'8'<'9'
  3. 字母按从A到Z的大小顺序递增,如'B'<'H'
  4. 同一个字母的小写字母比大写字母大,如'e'>'E'

2.2.3 列表、元组及字典

1.列表
1)创建列表

使用[]创建列表, 用逗号分割不同数据项,列表的索引从0开始

list1 = ['KangKang', 18, 'Boy', 'Music']
list2 = [8, 9, 0, 2, 3, 1]
list3 = ['a', 1, 2, 3, 'b']
print(list1)
print(list2)
print(list3)

可以看到,数值类型的数据项不需要用引号,但是字符串需要

2)访问列表中的值

可以把列表看成字符串,每一个数据项就相当于字符串中的一个字符。

list1 = ['KangKang', 18, 'Boy', 'Music']
print(list1[2])
print(list1[-1])

其中,-1代表从右到左的索引,因为最右边的数据项是Music,就是-1对应着Music

当索引超出位置时,程序就会报错,例如:

3)列表的切片

切片可以实现一次性获取多个元素,与字符串切割类似,但是列表不需要split()函数。操作规则为:[开始位置:结束位置:间隔],其中,间隔可以不写,默认为1.同样遵循左闭右开的原则

list1 = ['KangKang', 18, 'Boy', 'Music']
print(list1[:2])
print(list1[-2:])
print(list1[::2])
print(list1[:])

其中第12行的“2”表示结束位置,也就是只输出索引为0和1的数据项

第13行的“-2”表示从右到左的索引位置,-2代表的数据项就是‘Boy’,也就是取出最后两个元素,所以应该输出'Boy', 'Music'

第14行的“2”代表间隔,每两个数据项输出一个数据项

第15行什么参数都没有写,也就是取出全部元素

4)列表的相加

用“+”即可实现列表的相加,其中,列表的相加并没有改变原有列表的元素,两个列表仍为最开始定义的值

# 列表的相加
list1 = ['KangKang', 18, 'Boy', 'Music']
list2 = ["186cm", "70kg"]
list3 = list1 + list2
print(list1)
print(list2)
print(list3)

5)列表的扩展

使用extend()函数对列表进行扩展

list1 = ['KangKang', 18, 'Boy', 'Music']
list2 = ["186cm", "70kg"]
list1.extend(list2)
print(list1)
print(list2)

可以看到,extend()使list2的两个数据项成为了list1中的第五个和第六个数据项。

但是为什么不会让列表成为第五个数据项呢?也就是['KangKang', 18, 'Boy', 'Music', ['186cm', '70kg']]

来看看extend()函数的定义:extend() 方法用于将一个可迭代对象(如列表、元组、字符串等)中的元素逐个添加到列表的末尾。添加后,列表的长度会增加可迭代对象中元素的数量。

也就是说,会把list2中的每个数据项而非列表添加在末尾。那么,怎么将列表添加在末尾呢,那就需要append()函数。

以下是append()函数的定义:append() 方法用于在列表的末尾添加一个元素。这个元素可以是任意类型的对象,如数字、字符串、列表等。添加后,列表的长度会增加1。

也就是说,append()会把加入的内容认为是一个整体,而不是像extend()那样将元素进行分解。接下来,将append替换extend来看一下结果吧。

显然,append()函数直接把列表["186cm", "70kg"]加在了尾端。

6)列表的更新

如果直接修改列表中对应索引的数据项,列表中原数据项的内容就会被替换掉

list1 = ['KangKang', 18, 'Boy', 'Music']
list1[0] = "186cm"
list1[1] = "70kg"
print(list1)

如果不想替换掉原有元素,可以用append()、insert()来添加新元素

list1 = ['KangKang', 18, 'Boy', 'Music']
list1.append("186cm")
print(list1)
list1.insert(1, "70kg")
print(list1)

append()函数是将元素加在末尾,insert是将元素插入对应的索引位置

7)列表的删除

有四种方法可以对列表进行删除,分别是:

  • 使用pop()方法:需要删除特定索引处的元素,并且需要在删除后使用该元素的值时。
  • 使用del语句:需要删除特定索引的元素,或者完全清空列表时。
  • 使用remove()方法:需要删除列表中的特定元素名称而非索引值。
  • 使用clear()方法清空列表,将所有元素都删除,但是仍存在空列表

pop():

list1 = ['KangKang', 18, 'Boy', 'Music', "186cm", "70kg"]
pop_item = list1.pop(2)
print(list1)
print(pop_item)
list1.pop()
print(list1)

del():

remove():

clear():

2.元组

元组和列表类似,但是元组一旦初始化就不能修改,并且元组用小括号()表示,列表使用方括号[]表示

首先,先介绍一下列表、元组和字典的区别

  • 列表(List)‌:可变类型,支持增删改元素
  • ‌元组(Tuple)‌:不可变类型,创建后无法修改元素
  • ‌字典(Dict)‌:可变类型,可增删改键值对,但键必须为不可变类型
tup1 = ('KangKang', 18, 'Boy', 'Music')
print(tup1)
tup2 = ("186cm", "70kg")
print(tup2)
tup3 = tup1 + tup2
print(tup3)

3.字典

字典包括两部分,一部分是键(key),另一部分是值(value)。其中,键是唯一的属性,如果重复了多个同样的键,最后出现的键会替换掉前边的,但是值是不唯一的。

1)创建字典

有两种创建字典的方法:1.使用花括号{};2.使用dict()函数创建,字典的键与值使用冒号:分隔开,键与键使用逗号,分隔开。

除了上述方法初始化字典,还可以用fromkeys()对字典初始化,并用第二个参数作为字典的值

dict1 = {'a':'an', 'b':'be', 'c':'can'}
dict2 = dict()
dict3 = dict(d='defind')
dict4 = dict().fromkeys(['name1', 'name2'], 'KangKang')
print(dict1)
print(dict2)
print(dict3)
print(dict4)

2)访问字典中的值

字典中通过键来寻找值,可以用[]和get()函数的方法来获取对应的值

在这里博主发现,材料中将年龄18也加上了单引号,但是之前的学习中数值类型的字符串可以不加引号,因此这个代码中没有加引号

dict1 = {'Name':'KangKang', 'Age':18, 'height':"186cm", 'weight':'70kg'}
print(dict1)
print(dict1['Age'])
print(dict1.get('Name'))
print(dict1.get('gender'))

3)字典的修改

可以直接通过键来修改值,也可以用update在字典尾端加入键值

dict1 = {'Name':'KangKang', 'Age':18, 'height':"186cm", 'weight':'70kg'}
dict1['Age'] = 20
print(dict1)
dict1.update({'gender': 'male', 'jobs': 'programmer'})
print(dict1)
del dict1['height']
print(dict1)
dict1.pop('Name')
print(dict1)

字典的其他使用方法如下所示:

方法说明方法说明
cmp(dict1, dict2)比较两个字典元素len(dict)计算字典元素个数,即键的总数
dict.clear()删除字典内所有元素dict.copy()

返回一个字典的浅复制

dict.items()以列表返回可遍历的(键,值)元组数组dict.keys()以列表返回一个字典所有的键
dict.values()以列表返回字典中的所有值popitem()随机返回并删除字典中的一对键和值
dict.has_key(key)如果键在字典dict中则返回True,否则返回Falsedict.setdefault(key,default=None)和get()方法类似,但如果键不存在于字典中,将会添加键并将值设为默认值

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

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

相关文章

高可用部署

一.keeplivaer nginx 高可用部署 下面为你详细介绍基于 Keepalived 和 Nginx 在两台机器&#xff08;192.168.137.132 和 192.168.137.61&#xff09;上实现高可用部署的完整步骤&#xff1a; 一、环境准备&#xff08;两台服务器均执行&#xff09;环境准备 &#xff08;1&…

java面向对象高级02——单例类(设计模式)

1.什么是设计模式&#xff1f;一个问题可以有多种解法&#xff0c;在众多解法的最优解法、方案就是设计模式。我们关注的点&#xff1a;某一种设计模式解决的是啥问题&#xff1f;这一设计模式怎么写&#xff1f;2.单例设计模式a.作用单例设计模式的核心作用是确保一个类只有一…

0730 数据结构重点整理

Part 1.梳理数据结构重点一.宏1.简单宏a. #define 宏名 宏体b. #if 宏(#ifndef)c.#endif2.多语句宏a. define 宏函数名(参数1&#xff0c;参数2......)({C语句1&#xff0c;C语句2......})b. define 宏函数名(参数1&#xff0c;参数2......)do(C语句1&#xff0c;C语句2......)…

免费版酒店押金原路退回系统之【房费押金计算器】实践——仙盟创梦IDE

代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>未来之窗——费用计算器</title><s…

Windows下基于 SenseVoice模型的本地语音转文字工具

Windows下基于 SenseVoice模型的本地语音转文字工具 前言&#xff1a; ​ 现在很流行Vibe Coding但是指挥大模型写代码其实也是一件非常累的事情&#xff0c;经常需要输入大段的文字去描述问题的现象以及具体的解决方案。刚好看到有一些博主通过本地部署语音大模型实现了语音转…

OWSM v4 语音识别学习笔记

目录 OWSM v4 简介 卡内基梅隆大学 这个代码不知道干嘛的 tokenizer CTC分割算法 yodas2数据集 依赖性安装&#xff1a; 数据集下载地址&#xff1b; 模型下载地址&#xff1a; docker安装&#xff08;适用于多数 Linux 系统&#xff09;测试ok 推理demo OWSM v4 简介…

机器学习线性回归:从基础到实践的入门指南

目录 一、线性回归的基本概念 二、线性回归的核心原理 三、线性回归的实现步骤 1.数据准备与预处理 2.模型训练 3.模型评估 &#xff08;四&#xff09;模型优化与应用 四、线性回归的应用场景 五、线性回归的进阶方向 在机器学习的广阔领域中&#xff0c;线性回归是入…

6.Linux 系统启动过程,破解root密码与故障修复

Linux :系统启动过程&#xff0c;破解root密码与故障修复 一、标准启动流程 开机自检 (BIOS/UEFI POST) 硬件初始化与检测 MBR引导 读取硬盘主引导记录&#xff08;512字节&#xff09; GRUB2菜单 加载 /boot/grub2/grub.cfg 显示启动菜单 加载Linux内核 载入Linux 内核文件 内…

特产|基于SSM+vue的南阳特产销售平台(源码+数据库+文档)

南阳特产销售平台 基于SSMvue的南阳特产销售平台 一、前言 二、系统设计 三、系统功能设计 平台功能模块 管理员功能模块 商家功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

线性代数常见的解题方法

一.行列式 1.利用行列式的性质进行简化 (1)重要行列式 主对角线,副对角线(不要忘了-1的次数),拉普拉斯展开(副对角线是m*n),范德蒙 (2)行列式展开定理 每一行/列的元素乘以它对应的代数余子式 扩展:拉普拉斯展开定理,可以按照任意行和列数进行展开,行列式的值=|A|*…

Websocket实时行情接口 (2025最新使用教程)

本教程将指导您如何使用Java Websocket客户端连接实时行情接口&#xff0c;并订阅相关数据。 步骤1&#xff1a;配置您的项目 确保您的项目已引入以下依赖&#xff1a; jakarta.websocket-apijakarta.websocket-client-apifastjson2lombokspring-context (如果使用Spring框架) …

【JEECG】JVxeTable表格拖拽排序功能

功能说明&#xff1a; 实现JVxeTable表格拖拽排序功能 解决子表拖拽排序后&#xff0c;点击保存数据&#xff0c;未实现拖拽排序后效果 参数配置&#xff1a; 提示&#xff1a; 1.开启 dragSort 属性之后即可实现上下拖拽排序。 2.使用 sortKey 属性可以自定义排序保存的 key&…

【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单

经过上个月的前车之鉴&#xff0c;我摸索出一套针对腾讯云EdgeOne《付费版》的安全配置模板&#xff0c;仅供各位站长参考 配置方法 一、在EdgeOne控制面板页面&#xff0c;点击要配置的域名。 二、进入后&#xff0c;点击安全防护-WEB防护-自定义规则&#xff0c;按图所示添加…

白玩 一 记录retrofit+okhttp+flow 及 kts的全局配置

先回忆下flow吧&#xff01; flow是啥 Flow 是 Kotlin 协程框架中的一个异步数据流处理组件&#xff0c;专为响应式编程设计&#xff0c;适用于需要连续或异步返回多个值的场景&#xff0c;如网络请求、数据库查询、传感器数据等 1 ‌异步流&#xff08;Asynchronous Stream…

犯罪现场三维还原:科技助力刑侦变革

在刑侦领域&#xff0c;犯罪现场的准确还原对于案件侦破起着至关重要的作用。传统的现场记录方式&#xff0c;如拍照、绘图等&#xff0c;虽然能获取一定信息&#xff0c;但难以全面、直观地呈现现场全貌&#xff0c;容易遗漏关键细节&#xff0c;且在后期分析和信息传达上存在…

go-admin 构建arm镜像

目录 1、 go-admin Dockerfile 2、docker build go-admin 3、settings.yml 4、go-admin-ui Dockerfile 5、docker build go-admin-ui 6、go-admin.yaml 7、go-admin-ui.yaml 1、 go-admin Dockerfile # 构建阶段:使用 Go 1.24 版本(支持远程调试) FROM golang:1.24-…

深入浅出:C++ STL简介与学习指南

目录 前言 STL的版本演变 STL六大组件 STL的重要性 如何学习STL STL的缺陷 总结 前言 什么是STL&#xff1f; STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的核心组成部分&#xff0c;它不仅是一个可复用的组件库&#xff0c;更是一…

Mysql事务原理

脏读(Dirty Read) 某个事务已更新一份数据&#xff0c;另一个事务在此时读取了同一份数据&#xff0c;由于某些原因&#xff0c;前一个进行了RollBack&#xff0c;则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read) 在一个事务的两次查询之中数据不一…

小红书笔记详情API指南

一、引言小红书作为中国领先的社交电商平台&#xff0c;拥有超过4.8亿用户(2025年Q2数据)&#xff0c;其开放平台已成为品牌营销与数据挖掘的重要渠道‌1。通过笔记详情API获取数据&#xff0c;可以帮助商家、品牌方和数据分析人员了解用户反馈、市场趋势和消费需求‌。这些数据…

VS+Qt中使用QCustomPlot绘制曲线标签(附源码)

在qt中我们常常会使用数据来绘制曲线&#xff0c;常用的的绘制方法用QCutomPlot、QChart和QPrinter。有时我们会根据需要在曲线进行二次绘制&#xff0c;包括对曲线打标签&#xff0c;显示某个点的值等功能。本文主要为大家介绍在QCustomPlot中使用QCPItemTracer和QCPItemText绘…