字符串
字符串的编码
Python3 支持Unicode,可表示世界上任何书面语言的字符.Python3 的字符默认就是16 位Unicode 编码,ASCII 码是18位,是Unicode 编码的子集.
内置函数ord()可以把字符转换成对应的Unicode 码;chr()可以把十进制数字转换成对应的字符
ord('湛') # 28251
ord('B') # 66
chr(38472) # 陈
chr(73) # I
创建字符串
通过单引号或双引号创建字符串,如a=’abc’; b=”123”.当字符串本身包含单引号或双引号之一时,可用另者创建,不报错.
连续三个单引号或三个双引号,可以创建多行字符串.
Python 允许空字符串的存在,不包含任何字符且长度为0.
转义字符
使用“\+特殊字符”,实现某些难以用字符表示的效果。常见的转义字符有这些:
转义字符 | 描述 |
---|---|
\(在代码行尾) | 续行符 |
\\ | 反斜杠 |
\’ | 单引号 |
\" | 双引号 |
\b | 退格 |
\n | 换行 |
\t | 制表符 |
\r | 回车 |
调用print 函数时,其后自动跟一个换行符,相当于end = “\n”.我们可以通过改变参数end = “任意字符串”来实现末尾添加指定内容
print("123",end='*')
print("abc",end='\n')
print("321",end='#')
字符的运算
- 使用+将多个字符串拼接起来,也可以将多个字符串直接放到一起实现拼接
- 使用*可以实现字符串复制
字符串提取字符
字符串的本质就是字符序列,所以可以通过在字符串后添加[],在[]里面指定偏移量,来提取该位置的单个字符,可正向提取亦可反向提取
- 正向搜索:
最左侧第一个字符,偏移量是0,第二个偏移量是1,以此类推,直到len(str)-1为止. - 反向搜索:
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。
a = 'abcdefghijklmnopqrstuvwxyz'
a[0] # 'a'
a[3] # 'd'
a[26-1] # 'z'
a[-1] # 'z'
a[-26] # 'a'
字符串切片
切片操作可快速的提取子字符串,标准格式为[起始偏移量start:终止偏移量end(包头不包尾):步长step]
- 正向
操作与说明 | 示例 | 结果 |
---|---|---|
[:] 提取整个字符串 | “abcdef”[:] | “abcdef” |
[start:] 从start 索引开始到结尾 | “abcdef”[2:] | “cdef” |
[:end] 从头开始知道end-1 | “abcdef”[:2] | “ab” |
[start:end]从start 到end-1 | “abcdef”[2:4] | “cd” |
[start: end:step]从start 提取到end-1,步长为step | “abcdef”[1:5:2] | “bd” |
- 反向
操作与说明 | 示例 | 结果 |
---|---|---|
[-n:]倒数n个数 | “abcdef”[-3:] | “def” |
[-x:-y] 倒数第x个到倒数第y个(包头不包尾) | “abcdef”[-5:-3] | “bc” |
[::-1]步长为负,从右到左反向提取 | “abcdef”[::-1] | “fedcba” |
注: 切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]的范围内,也不会报错.此时起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成-1。
字符串驻留机制和比较
字符串驻留–仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中
Python 支持字符串驻留机制,对于符合标识符规则的字符串,即仅包含下划线,字母,数字的字符串会启用字符串驻留机制
a = "abc_123"
b = "abc_123"
a is b # True,启用字符串驻留机制,不新增对象
a == b # True
c = "学习"
d = "学习"
c is d # False,不符合符合标识符规则,新建等值对象
c == d # True,俩对象指向id不同,值相同
id(c) # 86558128
id(d) # 86558216
e = "aa"
f = "bb"
e + f is "aabb" # False
e + f == "aabb" # True
==,!=对字符串进行值的比较
s / not is,判断两个对象是否同一个对象,即地址是否相等
"ab" in a # True
"cd" in a # False
"cd" not in a # True
in /not in关键字,判断某个字符(子字符串)是否存在于字符串中
字符串相关函数
- str()将非字符串的对象转成了字符串
- len()用于计算字符串含有多少字符
len("learning 学习") # 11,Unicode编码里,汉子与字母都算1个字符
- input()读取键盘输入的内容
words = input ("请输入:") # 输入 study
print(words) # "study"
- replace()实现字符串替换(Python 的字符串不可变,即无法对原字符串做任何修改.但可以创建一个符合要求的新字符串,达到“修改”的效果.)
a = 'abcdefghijklmnopqrstuvwxyz'
b = a.replace('c','高')
print(a,b) # 'abcdefghijklmnopqrstuvwxyz' 'ab高defghijklmnopqrstuvwxyz'
- str.split(“指定分隔符”)用指定分隔符,将字符串分隔成多个子字符串(存储到列表中).若不指定分隔符,则默认使用空白字符(换行符/空格/制表符).
a = "to be or not to be"
print(a.split()) # ['to', 'be', 'or', 'not', 'to', 'be']
print(a.split('be')) # ['to ', ' or not to ', '']
- “指定链接符” .join()用指定链接符,将一系列子字符串连接起来
a = ['I','can','do','best']
print('*'.join(a)) # I*can*do*best
print(''.join(a)) # Icandobest
使用+拼接多个字符,会生成多个新字符串对象;使用join函数,仅新建一个对象.所以在项目代码中"" .join()效率更高.
import time
time_start1 = time.time() # 循环起始时间
a = ""
for i in range(1000000):
a += "python" # 字符串不可变,循环中每进行一次运算,形成一个新对象
time_end1 = time.time() # 循环终止时间
print("循环时长:" + str(time_end1 - time_start1)) # 2.315716
time_start2 = time.time()
b = []
for i in range(1000000):
b.append("python") # 列表可变,只形成一个对象
b = "".join(b)
time_end2 = time.time() # 循环终止时间
print("循环时长:" + str(time_end2 - time_start2)) # 0.137120
- 字符串查找
函数 | 说明 |
---|---|
str. startswith(’’) | 判断是否以指定字符串开头 |
str.endswith(’’) | 判断是否以指定字符串结尾 |
str.find(’’) | 返回第一次出现指定字符串的位置 |
str.rfind(’’) | 返回最后一次出现指定字符串的位置 |
str.count(’’) | 返回指定字符串出现次数 |
str.salnum() | 判断字符串是否只由字母(Unicode编码中汉字也算字母)或数字组成 |
str.isalpha() | 判断字符串是否只由字母组成 |
str.isdigit() | 判断字符串是否只由数字组成 |
str.isspace() | 判断是否为空白符,常见空白符为空格,制表符,换行符 |
str.isupper() | 判断是否为大写字母 |
str.islower() | 判断是否为小写字母 |
" I'm learning python, python is interesting".startswith("i'm") # False
" I'm learning python, python is interesting".endswith('ing') # True
" I'm learning python, python is interesting".find('python') # 14
" I'm learning python, python is interesting".rfind('python') # 22
" I'm learning python, python is interesting".count('n') # 6
"学python3".isalnum() # True
"学python".isalpha() # True
"123.4".isdigit() # False
"\t".isspace() # True
"Ab". isupper() # False
"ab". islower() # True
- 大小写转换
函数 | 说明 |
---|---|
str.capitalize() | 产生新的字符串,句子首字母大写 |
str.title() | 产生新的字符串,每个单词都首字母大写 |
str.upper() | 产生新的字符串,所有字符全转成大写 |
str.lower() | 产生新的字符串,所有字符全转成小写 |
str.swapcase() | 产生新的,所有字母大小写转换 |
long = "I'm learning PYTHON, python is interesting"
print(long.capitalize()) # I'm learning python, python is interesting
print(long.title()) # I'M Learning Python, Python Is Interesting
print(long.upper()) # I'M LEARNING PYTHON, PYTHON IS INTERESTING
print(long.lower()) # i'm learning python, python is interesting
print(long.swapcase()) # i'M LEARNING python, PYTHON IS INTERESTING
- 格式排版
函数 | 说明 |
---|---|
center(字符串长度,‘占位符’) | 字符串居中,剩余位置用指定占位符补齐 |
ljust(字符串长度,‘占位字符’) | 字符串左对齐,剩余位置用指定占位符补齐 |
rjust(字符串长度,‘占位字符’) | 字符串右对齐,剩余位置用指定占位符补齐 |
str.strip(’’) | 去除字符串首尾指定信息 |
str.lstrip(’’) | 去除字符串左边指定信息 |
str.rstrip(’’) | 去除字符串右边指定信息 |
txt = "-python-"
print(txt.center(10,"*")) # *-python-*
print(txt.center(20)) # -python-
print(txt.ljust(10,"*")) # -python-**
print(txt.rjust(10,"*")) # **-python-
print(txt.strip("-")) # python
print(txt.lstrip("-")) # python-
print(txt.rstrip("-")) # -python
字符串的格式化
- str.format({索引}/{参数名})
str.format() 函数中字符串用{}占位,format内参数可按{}内索引顺序填入,也可按{}内参数名乱序填入, 可接受不限个参数.
txt1 = "{0}学习{1},{1}是有趣的"
print(txt1.format("abc","python")) # abc学习python,python是有趣的
txt2= "{name}学习{subject},{subject}是有趣的"
print(txt2.format(subject = "python",name = "123")) # 123学习python,python是有趣的
- 填充与对齐
冒号":"后面带一个填充字符,不指定时默认用空格填充
^–居中,<–左对齐(文字默认),>–右对齐(数字默认)
a = "{0:*^6}学习{1:->10},学习{2:5}天,{1:10}是有趣的"
print(a.format("ABC","python",3)) # *ABC**学习----python,学习 3天,python 是有趣的
- 数字格式化
格式 | 说明 |
---|---|
{:.2f} | 四舍五入,保留小数点后两位 |
{:.0f} | 不带小数 |
{:0>4d} | 四位数字,不足左边补零 |
{:,} | 以千分位符分隔 |
{:.2%} | 保留两位小数的百分比 |
{:.2e} | 科学计数法 |
{:<10d} | 左对齐(宽度为10),数字默认右对齐 |
"{:.3f}".format(-3.1415926) # '-3.142'
"{:.0f}".format(-3.1415926) # '-3'
"{:0>4d}".format(6) # '0006'
"{:,}".format(10000000) # '10,000,000'
"{:.2%}".format(0.52432) # '52.43%'
"{:.2e}".format(100000) # '1.00e+05'
"{:<10f}".format(3.1415) # '3.141500 '
可变字符串
Python 中字符串属于不可变对象,不支持直接修改,而是创建新的字符串对象,达成修改的效果.
当需要直接修改其中的值时,可以使用io.StringIO(str)或array 模块。
import io # 导入 io 模块
s = "hello,world"
sio = io.StringIO(s) # 可变字符串
print(type(sio)) # <class '_io.StringIO'>
print(sio.getvalue()) # 获取对象值,hello,world
sio.seek(6) # 索引定位到字符串第7位
sio.write("W") # 更改索引指定处字符,hello,World
print(sio.getvalue())