(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
简介: 字符编码我们要清楚,计算机最开始的表达都是由二进制而来我们要想通过二进制来表示我们熟知的字符看看以下的变化例如: 1 的二进制编码为 0000 0001我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65)现在拿A举例:在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码也意味着A字符在底层表示为 1000001通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求

字符编码

我们要清楚,计算机最开始的表达都是由二进制而来

我们要想通过二进制来表示我们熟知的字符看看以下的变化
例如: 1 的二进制编码为 0000 0001

我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65)
现在拿A举例:
在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码
也意味着A字符在底层表示为 1000001

通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。

但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求

所以拥有更加庞大字符的 Unicode字符集诞生。Unicode把所有语言都统一到一套编码里,如今现代操作系统和大多数编程语言都直接支持Unicode。

Unicode通过将字符分隔表示,通过多位数字表示为一个字符。

UTF-8 在Unicode基础上增加了多个二进制位涵盖了更多的字符

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
01001110 00101101 11100100 10111000 10101101

Python中的字符串

在Python3版本中,字符串都是以Unicode编码的(支持多语言)

对于==单个字符串==的编码,Python提供了ord()函数,该函数用于获取字符的整数表示

  • chr() 函数把编码转换为对应的字符
a1 = "a"
print(ord(a1)) # 97
a2 = "99"
print(chr(int(a2))) # c

如果知道字符的整数编码,还可以用十六进制这么写str

a3 = '\u4e2d\u6587'
print(a3) # '中文'

通过编码表示字符,本身写法就是等价的。

由于Python字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。

当在网络中获取文件流中传输,需要将字符转为单位字节bytes

这与java、go语言一致,本身字符串不能在复杂场景下直接传递,需要转为字节码传输

在Python中,bytes 字节,通过b前缀的单引号或双引号显示

a3 = b"Hello"
print(a3) # b'Hello'

虽然不加前缀 bb'Hello'的表示一样,但是bytes的每个字符都只占用一个字节


以Unicode表示的str通过encode()方法可以编码为指定的bytes

a4 = "测试".encode("utf-8") # 编码
print(a4)
a5 = "test测试".encode("ASCII") # 解码
print(a5)

b'\xe6\xb5\x8b\xe8\xaf\x95'

Traceback (most recent call last):
File "E:\Python\Python基础\dataType.py", line 62, in
a5 = "test测试".encode("ASCII") # 解码

  ~~~~~~~~~~~~~~~~~^^^^^^^^^

UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-5: ordinal not in range(128)

报错了?这是因为ASCII编码的内容区间无法表示中文字符,这就保持了 ordinal not in range(128) 这个错误

bytes中,无法显示为ASCII字符的字节,用\x##显示。

如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

c1 = b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
print(c1) # '中'

要计算 str 包含多少个字符,可以用len()函数

c2 = len("ABC")
print(c2) # 3

字符串格式化

在正式开发中,我们需要学会如何格式化字符串

即:用变量代替字符串输出(动态文本)

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

a6 = "Hello %s" % "World" # %s 字符串
print(a6) # Hello World
a7 = "Hello %d" % 123 # %d 整数
print(a7) # Hello 123
a8 = "Hello %f" % 123.123 # %f 浮点数
print(a8) # Hello 123.123000
a9 = "Hello %e" % 123.123 # %e 科学计数法
print(a9) # Hello 1.231230e+02

a10 = "hello %s,my name is %s" % ("xiaowang","zhangsan") # %s 字符串
print(a10) # hello xiaowang,my name is zhangsan

%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%表示用整数替换,有多少个%?占位符,在后面的()中,就跟着多少个变量(值)。

  • ()中的值顺序是与占位符的位置一一对应的。
  • 若只有一个占位符,()括号可以省略

而在Python中,如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串

a11 = "hello %s,this is %s" % ("xiaowang",True)
print(a11) # hello xiaowang,this is True

f-string

格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换:

a12 = 2.44123123123
a13 = 1.5 * a12 ** 2
a14 = f'The number is {a12} and the result is {a13:.2f}' # f-string
print(a14) # The number is 2.44123123123 and the result is 8.94

上述代码中,{r}被变量r的值替换,{s:.2f}被变量s的值替换,并且:后面的.2f指定了格式化参数(即保留两位小数),因此,{s:.2f}的替换结果是19.62

拓展:

  • %.xf{变量:.xf} 其中 x代表任意整数

    这两种写法其作用是为 %变量 裁切小数,具体保留位数是x规定

  • 在Python中 * 代表乘法;** 代表次方(幂运算);

    2 ** 2 这行代码所表示的就是 4 也就是2的2次方

list 集合

Python内置的数据类型:list 列表。

list是一种有序的集合,可以随时添加和删除其中的元素

设一个班级中存在有zhangsan、lisi、wangwu三名学生,这时就可以通过list集合进行存储

classA = ["zhangsan","lisi","wangwu"] # 列表
print(classA) # ['zhangsan', 'lisi', 'wangwu']
print(classA[0]) # zhangsan
print(classA[1]) # lisi
print(classA[2]) # wangwu
print(classA[-1]) # wangwu
print(classA[-2]) # lisi
print(len(classA)) # 3
  • 通过len()函数可以获取list元素的个数

当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1

如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

classA[-1] # wangwu

你可以理解为正数获取元素就是从头开始获取

负数获取元素就是从最后开始倒叙依次获取

print(classA[-1]) # wangwu
print(classA[-2]) # lisi
print(classA[-3]) # zhangsan
classA[-4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

list操作

  • append(T)

该函数可以为list集合在末尾追加一个元素

arr = [1,2,3,576,1,23,6,8,1]
arr.append("元素A") # 添加元素
print(arr) # [1, 2, 3, 576, 1, 23, 6, 8, 1, '元素A']

在Python中不用担心类型转换问题,包括集合内部也是一样的

例如示例中明显是一个整数集合,但是依旧可以添加字符串

这样操作在Java、Go语言中是不可以的。

  • insert(number,T)

向list集合的指定索引处,添加一个元素

arr.insert(2,"元素B") # 插入元素
print(arr) # [1, 2, '元素B', 3, 576, 1, 23, 6, 8, 1, '元素A']
  • pop() 或 pop(number)

该方法若不指定索引位置,则默认删除集合的最后一个元素

而传入值后,则删除指定索引处的值

arr.pop() # 删除最后一个元素
print(arr) # [1, 2, '元素B', 3, 576, 1, 23, 6, 8, 1]
arr.pop(2) # 删除指定位置的元素
print(arr) # [1, 2, 3, 576, 1, 23, 6, 8, 1]

删除指定索引处的值,除了pop(number) 方法,还可以使用remove(number)方法

arr.remove(1) # 删除指定元素
print(arr) # [2, 3, 576, 23, 6, 8, 1]

remove()方法,它计算的索引是从1开始

  • 集合[number]集合[number:number]

这种集合的表示方式,还可以对索引对应的值进行更改

arr[5] = "替换元素" # 替换元素
print(arr) # [2, 3, 576, 23, 6, '替换元素', 1]

arr[1:3] = ["元素C","元素D"] # 替换元素
print(arr) # [2, '元素C', '元素D', 576, 23, '替换元素', 1]

arr[4:7] = ["元素E","元素F","元素G"] # 替换元素
print(arr) # [2, '元素C', '元素D', 576, '元素E', '元素F', '元素G', 1

arr[4:9] = ["元素E","元素F","元素G"] # 替换元素
print(arr) # [2, '元素C', '元素D', 1, '元素E', '元素F', '元素G']

需要注意第二种写法,当存在[number:number]之间的间隔存在多少个元素,而替换的值又不满足这么多的元素时,剩余元素会被清除掉。

  • sort()

当数组内全部都是数值时,可以使用该方法进行排序

arr2 = [1,2,55,122,7,34,97,976,234,123,2342]
arr.sort() # 排序
print(arr2) # [1, 2, 7, 34, 55, 97, 122, 234, 976, 123, 2342]
  • clear()

该方法可以清空数组内的全部元素

arr.clear() # 清空列表
print(arr) # []

tuple 元组

另一种列表叫做元组:tuple

tuple和list是相似的。但是 tuple一旦初始化就不能修改了

你可以正常的读取元组中的值,但是不能将它赋值成另外的元素

classA = ("zhangsan","lisi","wangwu") # 元组
print(classA) # ('zhangsan', 'lisi', 'wangwu')  # 元组不能修改
classA[0] = "xiaowang" # 元组不能修改

## 打印
('zhangsan', 'lisi', 'wangwu')
Traceback (most recent call last):
  File "E:\Python\Python基础\dataType.py", line 128, in <module>
    classA[0] = "xiaowang" # 元组不能修改
    ~~~~~~^^^
TypeError: 'tuple' object does not support item assignment

若进行修改,则会报错。


因为tuple不可变的特性,所以代码更加安全,能用tuple就尽量使用tuple

当我们需要保存一个元素的tuple元组时,我们需要这样声明

t = (1,)

为什么要加,号?因为在Python原本的语法中()是表示数学公式中的小括号,亦或者表示限定作用域范围。这就会产生歧义。我们需要添加一个,号来标明这个()内部是一个tuple。


虽然元组不可变,但是元组内部存储的数组是可变的,它没有深绑定行为。在内存地址方面来说,元组存储的数组是指向的另一个内存地址,这个地址不受到Python的绑定

arr3 = (1,2,5,22,['元素A','元素B']) # 元组可以包含列表
print(arr3) # (1, 2, 5, 22, ['元素A', '元素B'])
arr3[4][0] = "元素C" # 元组可以包含列表,列表可以修改
print(arr3) # (1, 2, 5, 22, ['元素C', '元素B'])

元组可更改.png

😎🙌Python专栏前篇回顾~~

目录
相关文章
|
2月前
|
存储 JSON 算法
Python集合:高效处理无序唯一数据的利器
Python集合是一种高效的数据结构,具备自动去重、快速成员检测和无序性等特点,适用于数据去重、集合运算和性能优化等场景。本文通过实例详解其用法与技巧。
116 0
|
3月前
|
存储 索引 Python
python 集合的所有基础知识
python 集合的所有基础知识
161 0
|
2月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
257 2
|
5月前
|
存储 Java C语言
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
488 1
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1314 1
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
373 1
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
270 3
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
1067 3
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估

热门文章

最新文章

推荐镜像

更多