Python入门教程+项目实战-9.1节: 字符串的定义与编码

news2024/11/18 1:48:14

目录

9.1.1 理解字符串

9.1.2 字符串的类型名

9.1.3 字符的数字编码

9.1.4 常用的字符编码

9.1.5 字符串的默认编码

9.1.6 字符串的编码与解码

9.1.7 转义字符详解

9.1.8 对字符串进行遍历

9.1.9 知识要点

9.1.10 系统学习python


9.1.1 理解字符串

理解字符串,不仅要知道它是什么,还要知道它底层的数据结构。

那么,什么是字符串?

在Python中使用英文引号括住的都是字符串,以下的都为字符串:

Python

# 英文中的引号为单引号,双引号,三引号
chinese = "我爱你"
english = 'I Love You'
japanese = '''君のことを愛している'''
russian = """я люблю тебя"""

字符串是一种线性的序列结构。理解这种数据结构,先直接看图:

上图表示的是字符串"我一直深爱着你",从图中可以看出,字符与字符之间是直线的关系,字符是按序进行排列的,所有的字符空间对应着一块连续的内存,这种结构就叫做线性的序列结构。图中的每一个格子表示一个内存块,内存块里存储了字符的数字编码。

对于这种线性的序列结构,可以通过索引访问数据集合中的每一个元素。在Python中,索引从0开始编号。例如编号0对应的是字符'我',编号1对应的是字符'一',以此类推。

感兴趣的同学可以系统地学习数据结构这门课程。成为一名卓越的程序员,必须掌握数据结构这门知识。薯条老师在后面的教程中会推出数据结构的系列课。

9.1.2 字符串的类型名

在交互模式中通过type来输出字符串的类型名:

>>> chinese = "我爱你"
>>> english = 'I Love You'
>>> japanese = '''君のことを愛している'''
>>> russian = """я люблю тебя"""
 
>>> type(chinese)
<class 'str'>
>>> type(english)
<class 'str'>
>>> type(japanese)
<class 'str'>
>>> type(russian)
<class 'str'>

从输出可知,字符串的类型名为str。

9.1.3 字符的数字编码

在第三章中已经介绍过,计算机只能处理二进制,为了让计算机能对字符进行处理,需要对字符进行编码。所谓的编码,是指用数字来对字符进行表示。不同的表示方法,对应不同的字符编码。

通过Python中的内置函数ord,可以获取字符的十进制数字码。使用ord函数的基本语法:

ord(character)

参数character表示特定的字符,返回值为字符的十进制数字编码。进入交互模式中进行验证:

>>> ord('爱')
29233

通过Python中的内置函数chr,可以获取数字编码所对应的字符。使用chr函数的基本语法:

chr(code)

参数code表示字符的数字编码,返回值为数字编码所对的字符。 进入交互模式中进行验证:

>>> chr(29233)
'爱'

9.1.4 常用的字符编码

最早的字符编码为ASCII编码,这种编码使用一个字节来表示一个字符。一个字节能表示的范围是0-255,也就是说,这种编码最多只能表示256个字符。ASCII编码无法表示汉字等其它字符,为了满足其它地区的需要,又出现了多字节编码。

我们中国一开始制定的是GBK编码,使用两个字节来表示常用的汉字,其它地区也纷纷制定了不同的编码,用来表示本国的字符集。
为了对各地区的编码进行规范统一,出现了UNICODE编码,UNICODE编码在制定之初统一使用两个字节来表示一个字符。

(1) ASCII

ASCII码,全称为美国信息交换标准码,一种使用7个或8个二进制位进行字符编码的方案,最多可以包含256个字符。基本的 ASCII 字符集一共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。下图为ASCII字符的码表:

(2)UNICODE

在UNICODE编码中,为每种语言中的每个字符设定了统一并且唯一的二进制编码, 这个编号范围从 0x000000 到 0x10FFFF,每个字符对应一个唯一的UNICODE数字码,UNICODE编码的形式为:在数字码(十六进制)前面加上U+。例如:"爱"的UNICODE是U+7231。

(3) UTF-8

UTF-8,是一种针对UNICODE的可变长度字符编码, 不同于UNICODE编码采用固定长度的字节数来表示字符, UTF-8使用的字节数是可变的,比如ASCII字符,在UTF-8编码中仍使用一个字节来进行编码,对于汉字等字符使用的是3个字节来进行编码。

(4) GBK

GBK编码是汉字编码字符集,采用的是单双字节变长编码,英文字符使用单字节编码,完全兼容ASCII码,中文部分采用双字节编码。

9.1.5 字符串的默认编码

Python中的字符串默认采用UNICODE进行编码,也就是说,Python中的字符串是UNICODE字符串。

9.1.6 字符串的编码与解码

通过字符串类型的encode方法,可以获取字符串以特定编码方式编码后的字节码类型。

使用encode方法的基本语法:

str.encode(encoding)

参数encoding表示字符的编码方法, 返回值为bytes类型。通过字节码类型的decode方法,可以将字节码类型转换为UNICODE字符串。

使用decode函数的基本语法:

bytes.decode(encoding)

参数encoding表示字符的编码方法,返回值为str类型。

代码实例-对字符串进行编码与解码

Python

# 1.对汉字字符进行编码与解码
chinese = "我爱你"
gbk_code = chinese.encode('gbk')
chinese = gbk_code.decode('gbk')
 
# 2.对英文字符进行编码与解码
english = 'I Love You'
ascii_code = english.encode('ascii')
english = ascii_code.decode('ascii')
# 3.对日本字符进行编码与解码
japanese = '''君のことを愛している'''
unicode = japanese.encode('unicode-escape')
japanese = unicode.decode('unicode-escape')
# 4.对俄文字符进行编码与解码
russian = """я люблю тебя"""
utf8_code = russian.encode('utf-8')
russian = utf8_code.decode('utf-8')

代码讲解:

(1)传递参数'gbk',获取gbk编码的字节码类型
(2)传递参数'ascii',获取ascii编码的字节码类型
(3)传递参数'unicode-escape',获取unicode编码的字节码类型
(4)传递参数'utf-8',获取utf-8编码的字节码类型

使用bytes类型的decode进行解码时,编码方式必须兼容,否则会抛出编码错误的异常信息。

可以在交互模式中进行验证:

>>> gbk_code = chinese.encode('gbk')
>>> gbk_code.decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: 
ordinal not in range(128)

在交互模式中,传递gbk获取gbk编码的字节码类型,但在解码时传递的参数是ascii。ascii编码与gbk编码不兼容,故抛出了异常信息。

9.1.7 转义字符详解

编程语言中的转义字符是反斜杠符号'\'+字符构成的特殊字符,通常使用转义字符来表示字符集中定义的字符,如ASCll字符集里面的换行符。

下表是常用的转义字符:

使用转义字符可以避免产生歧义,比如通过转义字符\"来表示一个包含引号的字符串:

"\""

如果没有转义字符,那么系统无法识别用户究竟定义的是一个包含引号的字符串,还是一个三引号。

也可以通过引号括住其它形式的引号来表示包含引号的字符串,例如在单引号中包含双引号:'"',在双引号中包含单引号:"''"。

使用转义字符,还可以实现一些有用的特性。

(1) 使用换行符输出多行

>>>chinese = "我\n爱\n你\n"
>>>print(chinese)
我
爱
你

(2) 输出水平制表符

>>> chinese = "我\t爱\t你\t"
>>> print(chinese)
我 爱 你

在特定的应用场景下,需要禁止字对符进行转义,通过在字符串前加上r前缀,可以实现这样的功能。

>>> chinese = r"我\t爱\t你\t"
>>> print(chinese)
我\t爱\t你

字符串中包含路径时,禁止Python对其进行转义会非常有用:

>>> file_path = "D:\nosql\data"
>>> print(file_path)
D:
osql\data

输出明显是有问题的,Python将字符串中的\n字符解释成了转义字符,此时可以在字符串中加上r前缀,来禁止Python对字符进行转义。

>>> file_path = r"D:\nosql\data"
>>> print(file_path)
D:\nosql\data

9.1.8 对字符串进行遍历

字符串是一种线性的序列结构,可以通过for循环对字符串中的所有字符进行遍历。

代码实例-逐一遍历字符串中的字符:

Python

japanese = '''君のことを愛している'''
for _ in japanese:
    print(_)

代码讲解:

(1) 对字符串进行遍历,是按字符的先后排列顺序进行遍历的
(2) 通过分析程序的输出,可以更好地理解字符串这种线性的序列结构。

9.1.9 知识要点

(1) 在Python中用英文引号括住的都为字符串
(2) 字符串是一种线性的序列结构 
(3) 字符串的类型名是str
(4) 所谓的编码,是指用数字来对字符进行表示。不同的表示方法,对应不同的字符集。
(5) 常用的字符集有ascii字符集,unicode字符集,utf-8字符集,gbk字符集
(6) Python中的字符串默认为UNICODE字符串

9.1.10 系统学习python

 薯条老师简介:资深技术专家,技术作家,著有《Python零基础入门指南》,《Java零基础入门指南》等技术教程。薯条老师的博客:http://www.chipscoco.com, 系统学习后端,爬虫,数据分析,机器学习、量化投资。

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

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

相关文章

005:Mapbox GL添加全屏显示功能

第005个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加全屏显示功能 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://…

还在因为写项目函数太多而烦恼?C++模板一文带你解决难题

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

轮廓查找与绘制

轮廓查找与绘制 1)什么是轮廓 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度&#xff0c;提取轮廓就是提取 这些具有相同颜色或者灰度的曲线&#xff0c;或者说是连通域&#xff0c;轮廓在形状分析和物体…

学习系统编程No.20【进程间通信之命名管道】

引言&#xff1a; 北京时间&#xff1a;2023/4/15/10:34&#xff0c;今天起床时间9:25&#xff0c;睡了快8小时&#xff0c;昨天刷视屏刷了一个小时&#xff0c;本来12点的时候发完博客洗把脸就要睡了&#xff0c;可惜&#xff0c;看到了一个标题&#xff0c;说实话&#xff0…

.Net路由操作!!!!

什么是路由 问题 答案 路由是什么&#xff1f; 路由系统负责处理传入的请求并选择控制器和操作方法来处理它们。 路由系统还用于在视图中生成路由&#xff0c;称为传出的URL 路由有什么用&#xff1f; 路由系统能够灵活地处理请求&#xff0c;面不是将URL与Visual Studio…

MySQL(31)-ubuntu20.04-下安装mysql5.7

ubuntu20.04 下apt 默认安装的是8.0版本&#xff0c;如果要安装5.7版有如下3种方式&#xff1a; 1 下载 MySQL 二进制压缩包&#xff0c;解压并设置相关的参数即可运行 2 通过命令 apt install 进行安装&#xff0c;先下载 MySQL 5.7 对应的源&#xff0c;然后执行安装命令 ap…

5 分钟带你小程序入门 [实战总结分享]

微信小程序常常用 4 种文件类型 JS 文件 JS 在小程序中用于编写页面逻辑和交互效果&#xff0c;可调用 API 接口完成数据请求和处理&#xff0c;也可以使用第三方库和框架。 模块化编程&#xff1a;小程序中JS文件可以使用ES6的模块化语法&#xff0c;通过export和import来…

【vue3】关于watch与computed的用法看这个就ok

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;watch()与computed的使用【vue2中watch|computed概念详解】&#xff0c;本文将介绍在vue3中怎么使用这两者技能 【前言】vue2当中有这两个技能&#xff0c;那么vue3中的watch与compute…

【云原生进阶之容器】第六章容器网络6.4.1--Flannel组网方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述

【Unity】用HDRI作为Unity的Skybox

教程&#xff1a;用HDRI作为Unity的Skybox 在Unity中&#xff0c;Skybox是用于创建环境背景的一种组件。使用高动态范围图像&#xff08;HDRI&#xff09;作为Skybox可以提供更真实的环境背景。以下是使用HDRI作为Unity Skybox的步骤&#xff1a; 步骤1&#xff1a;下载HDRI图…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…

华为MatePad有什么好用的软件?

现如今伴随着办公方式的转变&#xff0c;人们正迫切地寻找能够顺应时代的“生产力新工具”&#xff0c;它既要能够满足线上/线下灵活切换&#xff0c;又要具备绘画、键入、远程沟通、跨终端联动等多种功能。 对大多数人来说&#xff0c;日常使用华为平板只是满足一下娱乐和生活…

【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

超详细从入门到精通,pytest自动化测试框架实战-fixture固件高级操作(十一)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 参数化fixture fix…

深度学习随笔

一、SPP的作用 解决了训练CNN需要输入图像尺寸一致的问题。 一个CNN可看作由卷积、池化、全连接层组成&#xff0c;由于全连接层的权重矩阵是一个固定值&#xff0c;因此输入全连接层的特征图的维度也必须固定。 SPP利用多尺度思想解决了上述问题&#xff0c;使得神经网络的训练…

2023/4/16总结

深刻的了解了网络编程的一些知识点 socket:套接字 ServerSocket 用来声明服务器 Socket用来声明客户端&#xff0c;其实也不然&#xff0c;在serversocket的accept的方法中&#xff0c;返回的是一个socket变量。我觉得更像一个接口&#xff0c;网络接口。 InternetAddress可以…

PaddlePaddle NLP学习笔记1 词向量

文章目录1.语言模型 Language Model1.1 语言模型是什么1.2 语言模型计算什么1.3 n-gram Language Model2.神经网络语言模型NNLM2.1 N-gram模型的问题3. 词向量3.1 词向量(word Embedding)word2vec 词向量训练算法3.2 如何把词转换为词向量&#xff1f;3.3如何让向量具有语义信息…

Windows 下部署Redis 主从模式+哨兵模式+JAVA连接方式

前言 之前项目需求部署redis高可用&#xff0c;走了很多弯路以及相关配置来回折腾浪费了很多时间&#xff0c;特地记录下。 主从模式&#xff1a;实现多台redis实例进行服务运行&#xff0c;并且数据相互同步&#xff1b; 哨兵模式&#xff1a;实现主服务器和从服务器进行监听…

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用 AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口&#xff0c;可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能&#xff0c;向 CAN 控制…

Spark编程基础-RDD

目录 1.何为RDD 2.RDD的五大特性 3.RDD常用算子 3.1.Transformation算子 1.map() 2.flatMap() 3.reduceByKey() 4 . mapValues() 5. groupBy() 6.filter() 7.distinct() 8.union() 9.join() 10.intersection() 11.glom() 12.gruopBykey() 13.sortBy() 14.sortByKey …