当前位置:   article > 正文

python详解(3)--常用的数据结构(字符串)_python中type()、chr()、ord()、format()

python中type()、chr()、ord()、format()

python中的字符串是一个不可变对象,其是字符的线性排列,采用一体式顺序表(参后续数据结构与算法)的形式来实现,在底层应该看成一个序列/一种组合对象而不是单个对象,其很多操作都不是常量时间的,是线性时间操作。

一、字符串的基本操作

字符串是python中最常见的对象(是的,字符串也是对象,python中的任何东西都是对象),是不可变对象(重复),即在python中,字符串一旦创建就不可再更改,新字符串的产生是需要重新开辟内存生成对象的。

字符串的表示方法:python中使用单引号或双引号或三引号来表示字符串,其中:①不区分单引号与双引号,即’abc’与"abc"是等价的;
②在某些特定格式的字符串(如json)中,必须使用双引号表字符串,其与模块要求的格式有关;
③要注意,如果想在字符串中再添加引号,则必须区分,如'a+"b"+c'"a+'b'+c"两者等价,但其使用的引号必须有区别;
④三引号可以将输入的换行、缩进等特殊字符自动转换,再次输出时保持输入的格式,例如:''' a'''存储为'\ta'(’\t’为制表符,即缩进),再次输出时会自动转换,尤其适用于转换HTML文档、SQL语句时;
⑤在字符串前添加r,表示原生字符串,即不将字符串中的特殊符号进行转义,如r'\t',其输出为'\\t',其中\为转义字符。
:字符串的内容其实是固定的,如'\t'其也只是在直接print时才会输出为缩进,因此对于应用而言,三引号字符串保留原本格式,用于函数/类注释、文档字符串等;原生字符串用于字符串的正则匹配,因为其中多处应用到了\,如若不加区分可能会被解释器错误理解;其它场景使用普通字符串即可。

字符串的长度len(str)可以返回字符串的字符长度,默认情况下不区分中英文字符统一按一个字符处理;
str.encode('utf-8')将字符串编码为bytes,此时len()统计其字节数,GBK中中文占两个字节,UTF-8中中文占3个字节。

字符串的切片、分割与合并
①切片操作与列表类似,使用中括号记法(str[a:b:c]切片,a[index]下标访问);
②分割:str.split(a,b),其中a用于指定分隔符(默认为None,即所有空字符,换行符制表符空格等),b用于指定分割的次数(即检索b个空字符,生成b+1个字符串),返回一个由分割后的字符串组成的列表(若不指定分隔符,则多个在一起的空白符会算作一个分隔符,若指定分隔符,则会产生空元素,例如对s = ' a b c'进行分割,s.split()返回['a', 'b', 'c'],而s.split(' ')返回['', 'a', '', 'b', '', '', 'c']);
str.rsplit()与split类似,但从右向左进行检索;
str.splitlines()用换行符分割;
str.partition(a)在str中检索字符串a,返回一个元组,由a前的子串,a,a后的子串组成,若检索到多个a,则以第一个为准,若检索不到a,则返回(str, '', '')
str.rpartition(a)与partition类似,从右向左检索;
str.join(a)其中a是可迭代对象,str代表指定的分隔符,会将a中的所有元素通过str连接合并为一个新的字符串(注意第一个元素前不会添加分隔符)。

字符串的检索与转换
str.count(a,b,c),其中str表示原字符串,a表示要检索的字符串,b表示起始位置索引(默认为0),c表示结束位置索引(默认为-1)返回a在str中出现的次数;
str.find(a,b,c),用法与count类似,但返回值是a在str中出现的第一次的索引号,若不存在,则返回-1(rfind类似,不过从右开始查找,注意返回的索引号不是从右数);
str.index(a,b,c)用法与find类似,但不存在时报错(注意find方法只能用于字符串中,而index可以用于列表等,rindex与rfind类似);
若只是判断a是否在str中,可以使用in进行逻辑判断;
str.startswith(a,b,c)检索原字符串是否以a开头,返回值为布尔值;
endswith方法与startswith类似;
str.lower()将str中的大写字母转换为小写字母;
upper()类似,将小写字母转换为大写字母;
str.title()将str中的所有单词首字母大写,其他小写;
str.capitalize()将str中的首字母大写,其他小写;
str.swapcase()对str中的字符作大小写转换;
str.strip(a)去除字符串str左右两端的字符,其中a为指定要去除的字符(默认去除空格、制表符等空字符,如指定’12’将去除所有的’1’’2 ’ ),lstrip与rstrip与上述类似,分别只操作左端或右端;
str.replace(old,new,n)其中old/new分别为要被替换和用于替换的字符串,n为最大替换次数,返回替换后的字符串;
str.zfill(x)向数值的字符串左侧填充0来补位,x为其总字符数(负号和.也算在内);
str.ljust(a,b)向字符串左端填充b来补足到a位,默认填充空格,rjust类似,向右端补位;
str.center(a,b)与上述类似,但将字符串居中,若为奇数则先补左;
str.isalnum(),如果str至少有一个字符且所有字符都是字母或数字则返回True,否则返回False;
str.isalpha()检测字符,注意中文字符会被isalpha和isalnum检测为true;
str.isnum()检测数字;
str.isspace()检测空白,包括空格、制表符、换行符等;
str.maketrans(a, b)生成一个字典,其以a中的字符序号为key,以b中的字符序号为值;
str.translate(c)使用上述生成的字典,将str中的a字符替换为b字符。

二、字符串的正则表达式

python中字符串的正则依赖于re模块,用于查找复杂规则的字符串,一般将
模式字符串写为原生字符串,模式字符串的书写规则如下表所示(是一个简略版,详细可参网上关于正则的书写规则,其在各种语言中都适用)
在这里插入图片描述
对于上表的补充有:\D \W \S匹配其小写的补集,如\D == [^0-9]

re模块:python中专用于正则表达式匹配的模块,其中常用函数有:
re.match(a,str,c),其中a为模式字符串,c为可选参数表示标志位,若匹配成功,则返回一个match对象,否则返回None(注意match方法从被匹配字符串的开始位置进行匹配);
在这里插入图片描述
match对象match.start()/end/span/string/group等方法,其分别返回匹配值的开始/结束位置和位置元组,要匹配的字符串,匹配的数据;

re.search与match方法的参数类似,但可以匹配字符串的其他位置(当模式字符串中出现^$时有限制),即re.match从str的开始进行匹配,若不匹配则直接返回None,而re.search扫描整个字符串,找到匹配的部分时返回match对象;

re.findall与前两类似,但返回值为包含匹配结构的列表,可能出现[’’]返回值(若模式字符串a中定义()分组,则group方法和findall函数匹配的结果都会包含有分组的内容,group(0)为原始字符串,(1\2…)等为子串;而findall中,除非将模式字符串a全部括在一起即(a),否则无法获得原始字符串,只能获得子串,会将每个分组内能匹配到的值组成一个元组(若只有一个则为字符串),最终返回一个列表,groups方法返回一个由匹配值组成的元组 );

re.sub(a,x,str,d,c),用于替换字符串,其中x代表要用来替换的字符串,(x支持函数,会将匹配到的子串作为参数传入),d表示替换的最大次数(默认为0,替换所有匹配);

re.split(a,str,d,c),其中a表示用于分割的模式字符串(正则),d表示最大的拆分次数,其与普通的字符串分割方法的区分在于,可以使用类似r’[\s\,\;]+’的模式字符串将所有的不规范输入统一匹配并分割,若第一个字符为分隔符,则产生空元素。

贪婪匹配:正则表达式的匹配原则为贪婪匹配,即匹配尽可能多的字符,采用(\d+?),加?的形式可将其改为非贪婪匹配,即尽可能少的匹配。

编译re.compile(a)可返回编译后的正则表达式对象,a.match(str)即可返回match对象,此方法可以提高效率,如需要对一个模式字符串重复利用,则可以将其编译后直接调用其match方法,不使用re.match方法。

三、字符串的格式化

在python中有两种格式化字符串的方法,%记法与str.format()方法,建议使用format方法。

%记法

%[(name)][flags][width].[precision]typecode
  • 1

其适配方法如下表所示。
在这里插入图片描述
在这里插入图片描述
不能使用列表输入,但可以使用元组输入,在实际运用中较少用到上述功能,如需使用,则可查阅官方文档。

format方法

{[index][:[[fill]align]][sign][#][0][width][,][.precision][type]}
  • 1

其适配方法如下表所示。
在这里插入图片描述
:①format方法中允许使用关键字参数(放最后),并允许使用变量,并允许位置参数与其混用(注意若使用位置参数必须全部指定),如图所示;
在这里插入图片描述
②format方法中,允许使用字典的键来取代位置参数,用于匹配相应值,但传入字典时需加**,如图所示;
在这里插入图片描述
③format方法中,允许在()中放置列表、字典等数据类型,若要直接使用则需加*,若指定了位置拥有返回值,则不用加*可直接传入,如图。
在这里插入图片描述
④实际运用中,可能最常用到的方式为(最基本,忽略所有参数):

'{} aa {} vv'.format(11, 22)
  • 1

四、python中一些与赋值、输出、变量相关的细节与操作

此部分内容是实际运用总结,知识点较零碎,没有条理,牵涉到一部分后续函数的内容。

1、type()可返回变量的类型;eval()识别字符串中的python表达式,并返回一个对象,如图所示。
在这里插入图片描述
在这里插入图片描述
2、id()可返回变量的内存地址,此处返回的是变量引用的对象的内存地址,变量只是一个符号/名字,其用于指向存储于内存中的对象。

3、repr()将字符串转化为供解释器读取的形式,对python解释器更友好,一般情况下,obj == eval(repr(obj))是成立的。

4、ord()返回单个字符的Unicode码;chr()返回整数对应的Unicode码中的字符,使用十六进制和十进制均可。

5、encode()将字符串编码为bytes,str.encode(encoding='',errors=''),当忽略errors时省略;decode()将bytes解码为字符串,errors可以有多种模式,默认为strict(遇见非法字符就抛出异常)。
在这里插入图片描述
将Unicode码(整数)编码为UTF-8的方式如图所示,将二进制整数码从右向左填。
在这里插入图片描述

6、input()返回的结果一定是str,若需换行输入,则可input('1111\n');若无需输入值,按下回车即可进行下一步,可使用条件判断if input('') == '',即若输入内容为空则继续执行后续语句。

7、print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False),print函数在python中是最常用的函数之一,其有五个参数:
objects:要输出的内容,各个变量之间用逗号隔开;
sep:表示各个输出字符串之间的间隔字符,默认为空格;
end:表示字符串打印结束后的添加的结束字符串,默认是换行;
file:表示打印到标准输出,还是文件中,默认是标准输出;
flush:表示是否实时将数据写入file,flash表示只有打印结束的时侯才真正写入到文件,true表示实时写入,默认是flash。
:python中的函数调用与赋值,先计算内层函数,如print(len(str))则会先计算len(str),再对其进行输出,a = len(str1) + sum(list)类似。

8、in 可以判断某元素是否在序列中,并返回一个布尔值;
is 可以判断两者是否相同,并返回布尔值。

9、只有相同类型的元素可以直接使用算术运算符相加,如(列表+列表)等;
列表、元组、字符串、数值等可以使用*进行重复,运算结果不改变原对象,生成一个新的对象,'ab'*3 == 'ababab'

10、map(f,list)接收一个函数 f(不加()) 和一个 list,并通过把函数 f 依次作用在list 的每个元素上,得到一个新的map对象并返回。

11、①在赋值时,a,b,c=name,此时是将a,b,c分别用可迭代对象中的对应值赋值,且必须一一对应否则报错;
②注意在同时对多个变量进行赋值时,a, b = b, a+b本质上是a,b=(b,a+b),其与a = b,b = a+b的区别在于元组的值是不会变化的,在赋值前就确定了要赋值的数,而后者相当于b=2b,与原期望相悖,使用此种赋值方式减少了临时变量符号的使用,但在内存中依然开辟了内存用于存储临时变量。

12、在迭代时,有for (a,b) in [(1,2),(3,4),(5,6)]的用法,其本质上相当于遍历字典,将元素组合后分别赋值,并可以单独使用a,b来操作。

13、①python中,在一个模块/类中不允许出现相同的变量名,否则后面的会覆盖前面的,不论是函数/类/变量等,此问题在后续分析局部变量与全局变量时会有详解;
②注意如果.py文件名是某一个Python自带类名,则可能不能运行,可能会被python解释器认为是导入此类,如:abc.py,python中。

14、ipython中会将所有的输入和输出保存,其对应于globals()字典中的IN和OUT vaule,并会存储在自带的sqlite数据库中。

15、在python中,中括号记法(列表元组字符串等)表范围超出限制时并不会报错,如a = [1,2,3,4],a[3:6] == [4],但a[6]报错。

16、将字符串倒排可以使用str[::-1],将列表倒排有专用的reverse函数,省去了新的变量和建立列表的代码,但临时空间还是需要占用。

17、如a = [1,2,2,2,2], for i in range(a):若在下方循环体中出现a[i+1],则会直接报出out of range异常,可以通过i < range(a) and a[i+1]来对最后一位进行排除,因为在python中,逻辑与判断从左至右进行,若i<range(a)不满足条件,则不会对a[i+1]进行取值。

18、通过min(list, key=len)可以查找到列表中最短的元素并返回,max函数类似,其都有一个key作为默认参数,可用于传入函数。

19、int('s', 2)可以方便的将字符串类型的其他进制的数转换成10进制的整数,bin()/oct()/hex()可以将十进制整数转换为2/8/16进制数(返回的是字符串类型,并分别有前缀'0b', '0o', '0x')。

20、①python的默认变量名'_'可以让解释器忽略这个信息,{w: k for k, _, w in f()},其中f返回[(a, a, a), (b, b, b)…]由每3个值组合成的迭代/生成器,可忽略中间变量,赋给'_'变量符的值被直接丢弃,无法使用和命名;
②当解压可迭代对象赋值给多个变量时,注意*与_的使用,例如统计评委打分,需要去掉第一个和最后一个,可以使用a, *b, c = list,其中b解压出来为一个列表;
③所有的递归都可以转换成函数内循环(可能需要栈等容器保存缓存数据),在解题时可以多一种思路,在普通方法无解时多思考关于递归。


总结:以上即为python中常用的数据结构的简单用法,以及一些与输出和赋值相关联的简单知识点,需要重点掌握,更高级的用法可查阅python文档。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/169130
推荐阅读
相关标签
  

闽ICP备14008679号