文章目录
- 1. 字符串的定义
- 2. 字符串的基本操作
- 3. 字符串的一些方法(函数)
- 4. 字符串格式化
- 5. 转义字符
1. 字符串的定义
字符串是被引号包裹的文本(单双三引号都可以, 三引号可以保留格式,外层引号不能和字符串本身包含的引号重复)
字符串是不可变类型
str1 = 'hello world'
str2 = "I'm a student"
str3 = '''hello
world
'''
print(str3)
2. 字符串的基本操作
(1)字符串相加
字符串可以用 ‘+’ 连接
a = '1'
b = '2'
print(a + b) # --> '12'
(2)索引(index)
从左边开始第一个字符索引是 ‘0’, 从右边开始第一个是 ‘-1’(负数索引),
索引越界会报错 —> IndexError : index out of range(索引超出范围)
str1 = 'hello world'
print(str1[0]) # --> 'h'
print(str1[1]) # --> 'e'
print(str1[-1]) # --> 'd'
print(str1[12]) # --> IndexError : str index out of range
(3)切片(sliced)
切片的索引有默认值, 省略开始索引时默认为0, 省略结束默认为到字符串的结束.
word = 'Python'
print(word[:2]) # --> 'Py'
print(word[2:]) # --> 'thon'
切片的开始总是被包括在结果中, 而结束不包括.(类似于前闭后开区间)
print(word[0:2]) # --> 'Py'
print(word[2:4]) # --> 'th'
使用过大的索引会报错, 但切片中的越界索引会被自动处理.
print(word[4:42]) # --> 'on'
print(word[42:]) # --> ''
(3.1)步长切
word = 'Python'
print(word[::2]) # --> 'Pto' 每两个切一个(或者说隔一个切一个)
print(word[1:4]) # --> 'yth'
print(word[1:4:2]) # --> 'yh'
(3.2)负步长
print(word[::-1]) # --> 'nohtyP'
# 用这种方法我们可以将一个字符串反转(注意不是改变字符串本身,而是可以得到一个新的返回值
print(word[::-2]) # --> 'nhy'
(4)相同的字符串在内存中是同一个内存地址(相当于常量池)
str1 = 'hello'
str2 = 'hello'
print(str1 is str2) # --> True
print(id(str1)) # 可以用内置函数id()来查看它们的内存地址,可以看到str1和str2的内存地址相同
print(id(str2)) # 因为每个人电脑出来的结果可能不一样,这里我就不写结果了
# 这里要提一下Python的创建机制,创建一个字符串变量时会为变量名开辟一块内存空间,字符串的值开辟一块内存空间,
# 将变量名指向值的内存地址 (有说的不对的地方大家多包涵,欢迎在下方评论区指出)
# 因为字符串是不可变类型,所以在创建一个相同的字符串时,不会再开辟一块内存,而是将新的变量名指向同一个内存地址
但是!!!我发现在字符串中加空格或者符号就不符合上述情况了, 具体原理我也不清楚…
str1 = 'hello world'
str2 = 'hello world'
print(str1 is str2) # --> False
print(id(str1))
print(id(str2))
# 莫非是字符串太长了?
str3 = 'helloworldhelloworld'
str4 = 'helloworldhelloworld'
print(str3 is str4) # --> True
# 好像不是长度的问题, 有知道的大佬请在评论区留言告知,感谢
3. 字符串的一些方法(函数)
语法: str.函数名() , 这里的点 ‘.’ 表示从属 ,
注意: 下列这些方法不会改变字符串本身, 而是返回一个新的值
(1)str.upper() 将字符串里的内容变成大写
str1 = 'Python'
str2 = str1.upper()
print(str2) # --> 'PYTHON'
(2)str.lower() 将字符串里的内容变成小写
str1 = 'PYTHON'
str2 = str1.lower()
print(str2) # --> 'python'
(3)str.isdecimal() 判断一个字符串能否转换成10进制的整数, 返回一个布尔值
print('55'.isdecimal()) # --> True
print('55.5'.isdeciaml()) # --> False
(4)str.isalnum() 判断字符串是否是数字(0-9#不包括浮点数)或者英文字母(A-Z a-z)的组合, 返回一个布尔值
#这里发现中文也会返回True
print('123abc'.isalnum()) # --> True
print('123'.isalnum()) # --> True
print('abc'.isalnum()) # --> True
print('你好'.isalnum()) # --> True
print('Hi,Tom'.isalnum()) # --> False
(5)str.isalpha() 判断是否只是字母的组合, 返回一个布尔值, 同样中文也会返回True
print('abc'.isalpha()) # --> True
print('a5'.isalpha()) # --> False
print('你好'.isalpha()) # --> True
(6)str.isdigit() 判断字符串是否是纯数字(#必须是整数), 同样返回布尔值
print('123'.isdigit()) # --> True
print('2ab'.isdigit()) # --> False
(7)str.capitalize() 字符串的首字母大写
str1 = 'abc'
print(str1.capitalize()) # --> Abc
(8)str.titel() 字符串中的每个单词首字母大写(#这里指的是分隔开的, 并不是说会自动检测单词拼写)
str1 = 'hello'
print(str1.title()) # --> Hello
str2 = 'helloworld'
print(str2.title()) # --> Helloworld
str3 = 'hello world'
print(str3.title()) # --> Hello World
str4 = 'a b c'
print(str4.title()) # --> A B C
(9)str.strip() 默认去除字符串两边的空白(#也可以在括号中加上参数用来去除别的)
str1 = ' abc '
print(str1.strip()) # --> 'abc' 这里为了表示没有空白我用引号引起来
str2 = 'abca'
print(str2.strip('a')) # --> bc
(10)str.lstrip() 去除字符串左边的空白(#用法类似于strip)
(11)str.rstrip() 去除字符串右边的空白(#用法类似于strip)
(12)str.center(width:int, fillchar:str) 将字符串填充至给定的宽度, 并且原字符串居中
第一个参数width代表宽度,第二个参数fillchar代表用来填充的字符,# 如果不指定fillchar则默认用空格填充
str1 = 'a'
print(str1.center(5, '*')) # --> **a**
print(str1.center(5)) # --> a
print(str1.center(5, '-')) # --> --a--
(13)str.index(‘x’) 找到的左起第一个位置的索引, 找不到就报错
str1 = 'hello world'
print(str1.index('h')) # --> 0
print(str1.index('l')) # --> 2
print(str1.index('a')) # --> ValueError: substring not found
(14)str.find(‘x’) 找到的左起第一个位置的索引, 找不到则返回 -1
str1 = 'hello world'
print(str1.find('h')) # --> 0
print(str1.find('l')) # --> 2
print(str1.find('a')) # --> -1
(15) str.rfind(‘x’) 找到的右起第一个位置的索引(同样返回正索引值), 找不到则返回 -1
str1 = 'hello world'
print(str1.rfind('h')) # --> 0
print(str1.rfind('d')) # --> 10
print(str1.rfind('l')) # --> 9
print(str1.rfind('a')) # --> -1
(16) str.split() 切分字符串, 默认以空白来切分, 返回一个列表(列表中的元素是被切分后的一个一个字符串)
str1 = 'Python is best!'
print(str1.split()) # 以空白切分 --> ['Python', 'is', 'best!']
print(str1.split('b') # 以字符b切分 --> ['Python is', 'est!']
print(str1.split(maxsplit=2,sep='t')) # --> ['Py', 'hon is bes', '!']
# maxsplit参数表示切分的次数, sep参数代表以什么字符来切, 切分后该字符会被去掉
(17) str.startswith(‘x’) 判断字符串是否以字符’x’开头, 返回一个布尔值
str1 = 'hello'
print(str1.starstwith('h')) # --> True
print(str1.startswith('e')) # --> False
(18) str.endswith(‘x’) 判断字符串是否以字符’x’结尾, 返回一个布尔值
str1 = 'hello'
print(str1.endswith('o')) # --> True
print(str1.endswith('e')) # --> False
(19) join() 容器中的每个元素用join前面的字符粘起来, 返回一个字符串
str1 = ' '.join('python')
print(str1) # --> 'p y t h o n'
# 容器中的元素必须都是str
print(' '.join(['Python', 'is', 'best!'])) # --> 'Python is best!'
# join字典得到的是key(键)
print(' '.join({'name': 'Tom', 'age': 12})) # --> 'name age'
(20) str.replace(‘x’, ‘y’, n) 替换, 将字符串中的’x’替换为’y’, n代表替换次数
str1 = 'abcabcabc'
str2 = str1.replace('ab', '123', 2)
print(str2) # --> '123c123cabc'
# 不传替换次数时, 默认全部替换
print(str1.replace('ab', '123')) # --> '123c123c123c'
4. 字符串格式化
(1) format
# '_{}'.format(a) --> a代替花括号的位置
# '_{},_{}'.format(a, b) --> a,b代替花括号的位置
# '_{}'.format(a) --> a代替花括号的位置
print('这是一个{}'.format('字符串')) # --> 这是一个字符串
print('name:{},age:{}'.format('Tom', 10)) # --> name:Tom, age:10
(2) %d #decimal(十进位的)
# '_%d'%(a) --> a代替%d的位置
# 这里a只能是数字(如果a是float, 会自动取整转为int, # 忽略小数点后的)
print('abc%d' % 1) # --> abc1 (%后只有一个数字时, 可以不加括号)
print('abc%.2d' % 1) # --> abc01 (这里 .2 表示占用两个位数, 不足补0)
print('abc%.2d' % 11) # --> abc11
print('abc%.2d' % 111) # --> abc111 (超出则忽略定义的位数)
(3) %f # float(也只能是数字)
print('只要%f元!' % 9.9) # --> 只要9.900000元! (不定义位数时, 小数点后默认补足6位)
print('只要%.2f元!' % 9.987) # --> 只要10.00元! (%.2f表示小数点后保留两位, 四舍五入)
(4)%s # string(通常用来代替字符串, 用法同上, 也可以代替数字)
5. 转义字符
# 转义字符 '\' 反斜杠(也叫捺斜杠)
# '\'单独使用时是折叠符, 一般用在一行写不完另起一行时, 表示续行
# 转义指将有意义的变成->没意义的, 没意义的变成有意义的
# 字符串前加 r 代表字符串里的'\'不用来转义. r -> raw string(原始字符串)
# '\' 在遇到一些特定字符时会转义为特殊字符
# \n --> 换行
# \v --> 纵向制表符
# \t --> 横向制表符
print('hello \nick') # --> hello
# ick
print(r'hello \nick') # --> hello nick