python的数据结构(三)

1. 字符串

1.1一些基本的性质

字符串是一个不可变对象。

上次说元组是不可变对象,是因为元组没有增删改这种功能,字符串也是一样的。

a = 'a'
a += 'b'

a
'ab'

这样的行为,是创造了一个新的字符串 ‘ab’ ,储存在内存中,并赋值给了a 。

原来的字符串’a’ ,还是按原来的样子放在内存里。

python3 的字符串用的是Unicode码 类型
Unicode 码包括中、日、韩三种文字,它是一种字符集,把每个字用一定的编码代表。

字符串是一个可迭代对象,支持索引访问
当字符串被当做可迭代对象时,是从左往右,依次把字符带入,注意,一些空格 ’ ’ 也是字符,也会被迭代。

a = 'suck my dick'
for chr in a:
    print(chr,end=':')

s:u:c:k: :m:y: :d:i:c:k: # 注意,空格也是字符,前后也有: 标记

要索引时,从左往右看,第一个字符索引号为0,第二个为1,依次类推。同时字符串支持负索引,最后一个字符的索引号为-1 , 倒数第二个字符是-2 ,以此类推。

a[0]
's'

a[4]
' '

a[-5]
' '

1.2 和字符串有关的一些函数

1.2.1 ‘sep’.join(sql)

用分隔符 ‘sep’ ,把 sql 这个字符串的每个字符分隔开来。
注意,这个分隔符必须是字符串类型 (str) 。

a = 'suck my dick'
'@'.join(a)

's@u@c@k@ @m@y@ @d@i@c@k'
# 就是把分隔符sep,join到,字符串语句sql中

1.2.2 ‘sql’.split(sep = None[,maxsplit = -1])

这个不是创造分隔符sep,是从已有的字符串语句’sql’ 中,找到指定的分隔符,拿走分隔符,然后从这里分开字符串。分隔符必须是字符串类型。

返回一个,包含分开之后的字符串的列表,列表顺序不变

a = 'suck my dick'
a.split('')
['suck ', 'y dick']

maxsplit 可以指定分隔多少次,缺省为-1 ,也就是,只要找到都分隔。指定为1的话,就在sql ,从左往右的顺序找,找到第一个,分隔。

a = 'suck my dick'
a.split('k')
['suc', ' my dic', '']
# 注意,就算第二个k,后面没有字符了,split()也会分隔,后面切出一个空字符串''

a.split('k',maxsplit = 1)
['suc', ' my dick']
# 只切从左往右数的第一个'k',第二个不切

也可以不指定分隔符sep,因为sep 缺省值为 None,不指定的话,就以空格符分隔 ’ ’ 。

a.split()
['suck', 'my', 'dick']

1.2.3 ‘sql’.rsplit()

用法和split() 是一模一样的,这个r 代表的是right,意思就是从右开始切。

a = 'suck my dick'
a.rsplit(maxsplit=1)
['suck my', 'dick']

1.2.4 ‘sql’.splitlines(keepends = False)

\n ,\r 属于换行符.
\r 很牛逼,在一串字符串中,\r 后面的字符,会替换\r 前面的字符,有几个替换几个。

print('abcd\rb')
'bbcd'
print('12345\r9')
'92345'

splitlines()可以按换行符分隔

a = 'suc\rk\nmy\ndick'
a.splitlines()
['suc', 'k', 'my', 'dick']
# \r \n \n 处分隔

keepends 的意思是,是否保留换行符,默认是不保留,keepends = False。再用splitlines()时可以用splitlines(keepends = True)来保留换行符,换行符保留在前一段字符的最后。

a = 'suc\rk\nmy\ndick'
a.splitlines(keepends = True)
['suc\r', 'k\n', 'my\n', 'dick']

1.2.5 ‘sql’.partition(‘sep’)

也是分隔字符串用的,不同的是,partition() 只会分隔成前后两段,从左往右找到的第一个。分隔符必须是字符串类型。

返回的是一个元组,(haed ,sep ,tail) ,依次就是右边的一段字符串,分隔符,左边的一段字符串。没有把分隔符切没了。

sep必须指定,不存在什么缺省值为空格 ’ ’ 。

a = 'suck my dick'
a.partition('u')
('s', 'u', 'ck my dick')

a.partition(' ')
('suck', ' ', 'my dick')

1.2.6 ‘sql’.rpartition(sep)

从右边开始找,用法和partition() 是一样的。

a = 'suck my dick'
a.rpartition(' ')
('suck my', ' ', 'dick')

1.2.7 字符串的大小写转换

‘string’.upper()
把字符串里的所有字母都转换成大写字母。

a = 'fuck'
a.upper()
'FUCK'

注意,upper() 前面的必须用字符串形式,如果字符串里没有字母的话,upper()就没有作用。

‘string’.lower()

a = 'FUCK'
a.lower()
'fuck'

注意事项同上。

‘string’.swapcase()

a = 'FuCk'
a.swapcase()
'fUck'

‘string’.title()

a = 'suck my dick'
a.title()
'Suck My Dick'

外国的一些标题,每个单词的首字母都是大写的,这个函数就是把字符串转换成标题的形式。

‘string’.capitalize()

a = 'suck my dick'
a.capitalize()
'Suck my dick'

注意和 .title() 的区别,.title() 是把每个单词的首字母都大写,.capitalize() 是只把字符串的首字母大写。

1.2.8 和打印位置相关的函数

‘string ’.center(width[,fillchar])
把字符串居中打印出来。

width是打印出来的总共长度。

fillchar是,字符串居中之后,前后空出来的部分用什么填充,fillchar可以不写,不写的话,默认用空格填充。

a = 'suck my of dick'
b = a.center(30,'*')
b
'*********suck my dick*********'
a
'suck my dick'

注意,这个函数是有返回值的,返回出居中以后的字符串。可以用变量来接,原值不变。

‘string ’.zfill(width)
在width 的宽度里面,把字符串居右显示,然后剩下的格子用’0’ 来填充。zfill 大概就是用zero fill 满格子。

a = 'suck my dick'
b = a.zfill(30)
b
'000000000000000000suck my dick'

‘string ’.ljust(width[,fillchar])
‘string ’.rjust(width[,fillchar])
把指定的字符串在width 的宽度里,左对齐或者右对齐,fillchar 可以指定填充字符。
不举例了,太简单了。

1.2.9 ‘更改’字符串的函数

字符串是不可变,所谓的更改,就是在原有的基础上做一些更改,然后返回一个新的字符串。和原有字符串无关。有返回值,返回值就是新字符串。

‘string’.replace(old,new[,count])
从左往右查找old字符串,找到后把old代表的字符串替换成new代表的字符串。

a = 'suck my dick'
b = a.replace('k','q',1)
b
‘sucq my dick’

count 代表了替换的次数,不写的话,默认把所有的都替换。

‘string’.strip(’ ‘)
从字符串两端开始找,删除给出的字符,碰到第一个非指定的字符就停止,返回新的字符串。

可以不指定,不指定的话,就是删除空格字符串。

注意,虽然空格字符串 ’ ‘,和空字符串 ” 显示的都是没有,但是二者完全不同。

a = 'suck my dick'
b = a.strip('sku')
b
'ck my dic'

注意,括号里只写一个字符串,然后把想删的都写上,可以没有顺序。
‘string’.lstrip(’ ‘)
‘string’.rstrip(’ ‘)
上面的是从左往右删,下面的是从右往左删,用法是一样的。

1.2.10 访问字符串的函数

(我靠竟然三级标题写到了10,看来整个微博的逻辑结构有很大毛病。)

‘string’.find(sub[,start[,end]])
在字符串中,从左往右查找sub 子串,找到第一个就返回第一个字符的索引值,类型为int。

这个查找挺科学的,比如从最左端开始,先比较字符串的第一个字符和sub子串的第一个字符,如果相同,就比对双方的第二个字符,以此类推,进行判断。如果有一个字符不对,就用字符串的第二个字符,和sub子串的第一个字符比较,方法同上。

a = 'suck my dick'
b = a.find(' m')
b
4

可以指定查找的区间,[ start, stop ),范围是一个左闭右开区间。注意,这个sub子串,必须完全在给定的范围内,如果只是第一个字符在范围内,算没有查找到。

a = 'suck my dick'
b = a.find('my',0,6)
b
-1

如果找不到sub 子串,就返回-1,不报错,不报错,不报错。

a = 'suck my dick'
b = a.find('fuck') 
b
-1

‘string’.rfind(sub[,start[,end]])
从右端开始查找,用法和上面一样。
‘string’.index(sub[,start[,end]])
用法什么的和find一模一样,唯一不同的是,index如果没查找到,就会value error的错误。
‘string’.rindex(sub[,start[,end]])
从字符串的右端开始查找,其他的同上。

‘string’.count(sub[,start[,end]])
查找界定的范围内,sub子串在字符串里出现了几次。
返回值是出现的次数,类型是int。

a = 'I am so so so so so angry now'
a.count('so',5,16)
4

‘string’.startswith(prefix[,start[,end]])
‘string’.endswith(suffix[,start[,end]])
看函数名就理解了吧?在指定范围里看,这个字符串是不是以 prefix 开头的,或者是以suffix 结尾的。
返回一个bool 类型的值。

想一想昂,’string’.find(‘prefix’,0,len(‘string’)) == 0 这个判断用的表达式,和’string’.startswith(prefix),是一样的吧。

1.2.11 对字符串内判断的函数

返回的都是bool值,所以能当做限定用户输入的内容的一个装置。
‘string’.isdecimal()
字符串里包含的是否都是十进制数字

num = input('>>>')
while not num.isdecimal():
    num = input('>>>')

限定用户只能输入数字的装置。

‘string’.isalnum()
判断是否是由数字和字母组成

‘string’.isalpha()
判断是否只含字母

‘string’.isdigit()
判断是否只含数字,和decimal

‘string’.isdentifier()
判断是不是以字母和下划线开头,其他内容都是数字、字母、下划线。
这不就是判断一个标识符是不是合法吗?

‘string’.isupper()
判断字符串里的字母,是否都是大写,只判断字母,其余的不管。

‘string’.islower()
判断字母是否都是小写,非字母不管

‘string’.isspace()
判断是否只包含空白字符。空格,\t ,\n ,\r 都算是空白字符。

1.3 printf-style formatting 的字符串格式化

有一些C 语言风格的字符串格式,是用% 来占位。

'suck %-1s %03d %06s' %('my',1,'dick')
'suck my 001   dick'

注意,这里%为占位符,前面的占位符可以有多个,但是后面的%只能有一个,接元组、字典什么的,里面有和前面的占位符等量的元素个数,如果个数不匹配,就会报错。

后面的数字1、3和6,都是表示后面的元素在前面的字符串中占几个位置,- 表示在这个位置中靠左对其,如果不写 - 的话,就是靠右对齐。

如果给出的位置,还没后面相应的元素长,那就按元素的位置填进去。

'OX%06d'%61
'OX000061'

多少位置前面打个0,代表前面如果有多余的空格,就以0全部填充满。注意,后面有空格的话不用0填充满,因为后面加0,对于整数来说,会改变原有数值。

有时候打印员工编号之类的数据,前面有得有0。

'OX%x'%15
'OXf'
# 用16进制来理解

后面的d、s和x ,表示是用数字(digit)来理解后面的元素,还是用字符串(string)来理解后面的元素,还有用16进制(hex)来理解(X,大写的X也可以作用16进制,就是输出后的ABCDEF,都是以大写形式表达)。还有很多其他的类型,python自带的帮助文档里面有。

'%f'%(3.141592654)
'3.141593'

不指定保留几位小数的话,默认保留小数点后六位数字,四舍五入

'%010.2f'%(3.141592654)
'0000003.14'

.2 代表小数点后面取几位,四舍五入。f 表示float类型的值。但是注意,是没办法控制小数点前面的整数部分的。

因为%有自己的意义,所以要在字符串中表示%,就连打两个,%%,表示用%转义他自己。

1.4 format函数

‘{}{}’.format(*args,*kwargs)
这种字符串表达形式是python经常用的,看起来很麻烦,其实很好用,也很装逼。
一个一个来解释。

前面单引号 ’ ’ ,表示字符串要显示出的类型, { } 表示占位符,这个占位符就是,先占一个位置,这个位置里面要填入后面format() 里面相应的元素,就是说除了 { } ,可以随便写一些信息什么的,把 { } 的内容拼接起来。

'马刺与勇士的比分是{}:{}'.format(150,0)
'马刺与勇士的比分是150:0'

这个 { } 内其实是有索引号的,默认依次为0,1,2…对应后面format() 里面的第一个值,第二个值,第三个值。

'马刺与勇士的比分是{1}:{0},是不可能的'.format(150,0)
'马刺与勇士的比分是0:150,是不可能的'

也可以手动设置索引号。

'start|{:<30}|end'.format('The Bigbang Theory')
'start|The Bigbang Theory            |end'

'start|{:>30}|end'.format('The Bigbang Theory')
'start|            The Bigbang Theory|end'

可以在 { } 内加一个冒号 : ,用来控制值在这个占位符处的位置,冒号: 后面的数字表示,这个占位符一共有多少个格子,当格子没有后面的值所用的格子多时,以后面的值所用的格子为这个占位符所用的格子。

< 表示向左对齐,> 表示向右对齐。也可以不指定 < 和> ,默认的情况是向左对齐。

'start|{:^30}|end'.format('The Bigbang Theory')
'start|      The Bigbang Theory      |end'

'start|{:*^30}|end'.format('The Bigbang Theory')
'start|******The Bigbang Theory******|end'

^ 表示在制定的范围内,把值居中显示,这样打印,相比于’string’.center(width[,fillchar])比较方便。

^ 号前面,: 号后面,可以指定一个字符,如果把值填进这个位置后,有空位的话,就用这个字符填充空位。

猜你喜欢

转载自blog.csdn.net/LittleHuang950620/article/details/81534198