Python基础之字符串
一:字符串
很多人初学编程时,总是担心自己数学不行,潜意识里认为数学好才能编程。实际上,大多数程序员打交道最多的是“字符串”而不是“数字”。因为,编程是用来解决现实问题的,因此逻辑思维的重要性远远超过数学能力。
字符串的本质是:字符序列。Python的字符串是不可变的,我们无法对原字符串做任何修改。但可以将字符串的一部分复制到新创建的字符串,以达到“看起来修改”的效果。
1.1 字符串的编码
Python3直接支持Unicode,可以表示世界上任何书面语言的字符。Python3的字符默认就是16位Unicode编码,ASCII码是Unicode编码的子集(ASCII码只能表示英文与数字,一个字节,每个字节8位)。
使用内置函数==ord()可以把字符转换成对应的Unicode码
使用内置函数chr()==可以把十进制数字转换成对应的字符
print(ord('A')) # 65
print(ord('高')) # 39640
print(chr(65)) # A
print(chr(39640)) # 高
1.2 创建字符串
a = "I teach Chinese KongFu"
b = 'who are you?'
# 创建多行字符串
c = '''name="Bruce Lee"
company="sxt"
age = 32
lover = KongFu
'''
print(c)
多行字符串输出结果:
name="Bruce Lee"
company="sxt"
age = 32
lover = KongFu
1.3 字符串长度
使用len()函数计算字符串的长度
a = '' # Python允许空字符串的存在
b = 'Bruce Lee 李小龙'
print(len(a)) # 0
print(len(b)) # 13 (包含空格,因为使用的是Unicode编码所以一个中文汉字就是一个字符)
1.4 replace()实现字符串替换
字符串是“不可改变的”,我们通过[]可以获取字符串指定位置的字符,但是我们不能改变字符串,当尝试改变字符串中某个字符,会报错:
a = 'see you again'
a[2] = 'a'
print(a)
报错信息如下:
TypeError: 'str' object does not support item assignment
当需要改变某些字符时,就可以使用replace()
a = 'see you again'
b = a.replace('s', 'l')
print(a) # see you again
print(b) # lee you again
整个过程中,实际上我们是创建了新的字符串对象,并赋值给了变量b,而变量a则无变化
1.5 slice切片
切片slice操作可以让我们快速的提取字符串,标准格式为:
[起始偏移量 start: 终止偏移量 end: 步长 step]
典型操作(三个量为正数)的情况:
其他操作(三个量为负数)的情况:
1.6 split()分割
split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。
a = 'to be or not to be'
b = a.split()
print(b) # ['to', 'be', 'or', 'not', 'to', 'be']
指定分隔符进行分隔
a = 'to be or not to be'
b = a.split('be')
print(b) # ['to ', ' or not to ', '']
1.7 join()合并
join()的作用与split()作用刚好相反,用于将一系列子字符串连接起来。
a = ['sxt', 'sxt100', 'sxt200']
b = '*'.join(a) # 指定使用*号将列表中的元素连接起来(也可以不指定,为空)
print(b) # sxt*sxt100*sxt200
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+号来进行拼接字符串操作。
推荐使用join函数,因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
1.8 字符串驻留机制
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线 _、字母和数字)会启用字符串驻留机制。
a = 'abd_33'
b = 'abd_33'
print(a is b) # True (变量a和b都指向同一块内存地址)
# 下面使用的python版本为3.7.4,带特殊字符#号,也是符合标识符规则的字符串;早期版本下面为False,内存地址也不一样
c = 'dd#'
d = 'dd#'
print(c is d) # True (is 比较的是内存地址)
print(c == d) # True (== 比较的是value)
print(id(c)) # 1922673958320
print(id(d)) # 1922673958320
1.9 格式排版
center(), ljust(), rjust()这三个函数用于对字符串实现排版
a = 'tom'
print(a.center(10, '*')) # ***tom****
print(a.center(10)) # tom
print(a.ljust(10, '*')) # tom*******
1.10 字符串格式化
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
a = 'name is : {0}, age is : {1}'.format('Bruce Lee', 32)
b = 'name is : {}, age is : {}'.format('Jet Lee', 37)
c = 'name is: {0}, age is : {1}, {0} is a good guy'.format('Rambo', 22)
d = 'name is {name}, age is {age}'.format(name = 'Jacky', age = 33)
print(a)
print(b)
print(c)
print(d)
1.11 填充与对齐
填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
a = "{:*>8}".format('234')
print(a) # *****234
b = 'I am {0}, I love number {1:*^8}'.format('Bruce Lee', '666')
print(b) # I am Bruce Lee, I love number **666***
1.12 数字格式化
浮点数通过 f,整数通过 d 进行需要的格式化。
a = "我是{0},我的存款有{1:.2f}".format('Bruce Lee', 3888.234234)
b = "我是{0},我的存款有{1:d}".format('Bruce Lee', 3888)
print(a) # 我是Bruce Lee,我的存款有3888.23
print(b) # 我是Bruce Lee,我的存款有3888
其他格式,供大家参考:
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:.0>2d} | 05 | 数字补零 (填充左边, 宽度为 2) |
5 | {:x<4d} | 5xxx | 数字补 x (填充右边, 宽度为 4) |
10 | {:x<4d} | 10xx | 数字补 x (填充右边, 宽度为 4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
13 | {:10d} | 13 | 右对齐 (默认, 宽度为 10) |
13 | {:<10d} | 13 | 左对齐 (宽度为 10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为 10) |
1.13 可变字符串
在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO对象或 array 模块。
import io
s = 'hello, man'
sio = io.StringIO(s)
print(sio)
print(sio.getvalue())
print(sio.seek(7)) # 将指针移动到索引7位置
print(sio.write('g')) # 将索引为7的字符修改为g
print(sio.getvalue()) # hello, gan
1.14 其他常用方法
a = '''It's been a long day without you my friend,And I'll tell you all about it when I see you again,We've come a long way from where we began,Oh I'll tell you all about it when I see you again'''
print(len(a)) # 计算字符串长度
print(a.startswith('I')) # 是否以什么开头
print(a.endswith('n')) # 是否以什么结尾
print(a.find('long')) # 从左边开始查找long第一次出现的位置
print(a.rfind('you')) # 从右边开始查找you第一次出现的位置
print(a.count('see')) # 统计字符串中see出现的次数
print(a.isalnum()) # 是否全部为数字或字母
print(a.capitalize()) # 将首字母大写
print(a.title()) # 将每个单词的首字母大写
print(a.upper()) # 全部转化为大写字母
print(a.lower()) # 全部转化为小写字母
print(a.swapcase()) # 将字符串中的大写字母转化为小写,小写转化为大写
print(a.isalpha()) # 检测字符串是否只由字母组成(含汉字)
print(a.isdigit()) # 是否只由数字组成
print(a.isspace()) # 是否为空白字符
print(a.isupper())
print(a.islower())
来源:CSDN
作者:琴酒网络
链接:https://blog.csdn.net/pcn01/article/details/104289291