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

本文涉及的产品
轻量应用服务器 2vCPU 4GiB,适用于搭建Web应用/小程序
轻量应用服务器 2vCPU 4GiB,适用于网站搭建
轻量应用服务器 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专栏前篇回顾~~

目录
相关文章
|
1月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
286 1
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
150 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
229 1
|
Python
Python元组tuple“删除”元素的两种函数代码设计
实际上,Python的tuple元组内的元素是不能被修改的,因此也是无法被删除的,但是,为了移除Python元组tuple内的某些元素,以获得一个新的元组,还是有其办法存在的。比如,我们可以使用for循环添加的方法,来创建一个不包含那些需要被移除的元素的新元组。Python中元组添加元素的内置方法为__add__()方法,实际上,该方法也是
180 4
|
存储 索引 Python
元组(Tuple)在Python编程中的应用与实例
元组(Tuple)在Python编程中的应用与实例
637 2
|
存储 缓存 Python
Python中的列表(List)和元组(Tuple)是两种重要的数据结构
【7月更文挑战第12天】Python中的列表(List)和元组(Tuple)是两种重要的数据结构
339 1
|
存储 Python
Python中list, tuple, dict,set的区别和使用场景
Python中list, tuple, dict,set的区别和使用场景
1009 2
|
存储 索引 Python
Python教程:深入了解 Python 中 Dict、List、Tuple、Set 的高级用法
Python 中的 Dict(字典)、List(列表)、Tuple(元组)和 Set(集合)是常用的数据结构,它们各自有着不同的特性和用途。在本文中,我们将深入了解这些数据结构的高级用法,并提供详细的说明和代码示例。
987 2
【Python 基础】列表(list)和元组(tuple)有什么区别?
【5月更文挑战第6天】【Python 基础】列表(list)和元组(tuple)有什么区别?
|
存储 安全 编译器
Python学习日记(一:List、Tuple、dictionary)
1.列表、元组和字典都是序列 2.列表字典可以修改和删除序列中的某个元素,而元组就是一个整体,不能修改和删除,一定要修改或删除的话,只能修改和删除整个元组。 3.既然元组不能删除和修改,有什么作用呢? 1.元组比列表遍历速度快,因为元组是一个整体,运算效率高; 2.正是因为不能修改,元组可以保护不需要修改的数据,可以使代码结构更安全。
154 0

热门文章

最新文章

推荐镜像

更多