初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: Python

目录

字符串的常见操作 

格式化字符串

占位符

f-string 

字符串的 format 方法 

字符串的编码与解码 

与数据验证相关的方法

字符串的拼接 

字符串的去重操作 


字符串的常见操作 

字符串是Python中的不可变数据类型,在最开始时,我们只是简单地学习了字符串的使用,并未深入研究。既然字符串也是一种数据类型,那么它是否也和前面学习的列表、字典、集合这些数据类型一样有着大量的操作方法呢?答案是有的,我们今天就来深入学习这些方法。

常见的操作字符串的方法
方法名说明
lower()将字符串str全部转成小写字母,结果为一个新的字符串
upper()将字符串str全部转成大写字母,结果为一个新的字符串
split(set=None)把str按照指定的分隔符sep进行分隔,分割之后的结果为列表类型,其中的元素便是被分割后的字符串
count(sub)结果为sub的这个字符串在str中出现的次数
find(sub)查询sub这个字符串在str中是否存在,如果不存在结果为-1,如果存在结果为sub首次出现的索引
index(sub)功能与find(相同,区别在于要查询的子串sub不存在时,程序报错
startswith(s)查询字符串str是否以字符串s开头
endswith(s)查询字符串str是否以字符串s结尾
replace(old, news)使用news替换字符串s中所有的old字符串,结果是一个新的字符串
center(width, fillchar)字符串str在指定的宽度范围内居中,可以使用fillchar进行填充
join(iter)在iter中的每个元素的后面都增加一个新的字符串str
strip(chars)从字符串中去掉左侧和右侧chars中列出的字符串
lstrip(chars)从字符串中去掉左侧chars中列出的字符串
rstrip(chars)从字符串中去掉右侧chars中列出的字符串

代码演示:

str = 'Hello Python'
print('开始一系列字符串操作')
lower_str = str.lower()
print('将字符串变成小写:',lower_str)
upper_str = str.upper()
print('将字符串变成大写:',upper_str)
list = str.split(' ')
print('以空格分割字符串:',list)
count = str.count('o')
print('字符串中"o"出现的次数:',count)
a = str.find('o')
b = str.index('o')
print('字符串中"o"出现的索引位置:',a,b)print('字符串是不是以"hello"作为起始子串呢?',str.startswith('hello'))
print('字符串是不是以"Hello"作为起始子串呢?',str.startswith('Hello'))print('字符串是不是以"python"作为结束子串呢?',str.endswith('python'))
print('字符串是不是以"Python"作为起始子串呢?',str.endswith('Python'))

运行结果:

 注意:在判断是否为起始子串、结束子串时,参数中的字符串不需要是子串,也可以是非子串。上述代码中的 "hello" 便是非子串。

 从上述的结果,也可以看出字符串的相关操作并不会改变字符串本身。简单理解就是 全都是生成一个新的字符列表对象,然后在这个列表中进行一系列的操作,然后改成新的字符串返回。

我们再来通过代码实现剩下的方法操作。

代码演示:

str = 'Hello Python'# 替换字符串中的部分字符
print(str.replace('Hello','Hi')) # 在最后面还可以指定参数
print(str.replace('Hello','Hi',0)) # 指定替换0次,即不替换# 填充部分字符,是字符串在指定的范围内处于居中位置
print(str.center(20)) # 在长度为20的空间中,默认使用空白字符填充,是字符串处于居中位置
print(str.center(20, '*')) # 在上面的基础上,使用"*"进行填充
print(str.center(10,'*')) # 当字符串本身超出 width 时,就直接打印输出# 在字符串str后面的每个字符元素中,加上"  "(两个空格)
print('  '.join(str))# 将 '  hhh  ' 中的空格全部去掉(默认是去掉空格),再使用'*'去替换空格
print('  hhh  '.strip().replace(' ','*'))
print('  hhh  '.replace(' ','*'))
# 观察上面两个的不同,或者写成下面这样print('***hhh***'.strip('*')) # 直接将'*'从字符串中去除
print('***hhh***'.lstrip('*')) # 直接将左边'*'从字符串中去除
print('***hhh***'.rstrip('*')) # 直接将右边'*'从字符串中去除
# 注意下面这种情况,是不能成功去除的
print('*1**hhh***'.lstrip('*')) # 在去除'*'字符的过程中,遇到非'*'字符之后,就会停止去除print('经过一系列的字符串操作之后,原字符串为:'+str)

运行结果: 

格式化字符串

常见的格式化字符串方式有三种:1、占位符的形式;2、f-string的形式;3、str.format()的形式。

占位符

在Python中常用的占位符有三个:1、%s -> 代指字符串;2、%d -> 代指十进制的整数;3、%f -> 代指浮点数。

语法格式:

# 可以理解为是将后面的参数直接带入到 %s、%d、%f 中
# 这里的 %s、%d、%f 只是占了个位置罢了,故名:占位符
# str % () --> 字符串 % 元组,占位符使用元组来替代
print('姓名: %s, 年龄: %d, 成绩: %f' % (name, age, score))

代码演示:

name = '马冬梅'
age = 18
score = 98.5# 使用了 .1f 之后,可以让浮点数只输出一位
print('姓名:%s, 年龄:%d, 成绩:%f' % (name, age, score))
print('姓名:%s, 年龄:%d, 成绩:%.1f' % (name, age, score))

除了上述 .1f 之外,还有 5d 这种写法,小数点后面的是保证位数,小数点前面的是保证输出总长度,当总长度小于我们设置的总长度时,就会使用空格填充,如果是 5d 的写法,就是填充在左边,也就是右对齐;反之,如果是 -5d 的写法,就是填充在右边,也就是左对齐的写法。 scanf与printf函数的详细介绍及其用法_printf 换行符-CSDN博客 可以去看这篇文章,介绍的比较详细,虽然是C语言,但是概念是差不多的(输出格式)。

f-string 

语法格式:

# f-string ,使用的就是 fstring的形式
# 这里是把要使用变量替代的全部放到了{}中,这样在打印时,就会将{}中的变量替换为真实的值
print(f'姓名: {name}, 年龄: {age}, 成绩:{score}')

代码演示: 

name = '马冬梅'
age = 18
score = 98.5# 使用f-string
print(f'姓名:{name}, 年龄:{age}, 成绩:{score}')

字符串的 format 方法 

语法格式:

# str.format() 与 f-string 有点类似,都是使用 {} 来标明需要替换的元素
# 但是 f-string 是直接从上文中取,而 str.format 是从format参数中寻找
# 0、1、2 对应的是 format参数中索引的位置,0 是 name的索引,所以就让 name 来替换0
print('姓名: {0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 下面的写法也是符合要求的,2 是 name的索引,所以使用name来替换2
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

代码演示:

name = '马冬梅'
age = 18
score = 98.5# 使用字符串的format方法
print('姓名:{0}, 年龄:{1}, 成绩:{2}'.format(name, age, score))
# 上述的0、1、2指的是format方法中的参数的索引位置,可以写成下面这样
print('姓名:{2}, 年龄:{1}, 成绩:{0}'.format(score, age, name))

上面三种格式化的方式,写在一起的运行结果:

格式化字符串的详细格式还是有很多的,下面来认识其他的格式。

 代码演示:

s = 'Hello Python'
# 直接使用0去代指format中的参数
print('{0}'.format(s))
# : 是引导符,表明后面开始的操作是对参数的格式化
# * 是填充符,表明当长度不足时,使用 * 来填充
# < 是向左对齐、20 是字符串的总长度,不足时使用填充符来填充
print('{0:*<20}'.format(s))
# ^ 居中对齐、- 使用"-"填充空闲的位置
print('{0:-^20}'.format(s))
# 超出长度,就啥也不做
print('{0:*^5}'.format(s))
# 默认使用 空白字符 填充
print('{0:^20}'.format(s))

运行结果:

代码演示:

# 千位分隔符:只适用于整数与浮点数
# 且针对浮点数时,只会将其整数部分进行分割,而小数部分不会做任何处理
print('{0:,}'.format(1234567890))
print('{0:,}'.format(1234567890.987654321))# .精度 ——> 参数为字符窜时,是显示最大的长度,参数为浮点数时,是显示小数的最大长度
# 针对字符串时,不需要加f,而针对浮点数时,需要加上f
print('{0:.2f}'.format(3.1415926535))
print('{0:.5}'.format('Hello Python'))# 类型
a = 8
print('二进制:{0:b}'.format(a))
print('八进制:{0:o}'.format(a))
print('十进制:{0:d}'.format(a))
print('十六进制:{0:x}'.format(a))
print('十六进制:{0:X}'.format(a))

运行结果:

字符串的编码与解码 

我们现在所处的时代是互联网时代,通信的方式也是发生了变化。现在的通信主要是网络通信,一台机器上的数据经过一系列的处理变为了二进制数据,然后再通过网卡以二进制的形式传输出去(电信号的高低电平表示1与0、光信号的频率高低表示1与0) ,这些数据经过互联网就被另一台机器的网卡给接收到了,然后开始对二进制数据进行解析,变为最终通信的数据。上述过程就是不同机器的基本通信过程,如果想要详细了解,可以去看下面的文章。初始JavaEE篇 —— 网络编程(1):基础的网络知识-CSDN博客 

在Python中,将字符串的转换为二进制数据的过程就称为编码的过程;反之,将二进制数据转换为字符串的过程就称为解码的过程。

在Python中,编码所使用的方法是 encode,解码所使用的方法是 decode。

语法格式:

# encoding 是指定要编码的方式,默认是utf-8
# errors 是指定编码错误的处理方式,常见的有三种方式:
# 1、strict ——> 遇到编码错误时,直接抛出异常。这也是默认的处理方式
# 2、ignore ——> 直接忽略编码错误的字符,可以认为是直接跳过了这个字符,去处理后面的字符
# 3、replace ——> 用 ? 去代替编码错误的字符str.encode(encoding='utf-8', errors='strict/ignore/replace')bytes.decode(encoding='utf-8', error='strict/ignore/replace')

代码演示:

# 编码过程
s = 'Hello Python'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

上面是对于英文的编码与解码演示,从结果上面来看就是在要传输的基础上加了个前缀b,同样对于数字字符串也是如此,下面我们来看看中文的编码与解码。

代码演示:

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)# 解码过程
s_decode = s_encode.decode() # 也是采用默认的方式
print('解码之后的结果:%s' % s_decode)

运行结果:

从上面的对比,我们可以得出一个结论:对于英文字符与数字在经过UTF-8编码后,是不变的,而大多数汉字字符在经过UTF-8之后,一个汉字字符对应着三个编码后的字符。 这是因为在UTF-8编码中规定的是大多数的中文字符占三个字节,而在传统的gbk编码中,中文是占两个字节的,因此使用不同的编码方式,最终形成的字节数也是不同的。

我们接下来就来看编码与解码的方式不同,会出现什么样的问题。

 当然我们也可以让其直接忽略或者是用?来替换

# 编码过程
s = '伟大的中国梦'
print('原始的数据:%s' % s)
s_encode = s.encode() # 都采用默认的方式
print('编码之后的数据类型:',type(s_encode))
print('编码之后的结果:',s_encode)# 解码过程
# 采用ascii码值的方式去解码,并且对解码错误的处理方式采用忽略。
# 因为全部的编码都会解码失败,因此最终的解码结果就是啥也没有
s_decode = s_encode.decode(encoding = 'ascii',errors='ignore') 
print('解码之后的结果:%s' % s_decode)

运行结果:

下面是使用replace的结果:

与数据验证相关的方法

数据的验证是指程序对用户输入的数据进行“合法”性验证。主要是使用以下八种方法:

数据的验证
方法名说明
isdigit()所有的字符都是数字(只能是阿拉伯数字)
isnumeric()所有的字符都是数字
isalpha()所有的字符都是字母(包含中文字符)
isalnum()所有的字符都是数字或者字母(包含中文字符)
islower()所有的字符都是小写
isupper()所有的字符都是大写
istitle()所有的字符都是首字母大写
isspace()所有的字符都是空白字符(制表符(\t)、换行符(\n)等)

 代码演示:

# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isdigit()) # True
print('一二三'.isdigit()) # False
print('I'.isdigit()) # False
print('壹'.isdigit()) # False
print('b0101'.isdigit()) # Falseprint('-'*20)# 判断所有的字符都是数字
# 下面依次是 阿拉伯数字、中文小写、罗马数字、中文大写、二进制数字
print('123'.isnumeric()) # True
print('一二三'.isnumeric()) # True
print('I'.isnumeric()) # False
print('壹'.isnumeric()) # True
print('b0101'.isnumeric()) # Falseprint('-'*20)# 判断所有的字符都是字母
print('hello你好'.isalpha()) # True
print('hello你好123'.isalpha()) # False
print('hello 你好'.isalpha()) # Falseprint('-'*20)# 判断所有的字符都是数字或者字母
print('hello你好'.isalnum()) # True
print('hello你好123'.isalnum()) # True
print('hello-你好-123'.isalnum()) # False
print('hello 你好'.isalnum()) # Falseprint('-'*20)# 所有的字符都是小写
# 中文既是大写也是小写
print('hello'.islower()) # True
print('hello你好'.islower()) # True
print('Hello'.islower()) # False
print('HELLO'.islower()) # Falseprint('-'*20)# 所有的字符都是大写
# 中文既是大写也是小写
print('hello'.isupper()) # False
print('hello你好'.isupper()) # False
print('Hello'.isupper()) # False
print('HELLO'.isupper()) # Trueprint('-'*20)# 所有的字符都是首字母大写
# 通过 空格 来区分单词
print('Hello'.istitle()) # True
print('HelloWorld'.istitle()) # False
print('Helloworld'.istitle()) # True
print('Hello World'.istitle()) # Trueprint('-'*20)# 所有的字符都是空白字符
print('   '.isspace()) # True
print('\n'.isspace()) # True
print('\t'.isspace()) # True
print('123\t'.isspace()) # False

字符串的拼接 

字符串的拼接是根据数据类型的不同,从而采取不同的方法。例如,当要拼接的数据类型是字符串本身时,完全可以使用 + 的直接拼接方法。

1、使用 str.join() 方法进行拼接字符串

2、直接使用"+"拼接字符串

3、使用格式化字符串进行拼接

代码演示:

s1 = 'hello'
s2 = 'python'# 1、采用 str.join()方法
# 使用字符串的内容去替代参数中的元素之间的分隔符
print(''.join([s1, s2]))
print(''.join((s1, s2)))# 2、直接拼接
print(s1+s2)
# 简单粗暴的方式
print('hello''python')# 3、采用格式化字符串的方式
print(f'{s1}{s2}')
print('{0}{1}'.format(s1, s2))

运行结果:

字符串的去重操作 

当字符串中重复出现多个字符时,如果我们想去除重复的字符,拿到不重复的字符,就可以采用下面的方法。

1、遍历字符串,判断是否在新字符串中,不在则加上这个字符,最终遍历完成之后,得到的就是去重之后的字符串。

2、使用哈希的思想(就是使用集合),来去重。

代码演示:

s = 'hello worldhello worldhello worldhello world'
# 1、遍历+判断:
new_s1 = ''
for char in s:if char not in new_s1:new_s1 += char
print(new_s1)new_s2 = ''
for i in range(len(s)):if s[i] not in new_s2:new_s2 += s[i]
print(new_s2)# 2、哈希思想去重
new_s3 = set(s) # 得到的集合中只剩下不重复的元素了
# 但因为集合是无序的,因此我们按照原来字符串的顺序来排序,需要转化为列表
list_S = list(new_s3)
# 将列表中的字符按照字符串中的索引来进行排序
list_S.sort(key=s.index)
# 最终再转换为字符串类型
print(''.join(list_S))

运行结果:

好啦!本期 初始Python篇(6)—— 字符串 的学习之旅 就到此结束啦!我们下一期再一起学习吧!

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

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

相关文章

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

GEE Landsat 8 可见光影像校正后下载

在遥感影像处理领域&#xff0c;Landsat 8 数据因其 30 米空间分辨率 和 多光谱波段 被广泛应用。处理这些数据时&#xff0c;研究者常常需要对数据进行裁剪、计算指数、图像增强等操作&#xff0c;以满足特定研究需求。 本文将介绍一个 Python 自动化脚本&#xff0c;使用 Goo…

Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型

创建HDL兼容的Simulink模型 一、使用Balnk DUT模板二、从HDL Coder库中选择模块三、为DUT开发算法/功能四、为设计创建Testbench五、仿真验证设计功能六、Simulink模型生成HDL代码 这个例子说明了如何创建一个用于生成HDL代码的Simulink模型。要创建兼容HDL代码生成的MATLAB算法…

如何通过 JWT 来解决登录认证问题

1. 问题引入 在登录功能的实现中 传统思路&#xff1a; 登录页面时把用户名和密码提交给服务器服务器验证用户名和密码&#xff0c;并把检验结果返回给后端如果密码正确&#xff0c;则在服务器端创建 session&#xff0c;通过 cookie 把 session id 返回给浏览器 但是正常情…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

Uniad复现学习

在优云平台部署训练&#xff0c;加速训练。 关于UCloud(优刻得)旗下的compshare算力共享平台 UCloud(优刻得)是中国知名的中立云计算服务商&#xff0c;科创板上市&#xff0c;中国云计算第一股。 UCloud&#xff08;优刻得&#xff09;旗下的Compshare算力共享平台具有以下优点…

域名解析系统 DNS

1.域名系统概述 用户与互联网上某台主机通信时&#xff0c;必须要知道对方的IP地址。然而用户很难记住长达32 位的二进制主机地址。即使是点分十进制地址也并不太容易记忆。但在应用层为了便于用户记忆各种网络应用&#xff0c;连接在互联网上的主机不仅有P地址&#xff0c;而…

【软考网工笔记】网络基础理论——网络层

文章目录 中断处理过程数据包组装RIPRSVPipv4RIPv1 & RIPv2HFC 混合光纤同轴电缆&#xff08;Hybrid Fiber Coax&#xff0c;简称HFC&#xff09;BGP (边界网关协议)BGP-4 协议的四种报文ICMP 协议数字语音电子邮件协议MPLS 多协议标记交换ipv6DHCPDNS名称解析过程查询顺序…

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池&#xff0c;来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况&#xff08;如共享数据库连接或者内存缓冲区&#xff09;下非 常有用。如果goroutine需要从池里得到这些资…

【Delphi】modbus-TCP 协议库

在日常开发中&#xff0c;也会遇到使用modbus的部件&#xff0c;比如温度控制器、读卡器等等&#xff0c;那么使用Delphi开发&#xff0c;也就必须遵守modbus-TCP协议&#xff0c;如果自己使用TCP控件写也没有问题&#xff0c;不过如果有开源的三方库&#xff0c;别人已经调试过…

【Git 操作】-- 将 fork master 分支的最新commit更新到自己的仓库

目录 1.举例 2. 配置上游仓库&#xff08;Upstream&#xff09; 3. 获取上游仓库的更新 4. 切换到你自己的 master 分支 5. 合并上游仓库的 master 分支 6. 解决冲突&#xff08;如果有的话&#xff09; 7. 推送更新到你自己的 GitHub 仓库 1.举例 当我们从 github 的 h…

Facebook的开源项目解析:推动开发者社区的技术进步

Facebook&#xff0c;作为全球领先的社交平台之一&#xff0c;其在技术领域的创新不仅体现在产品功能的实现上&#xff0c;也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分&#xff0c;通过开源&#xff0c;Facebook不仅加速了技术进步&#xff0c;…

荣耀300系列革新发布:科技与美学的里程碑之作

2024年12月2日&#xff0c;全新一代荣耀300系列正式发布&#xff0c;新潮的环球旅拍发布会不仅展现了荣耀追求极致的创新理念&#xff0c;也标志着数字系列迎来科技体验以及美学设计的巨大升级。凭借荣耀领先行业的AI能力以及对底层科技创新的强大驱动&#xff0c;全新荣耀300系…

centos 7 离线安装postgis插件

前一段时间记录了下如何在centos7中离线安装postgresql&#xff0c;因为工作需要&#xff0c;我不仅要安装postgresql&#xff0c;还需要安装postgis插件&#xff0c;这篇文章记录下postgis插件的安装过程。 1. 安装前的参考 如下的链接都是官网上的链接&#xff0c;对你安装p…

ChatGPT/AI辅助网络安全运营之-数据解压缩

在网络安全的世界中&#xff0c;经常会遇到各种压缩的数据&#xff0c;比如zip压缩&#xff0c;比如bzip2压缩&#xff0c;gzip压缩&#xff0c;xz压缩&#xff0c;7z压缩等。网络安全运营中需要对这些不同的压缩数据进行解压缩&#xff0c;解读其本意&#xff0c;本文将探索一…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…

【Linux】文件操作的艺术——从基础到精通

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长&#xff0c;行则将至 目录 &#x1f4da;前言&#xff1a;一切皆文件 &#x1f4da;一、C语言的文件接口 &#x1f4d6;1.文件打…

AI 声音:数字音频、语音识别、TTS 简介与使用示例

在现代 AI 技术的推动下&#xff0c;声音处理领域取得了巨大进展。从语音识别&#xff08;ASR&#xff09;到文本转语音&#xff08;TTS&#xff09;&#xff0c;再到个性化声音克隆&#xff0c;这些技术已经深入到我们的日常生活中&#xff1a;语音助手、自动字幕生成、语音导…

IDEA连接Apifox客户端

IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网&#xff0c;根据自己的操作系统下载对应的Apifox安装包&#xff0c;我是windows系统所以下载的是windows版。 下载 默认仅为我安装&#xff0c;点击下一…

Vue3 脚手架扩展

当 yarn dev 运行成功后&#xff0c;我们继续添加扩展 首先我们要安装一些依赖 其中的vue-router和vuex安装最新版的就行&#xff0c;因为项目是vue3 element-plus和less&#xff0c;less-loader最好按照我这个版本来下载 element-plus是一个vue常用的ui组件库 element-plus/…