本篇是对Python3内置数据结构的初步学习与小结,用于复习巩固使用,如有理解偏差的地方,还望各位大佬指正。
字符串str是 Python 中最常用的数据类型。
字符串初始化后,其本身不可改变。
s1 = 'string' ## 最直接定义
s2 = "str‘i’ng2" ## 用""可以在内部继续使用‘’
s3 = '''this's a
"String"
''' ## ‘’‘ 可以在内部放‘’及””,还可以换行
s4 = 'hello \n magedu.com' ## 转义符\ \n是newline
s5 = 'hello \\n magedu.com' ## \\n 多家一个转义符吧\本身转义
s6 = r"hello \n magedu.com" ## 字符串前写r,取消转义,常用于正则表达式
符号 | 意义 |
---|---|
\ (在行尾时) | 换行 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格 |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
字符串是有序的字符序列,索引方法与列表相似。
sql = "select"
sql[4] # 字符串'c'
# sql[4] = 'o' # 字符串是不可变类型,直接报错
sql[0:4]
sql[0:5:2]
sql[::-1] # 省略会按顺序取到最后一位,不会报错也不会少取
c
'sele'
'slc'
'tceles'
for c in sql[:5]:
print(type(c), c)
s
e
l
e
c
lst = list(sql)
['s', 'e', 'l', 'e', 'c', 't']
lst = ['1','2','3']
print("".join(lst)) # 将列表元素无缝组合成一个字符串
print("+++".join(lst)) # 使用666作为分隔符
123
1+++2+++3
str1 = 's'
print(str1, id(str1))
str1 = str1 + 'r' #
print(str1, id(str1))
s 2781397991640
sr 2781443149248
注意:字符串是不可变类型,没有原对象的修改方式,但是为了方便,允许使用类似重写的方式,用 + 连接字符串,这样使用起来就像是可以修改一样,但是我们查看ID就可以发现已经变量名不是原字符串对象。
s1 = "I'm \ta super man."
print(s1.split()) # 切空字符串
print(s1.split('s')) # 按分隔符‘s’,贪婪匹配
print(s1.split(' ',maxsplit=2)) # 按分隔符空白分隔符,贪婪匹配
["I'm", 'a', 'super', 'man.']
["I'", ' \ta super ', 'an.']
["I'm", '\ta', 'super man.']
s1 = "I'm \ta super man."
print(s1.rsplit())
print(s1.rsplit('m'))
print(s1.rsplit(' ',maxsplit=2)) # 从右向左切
print(s1.rsplit('m',maxsplit=1)) # 从右向左切
["I'm", 'a', 'super', 'man.']
["I'", ' \ta super ', 'an.']
["I'm \ta", 'super', 'man.']
["I'm \ta super ", 'an.']
s1 = "I'm\n \ta\r\n super \nman."
print(s1.splitlines())
print(s1.splitlines(True)) # 保留行分隔符
["I'm", ' \ta', ' super ', 'man.']
["I'm\n", ' \ta\r\n', ' super \n', 'man.']
注意:
s1 = "I'm\n \ta\r\n super \nman."
print(s1.partition('\r')) # 从左往右切成三部分
print(s1.partition('\rnn')) # 没找到分隔符,也返回三元素列表
("I'm", '\n', ' \ta\r\n super \nman.')
("I'm\n \ta\r\n super \nman.", '', '')
s1 = "I'm\n \ta\r\n super \nman."
print(s1.rpartition('\n')) # 从右往左切成三部分
print(s1.rpartition('\rnn')) # 没找到分隔符,也返回三元素列表
("I'm\n \ta\r\n super ", '\n', 'man.')
('', '', "I'm\n \ta\r\n super \nman.")
小结:
replace方法用于替换字符串中的每种字符。
s1 = "I'm \ta super man."
print(s1.replace('m','MM')) # 替换字符
print(s1.replace('m','MM',1)) # 指定替换次数
I'MM a super MMan.
I'MM a super man.
s1 = " 09I'm \ta super man.0 09;"
print(s1.strip()) # 不指定字符集,就去掉空白字符
print(s1.strip(' 0912')) # 从两边最外层开始,去除字符集中有的字符
print(s1.strip(' 9.011;')) # 字符集中的顺序无所谓
print(s1.lstrip(' 9.0;')) # 只去掉左边
print(s1.rstrip(' 9.0;')) # 只去掉右边
09I'm a super man.0 09;
I'm a super man.0 09;
I'm a super man
I'm a super man.0 09;
09I'm a super man
小结:
s = "I am very very very sorry"
print(s.find('very'))
print(s.find('very', 5)) # 从字符串的索引为5开始查找,匹配到就立刻返回首位索引值
print(s.find('very', 6, 8)) # 区间查找,没找到返回-1
print(s.rfind('very', 10))
print(s.rfind('very', 10, 15))
print(s.rfind('very', -10,-1)))
5
5
-1
15
10
15
小结:
sub in str -> bool
s = "I am very very very sorry"
s.index('very')
s.index('very', 5)
s.rindex('very', 10) # 从指定的区间开始,从右往左查找
s.rindex('very', 10, 15) # 从指定的区间开始,从右往左查找
s.rindex('very',-10,-1)
s.index('very', 6, 8) # 区间内子串不存在,直接报错
5
5
15
10
15
小结:
s = "I am very very very sorry"
print(s.count('very')) # 不指定子串区间,从左到右计数
print(s.count('very', 5)) # 指定子串区间,从左到右计数
print(s.count('very', 10, 14)) # 指定子串区间,从左到右计数
3
3
1
小结:
s = "I am very very very happy"
print(s.startswith('am')) # 从头开始,连续匹配子串
print(s.startswith('am', 2))
print(s.startswith('very', 5, 9))
print(s.endswith('very', 5, 9)) # 从尾开始,连续匹配子串
print(s.endswith('happy', 5))
print(s.endswith('happy', 5, -1))
print(s.endswith('happy', 5, 100)) # 区间超界也可以
False
True
True
True
True
False
True
小结:
判断方法 | 判断内容 |
---|---|
isalnum | 判断字符串是否完全由字母戒数字组成 |
isalpha | 判断字符串是否完全由字母组成 |
isdigit | 判断字符串是否完全由数字组成 |
isupper | 判断字符串当中的字母是否完全是大写 |
islower | 判断字符串当中的字母是否完全是小写 |
istitle | 判断字符串是否满足 title 格式 |
isspace | 判断字符串是否完全由空格组成 |
'12345a'.isalnum()
'adcdef'.isalpha()
'123456'.isdigit()
'HellO'.isupper()
True
True
True
False
小结:
方法 | 字符串内容格式化修改 |
---|---|
upper | 将字符串当中所有的字母转换为大写 |
lower | 将字符串当中所有的字母转换为小写 |
swapcase | 将字符串当中所有的字母大小写互换 |
title | 标题化,将单词首字母大写,单词以非字母划分 |
capitalize | 只有字符串的首字母大写 |
expandtabs | 把字符串中的制表符号(’\t’)转为空格,(’\t’)默认的空格数是 8 |
'hello'.upper()
'Hello'.swapcase()
'hello world'.title()
'for\tis\tcool'.expandtabs(4)
'for\tis\tcool'.expandtabs() # ‘\t’ 变成空白符,默认8个
'HELLO'
'hELLO'
'Hello World'
'for is cool'
'for is cool'
"I am %03d" % (20,)
'I like %s.' % 'Python'
'%3.2f%% , 0x%x, 0X%02X' % (89.7654, 10, 15)
"I am %-5d" % (20,)
'I am 020'
'I like Python.'
'89.77% , 0xa, 0X0F'
'I am 20 '
小结
format函数格式字符串语法——Python风格推荐使用
位置参数
"{}:{}".format('192.168.1.100',8888)
'192.168.1.100:8888'
关键字参数或命名参数
"{server} {1}:{0}".format(8888, '192.168.1.100', server='Web Server Info : ')
'Web Server Info : 192.168.1.100:8888'
访问元素
"{0[0]}.{0[1]}".format(('xxx','com'))
'xxx.com'
"{}.{}".format(*('xxx','com'))
'xxx.com'
对象属性访问
from collections import namedtuple
Point = namedtuple('Point','x y')
p = Point(4,5)
print("{{{0.x},{0.y}}}".format(p))
{4,5}
格式化对齐
'{0}*{1}={2:<2}'.format(3,2,2*3) # 居左打印位置参数2
'{0}*{1}={2:>04}'.format(3,2,2*3) # 居右打印位置参数2,填充0
'{:^30}'.format('centered') # 居中打印
'{:*^30}'.format('centered') # 居中打印,填充*
'3*2=6 '
'3*2=0006'
' center '
'************center************'
"int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42) # 不打印进制标志符
"int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42) # 不打印进制标志符
octets = [192, 168, 0, 1]
'{:#02X}|{:02X}|{:02X}|{:02X}'.format(*octets) # 参数解构填充,并按大写十六进制打印
'int: 42; hex: 2a; oct: 52; bin: 101010'
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
'0XC0|A8|00|01'
print("{}".format(3**0.5)) # 1.7320508075688772
print("{:f}".format(3**0.5)) # 1.732051,精度默认6
print("{:10f}".format(3**0.5)) # 右对齐,宽度10
print("{:2}".format(102.231)) # 宽度为2
print("{:.2}".format(3**0.5)) # 1.7 2个数字
print("{:.2f}".format(3**0.5)) # 1.73 小数点后2位
print("{:3.2f}".format(3**0.5)) # 1.73 宽度为3,小数点后2位
print("{:3.3f}".format(0.2745)) # 0.275
print("{:3.3%}".format(1/3)) # 33.333%
1.7320508075688772
1.732051
1.732051
102.231
1.7
1.73
1.73
0.275
33.333%
for i in range(1, 10):
for j in range(1, i + 1): # 控制循环
sub = i * j
space = ' ' if j > 1 and sub < 10 else ' ' #控制个数数间距
print('{}*{}={}'.format(j, i, sub), end= space) #格式化打印
print('') # 每次循环结束补一个回车
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
总结: