python详解(3)--常⽤的数据结构(字符串)
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[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.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.zfill(x)向数值的字符串左侧填充0来补位,x为其总字符数(负号和.也算在内);
str.ljust(a,b)向字符串左端填充b来补⾜到a位,默认填充空格,rjust类似,向右端补位;
<(a,b)与上述类似,但将字符串居中,若为奇数则先补左;
str.isalnum(),如果str⾄少有⼀个字符且所有字符都是字母或数字则返回True,否则返回False;
str.isalpha()检测字符,注意中⽂字符会被isalpha和isalnum检测为true;
str.isnum()检测数字;
str.isspace()检测空⽩,包括空格、制表符、换⾏符等;
str.maketrans(a, b)⽣成⼀个字典,其以a中的字符序号为key,以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+?),加?的形式可将其改为⾮贪婪匹配,即尽可能少的匹配。
编译:repile(a)可返回编译后的正则表达式对象,a.match(str)即可返回match对象,此⽅法可以提⾼效率,如需要对⼀个模式字符串重复利⽤,则可以将其编译后直接调⽤其match⽅法,不使⽤re.match⽅法。
三、字符串的格式化
在python中有两种格式化字符串的⽅法,%记法与str.format()⽅法,建议使⽤format⽅法。
%记法
%[(name)][flags][width].[precision]typecode
其适配⽅法如下表所⽰。
不能使⽤列表输⼊,但可以使⽤元组输⼊,在实际运⽤中较少⽤到上述功能,如需使⽤,则可查阅官⽅⽂档。
format⽅法
{[index][:[[fill]align]][sign][#][0][width][,][.precision][type]}
其适配⽅法如下表所⽰。
注:①format⽅法中允许使⽤关键字参数(放最后),并允许使⽤变量,并允许位置参数与其混⽤(注意若使⽤位置参数必须全部指定),如图所⽰;
②format⽅法中,允许使⽤字典的键来取代位置参数,⽤于匹配相应值,但传⼊字典时需加**,如图所⽰;
③format⽅法中,允许在()中放置列表、字典等数据类型,若要直接使⽤则需加*,若指定了位置拥有返回值,则不⽤加*可直接传⼊,如图。
④实际运⽤中,可能最常⽤到的⽅式为(最基本,忽略所有参数):
'{} aa {} vv'.format(11, 22)
四、python中⼀些与赋值、输出、变量相关的细节与操作
此部分内容是实际运⽤总结,知识点较零碎,没有条理,牵涉到⼀部分后续函数的内容。
1、type()可返回变量的类型;eval()识别字符串中的python表达式,并返回⼀个对象,如图所⽰。
2、id()可返回变量的内存地址,此处返回的是变量引⽤的对象的内存地址,变量只是⼀个符号/名字,其⽤于指向存储于内存中的对象。
3、repr()将字符串转化为供解释器读取的形式,对python解释器更友好,⼀般情况下,obj == eval(repr(obj))是成⽴的。
4、ord()返回单个字符的Unicode码;chr()返回整数对应的Unicode码中的字符,使⽤⼗六进制和⼗进
制均可。
5、encode()将字符串编码为bytes,de(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')。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论