python中字符串实现原理_53、2-Python之字符串原理-程序员宅基地

技术标签: python中字符串实现原理  

不开口,没有人知道你想要什么;不去做,任何想法都只在脑海里游泳;不迈出脚步,永远找不到你前进的方向。其实你很强,只是懒惰帮了你倒忙。

字符串处理最重要的库是正则表达式库(re),必须掌握

python链式编程思想:"abc".upper().lower().split().append()

1.Python3 字符串都是Unicode 类型;(UTF-8)

Python2的字符串有两种:str和Unicode;

Python3的字符串也有两种:str和Bytes;

Python2的str相当于Python3的Bytes,而Unicode相当于Python3的Bytes。

Python2里面的str和Unicode是可以混用的,在都是英文字母的时候str和unicode没有区别。

Python3里面的str是在内存中对文本数据进行使用的,Bytes是对二进制数据使用的。

str可以encode为Bytes,但是Bytes不一定可以decode为str。实际上Bytes.decode(‘latin1’)可以称为str,也就是说decode使用的编码决定了decode()的成败,同样的,UTF-8编码的Bytes字符串用GBK去decode()也会出错。

Bytes一般来自网络读取的数据、从二进制文件(图片等)读取的数据、以二进制模式读取的文本文件(.txt, .html, .py, .cpp等)。

总结:

1、python中一切皆对象,字符对象分为两种,一种是unicode对象,一种是str对象。

2、python中字符是unicode为基础的,所以平时我们的字符串,也就是str在python内存中其实是以unicode编码存储的。

3、所以我们平时print一个字符串的时候,看到的是中文,但是如果你把这个字符串放在list里(就是外面加上[ ]),再print,就能看到原生的编码了。因为前面说了,在python内存存储中都是以unicode存储的,所以放在List里面,打印就能看见原生的存储模式。

4、str是字符串对象,但是可以有很多不同的编码,utf-8,gbk,ascii,都是编码。

5、不同编码的str对象,互相不能直接转换,也就是说utf-8编码的不能直接转换成gbk的。

6、但是不同编码的str对象都可以解码成unicode对象,因为一切数据在Python都是以unicode存储的,str.decode(编码类型)

7、unicode对象也可以编码成任意一种编码的str对象。 unicode.encode('编码类型')

8、所以不同编码的str对象可以先解码(decode)成unicode 再编码(encode)成其他编码的str对象。

9、utf-8包含国际上所有字符的编码,GBK主要包含全部中文字符,所以说我们大家爱用utf-8,因为全。

10、所以说utf-8中有一些字符,gbk没有,所以有一些Utf-8解码后再编码成gbk后会报错,因为gbk没有那种字符。

11、有一些str中可能混着有gbk,utf-8等好几种编码,所以有时候decode的时候会报错,因为你按照gbk解码,可能里面又包含了一种不识别的utf-8码得到。

12、以上两条,有没有只编码或者解码对的啊,错误的字符就跳过?

13、有,decode('utf-8','ignore'),encode('utf-8','ignore') 加一个'ignore'参数 就会忽略错误。

14、在python中可以使用chardet.detect(str)来检测一个str是什么编码的:

15、print str 或者 unicode 都会显示出正常的文字,但是python中直接显示 str是'\xe3\xbd'这种字符,unicode是 u'\u4f60' 这种的;

字符串方法

2. 字符串连接 join()方法

str_list = ['Hello', 'world']

str_join1 = ' '.join(str_list)

str_join2 = '-'.join(str_list)

print(str_join1) >>>Hello world

print(str_join2) >>>Hello-world

print("\n".join(lst)) # 字符换行;

lst=['1',['a','b','c'],'3']

print("\n".join(lst)) #lst不能打印,join对象必须为字符串;

map()高阶函数

# map(str,lst) #lst元素全部转换为字符s't'r类型;11转换

内建数据类型可以用str来转;

str对象自带的join()方法,接受一个序列参数,可以实现拼接。拼接时,元素若不是字符串,需要先转换一下。可以看出,这种方法比较适用于连接序列对象中(例如列表)的元素,并设置统一的间隔符。

当拼接长度超过20时,这种方式基本上是首选。不过,它的缺点就是,不适合进行零散片段的、不处于序列集合的元素拼接。

2.1 字符串连接 + / *( lst 加法乘法)

str_1 = 'Hello world! '

str_2 = 'My name is Python猫.'

print(str_1 + str_2)

>>>Hello world! My name is Python猫.

print(str_1)

>>>Hello world!

(两个难点)

1. 新入门编程的同学容易犯错,他们不知道字符串是不可变类型,新的字符串会独占一块新的内存,而原来的字符串保持不变。上例中,拼接前有两段字符串,拼接后实际有三段字符串。

2. 其次,一些有经验的老程序员也容易犯错,他们以为当拼接次数不超过3时,使用+号连接符就会比其它方式快(ps:不少Python教程都是如此建议),但这没有任何合理根据。

事实上,在拼接短的字面值时,由于CPython中的 常数折叠 (constant folding)功能,这些字面值会被转换成更短的形式,例如'a'+'b'+'c' 被转换成'abc','hello'+'world'也会被转换成'hello world'。这种转换是在编译期完成的,而到了运行期时就不会再发生任何拼接操作,因此会加快整体计算的速度。

常数折叠优化有一个限度,它要求拼接结果的长度不超过20。所以,当拼接的最终字符串长度不超过20时,+号操作符的方式,会比后面提到的join等方式快得多,这与+号的使用次数无关。

3.字符串分割 split 与 partition

split系:(一刀多断)

将字符串按照分隔符分割成若干字符串,并返回列表;

partition系:(一刀两断)

将字符串按照分隔符分割成2段,返回这2段和分割符的元组;

3.1 split(sep=None, maxsplit=-1) ->list[] (一刀两断,切多刀)

1.从左到右边;

2.sep 制定分割字符串,缺省的情况下空白字符串作为分割符;(空白与空格的区别)

3.maxsplit 制定分割的次数,-1表示遍历整个字符串;

字符串分割split() 默认把空格整体当作一个分隔符来处理

>>> b'1 2 3'.split()

[b'1', b'2', b'3']

>>> b'1 2 3'.split(maxsplit=1)

[b'1', b'2 3']

>>> b' 1 2 3 '.split()

[b'1', b'2', b'3']

(','.join('abc').split(',')) ['a', 'b', 'c'] #各种方法灵活运用;

"---".join(','.join('abc').split(',')) 'a---b---c' #

1. 字符串分割split() 默认把空白字符整体当作一个分隔符来处理,返回列表;

2. 指定字符,见到字符就分割;

3.2 split、rsplit、splitiness

split()从左向右寻找,以某个元素为中心将左右分割成两个元素并放入列表中

rsplit()从右向左寻找,以某个元素为中心将左右分割成两个元素并放入列表中 #右边right

splitlines()根据换行符(\n)分割并将元素放入列表中,True/False保留分隔符;

'a,b,c,d'.rsplit(',',1)[0]

'ab c\n\nde fg\rkl\r\n123'.splitlines() #\r算一个;\n\n算两个 \r\n算一个;

--------------------------------------------

'a,b,c'

['ab c', '', 'de fg', 'kl', '123']

总结:

1.split与re.split 不是同一个东西;

3.3 partition()方法 与 rpartition ->() (切一刀)

partition() 指定分隔符,切一刀,保留分隔符,返回 元组;

"a,b,c,d".partition(',')

"a,b,c,d".partition('c')

"a,b,c,d".partition(',c,')

"a,b,c,d".rpartition(',')

---------------------------------------------------------

('a', ',', 'b,c,d')

('a,b,', 'c', ',d')

('a,b', ',c,', 'd')

('a,b,c', ',', 'd')

4.字符串大小写

python链式编程思想:"abc".upper().lower().split().append()

append() ->None

split() ->[]

upper() ->str # 返回s中所有字母字符转换为大写的副本

swapcase() ->str #返回一个s中大写字母字符转换为小写,小写字母转化为大写的副本:

title() #返回s的一个副本,其中每个单词的第一个字母转换为大写,其余字母为小写

capitalize() #返回一个s的副本,第一个字符转换为大写,所有其他字符转换为小写

center() #居中宽度,填充字符

zfill() #打印宽度,居右;左边用0填充;

ljust() #左对齐;

rjust() #右对齐;

5. 字符串修改; replace(old,new[,count]) ->str

不可变类型字符串可以修改吗?

不管这个数据可不可以修改,尽量的查询,读取,少修改;

f='www.magedu.com'

f.replace('w','p')

f.replace('w','p',2)

strip 、lstrip 、rstrip(三个内建函数)

lstrip 去除字符串左边的空格;

rstrip 去除字符串右边的空格;

strip 去除字符串左右两边的空格,即把lstrip和rstrip都执行一遍;

' a b b c \td\re\n123\n\n'.strip() | 'a b b c \td\re\n123'

6.字符串查找find / rfind / index / rindex /count

find(sub[.start,end]) ->int

rfind(sub[, start[, end]]) ->int

count(sub[.start,end]) ->int

index(sub[, start[, end]]) ->indexerror

rindex(sub[, start[, end]]) ->indexerror

string6 = '我是一名Python用户,Python给我的工作带来了很多便捷。'

print(string6.index('Python')) | 4

print(string6.find('Python')) |4

index()与find()的比较:

1.index返回没找到会报错indexerror , 异常值处理毕竟有值比较好用(-1);推荐用index方法;

2.时间复杂度:index和count方法都是O(n);随着列表数据规模的增大,效率下降;

7.字符串判断endswith startswith

endswith(suffix[,satrt[,end]]) ->bool

startswith(suffix[,satrt[,end]]) ->bool

字符串判断is系列

list(enumerate(s)) # enumerate函数

[(0, ' '),

(1, 'I'),

(2, ' '),

(3, 'a'),

(4, 'm'),

(5, ' '),

(6, 'v'),

(7, 'e'),

(8, 'r'),

(9, 'y'),

(10, ' '),

(11, ' ')]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39624774/article/details/112899539

智能推荐

Linux中SSH及samba配置_简述使用openssh和samba的服务安装配置过程-程序员宅基地

文章浏览阅读905次。Linux的SSH vim 和Samba的安装_简述使用openssh和samba的服务安装配置过程

支付宝开放平台证书验签生成签名接入方式的操作流程之公钥证书,密钥证书的生成_支付宝生成密钥文件-程序员宅基地

文章浏览阅读371次,点赞6次,收藏11次。证书模式:支付宝根证书、支付宝公钥证书、应用公钥证书、应用私钥,采用RSA2048方式。以上四个文件,上传到网站的自定义的目录,自己知道就行,不要泄露,把名字改成英文数字的。调用支付宝接口的安全验证方式均使用sign_type为RSA2的方式,有两种。使用支付宝开放平台密钥工具,生成相应的文件,如下,生成步骤见官方,密钥模式:应用公钥、应用私钥、平台公钥生成签名和验签方式。我们能用到的即是上面3个,需要放到网站里面去。1->支付宝公钥证书。_支付宝生成密钥文件

glog的交叉编译_glog 交叉编译-程序员宅基地

文章浏览阅读1.7k次。glog版本:google-glog 0.5.0glog源码目录编译cmake复制一份gcc-cxx11.cmake,更名为gcc-cxx11-crosscompiling.cmake将gcc-cxx11-crosscompiling.cmake内容更改为如下所示# Sample toolchain file for building with gcc compiler## Typical usage:# *) cmake -H. -B_build -DCMAK._glog 交叉编译

MemCache超详细解读_memcache作用-程序员宅基地

文章浏览阅读407次。MemCache是什么?MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染_memcache作用

Java图形界面中文字符乱码显示小方框_java graphics 乱码-程序员宅基地

文章浏览阅读4.2k次,点赞7次,收藏19次。Java图形界面中文字符乱码显示小方框解决方法:(IntelliJ IDEA)在运行(RUN)中选择编辑配置(Edit Configuration)虚拟机选项(VM options)中输入-Dfile.encoding=GBK即可解决_java graphics 乱码

python-OpenCV程序打包后无法正常运行的解决方法_python打包后运行异常-程序员宅基地

文章浏览阅读2.3k次。将python下的OpenCV的DLL复制以打包后的目录中,与exe位于同一目录即可。D:\ProgramData\Anaconda3\Lib\site-packages\cv2\opencv_videoio_ffmpeg420_64.dll_python打包后运行异常

随便推点

使用myabtis连接PostgerSQL逆向生成代码_mybatis 逆向功能配置postgresql-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏2次。这里使用的是maven插件的形式生成代码,之前一直使用代码生成一直错误,使用maven还比较简单,这里就介绍一个使用maven插件的形式逆向生成代码。 1.在pom文件中添加插件,如下代码:<build> <finalName>${web-app-name}</finalName> <..._mybatis 逆向功能配置postgresql

kettle提示:ArrayIndexOutOfBoundsException_kettle error inserting/updating row caused by: jav-程序员宅基地

文章浏览阅读3k次。项目场景:例如:项目场景:其他的没有什么问题,回报Caused by: java.lang.ArrayIndexOutOfBoundsException: -32717 的错误问题描述:kettle启动就报错。原因分析:一次数据太多了,装不了。解决方案:将表输出中提交记录数量变小一点算不上是经验的经验:提交的数据一般我都是用一万除以字段数据,再取个差不多的整。..._kettle error inserting/updating row caused by: java.lang.arrayindexoutofboun

iOS开发日记16-通知栏扩展 (App Extension)-程序员宅基地

文章浏览阅读100次。今天博主有一个App Extension的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.总览扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。对于 iOS 来说,可以使用的扩展接入点有以下几个:Today 扩展..._ios通知栏模块

手把手教你安装和激活Fl Studio21.2.3.4004破解补丁(附激活教程)_fl 666 crack 21.1.3.4004-程序员宅基地

文章浏览阅读1.8k次,点赞28次,收藏25次。盼望着盼望着,FL Studio21带这它的版本号2.3.4004来了,是最新版关于FL Studio21.2.3.4004破解激活,跟之前版本一样,这篇文章将给大家带来FL Studio 21.2.3.400彻底激活教程,喜欢的朋友欢迎一键3连~_fl 666 crack 21.1.3.4004

Vue.js的computed用来计算对象中的属性_computed对象下的某一个属性-程序员宅基地

文章浏览阅读2.5w次,点赞7次,收藏7次。最近学习了Vue.jsVue.js官网的computed计算属性文档找到了计算属性computed,于是写了个栗子玩玩,于是就有了下面的这些&amp;amp;amp;amp;amp;amp;amp;lt;!DOCTYPE html&amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;lt;html&amp;amp;amp;amp;amp;amp;amp;gt; &amp;amp;a_computed对象下的某一个属性

计算机二级-C语言-程序填空题-190115记录-fprintf()函数和fscanf()函数的使用。-程序员宅基地

文章浏览阅读1.9k次,点赞9次,收藏16次。//给定程序,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myflie3.txt的文本文件中,然后再顺序读出显示在屏幕上。//重难点:fprintf()函数和fscanf()函数的使用。!feof(fp)用来判断文件没有到达末尾。fscanf(fp,"%d%f",&n,&x);把文件中的数据按一定格式赋值给指定变量。 1 #include <..._给定程序中,函数fun的功能是将自然数1~10以及它们的平方根写到名为myfile3.txt的