Python字符串杂谈

一、转义字符          

描述
\(在行尾时)       续行符
\\                反斜杠符号
\'                单引号
\"                双引号
\b                退格(Backspace)
\n                换行
\t                横向制表符
\r                回车

举例:
a = 'hu\nde\nchao'
print(a)       #结果:hu换行de换行chao

b = 'hu\'de\'chao'
print(b)       #结果:hu'de'chao
print('abc\
def')          #结果:abcdef


二、字符串拼接
1、可以使用+将多个字符串拼接起来。例如:'aa'+ 'bb' ==>'aabb'
  (1) 如果+两边都是字符串,则拼接
  (2) 如果+两边都是数字,则加法运算 3+2 ==> 5
  (3) 如果+两边类型不同,则抛出异常 3+"2" ==> 会报错
2、可以将多个字面字符串直接放到一起实现拼接。例如:'aa''bb'==> 'aabb'  
  
三、字符串复制
1、使用*可以实现字符串复制:
a = 'sxt'*3
print(a)   #结果:SxtSxtSxt 


四、不换行打印
1、当调用print时,会自动打印一个换行符,有时,我们不想换行,不想自动添加换行符。我们可以自己通过参数 end = "任意字符串"
print("aa",end="\t")
print("bb",end="\t")
print("cc",end="\t")
结果:aa   bb    cc    
  
五、从控制台读取字符串
使用input()从控制台读取键盘输入的内容:
Myname = input("请输入名称:")
请输入名字:"hudechao"
print(myname) #结果:hudechao

input("请输入:")
该方法会根据用户输入的数据类型自动转换。但有时转换会报错,如:
输入字符串hudechao会报错未定义,因为输入hudechao时,input()方法
判断为整型就转换为整型所以会报错,可以改成输入"hudechao"

raw_input("请输入:")
该方法将用户输入的值只转换为字符串,所以输入123和hudechao,最后的值
都转换为了字符串

注:Python3将raw_input()和input()进行整合成了input()去除了raw_input()函数;
其接受任意输入, 将所有输入默认为字符串处理,并返回字符串类型

六、str()实现数字转型字符串
str()可以帮助我们将其他数据类型转换为字符串:
str(5.20) ==>'5.20' str(3.14e2)==>'314.0'
当我们调用 print()函数时,解释器自动调用了 str()将非字符串的对象转成了字符串

七、使用[]提取字符
正向搜索:
    最左侧第一个字符偏移量{即下标索引}是0,第二个字符偏移量是 1,以此类推。直到len(str)-1为止
反向搜索:
    最右侧第一个字符偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止
a = "abcdefghijklmno"
print(a[0])   #结果:a
print(a[3])   #结果:d
print(a[-1])  #结果:o
print(a[-0])  #结果:a

八、replace()实现字符串替换
字符串是"不可改变"的,只能通过创建新的字符串来实现。
整个过程中,实际上我们是创建了新的字符串对象,并指向了变量a,而不是修改了以前的字符串。
a = "abcdefghijklmno"
a = a.replace("c","胡")
print(a)      #结果:ab胡defghijklmno

九、字符串切片操作
切片 slice 操作可以让我们快速的提取子字符串。标准格式为:
[起始偏移量 start:终止偏移量 end:步长 step]  【步长step指:从某个索引开始往后数两位不包含该索引位】

操作和说明                        示例                            结果
[:]                               提取整个字符串                  "abcdef"[:]     "abcdef"
[start:]                          从start索引开始到结尾           "abcdef"[2:]    "cdef"
[::]                              从头开始到结尾                  "abcdef"[::]    "abcdef"
[: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"
【注:带有终止偏移量end的时候,采取包头不包尾的方式截取字符串】

其他操作(三个量为负数)的情况:
示例                            说明                                  结果
"abcdefghiwxyz"[-3:]            倒数三个                              "xyz"
"abcdefghij"[-8:-3]             倒数第八个到倒数第三个(包头不包尾)    "cdefg"
"abcdefghij"[::-1]              步长为负,从右到左反向提取            "jihgfedcba"

注:切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。
起始偏移量小于 0 则会当做 0,终止偏移量大于“长度-1”会被当成-1。
例如:
"abcdefg"[3:50]   结果:"cdefg"

联系:
1. 将"to be or not to be"字符串倒序输出   "to be or not to be"[::-1]  结果:eb ot ton ro eb ot
2. 将"sxtsxtsxtsxtsxt"字符串中所有的s输出 "sxtsxtsxtsxtsxt"[::3] 结果:sssss

 

十、split()

可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空
格/制表符)
举例:
a = "a b c d f a m"
print(a.split("a"))  #结果:['', ' b c d f ', ' m']

d = "ab cd ef gh"
print(d.split())     #结果:['ab', 'cd', 'ef', 'gh']

十一、join()的作用

和 split()作用刚好相反,用于将一系列子字符串连接起来:
举例:
a = ["to","be","or","not","to","be"]
print("*".join(a))   #结果:o*be*or*not*to*be
print("".join(a))    #结果:tobeornottobe

比循环效率高!


十二、拼接字符串要点:
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+号来拼接字符串。推荐使用join()函数,因为join函数在拼接字符
串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象
举例:
import time

a = "a b c d f a m"
print(a.split("a"))  #结果:['', ' b c d f ', ' m']

d = "ab cd ef gh"
print(d.split())     #结果:['ab', 'cd', 'ef', 'gh']

a = ["to","be","or","not","to","be"]
print("*".join(a))   #结果:o*be*or*not*to*be
print("".join(a))    #结果:tobeornottobe
time01=time.time()   #获取系统当前时间
b=""
for i in range(1000000):
    b+=str(i)
time02=time.time()
print("消耗时间:"+str(time02-time01)) #结果:消耗时间:1.7736153602600098

time03=time.time()
c=[]
for i in range(1000000):
    c.append(i)
time04=time.time()
print("消耗时间:"+str(time04-time03)) #结果:消耗时间:0.12497115135192871

十三、字符串驻留
Python中的字符串采用了字符串驻留机制,当需要值相同的字符串的时候(比如标识符),
可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,
因此拼接和修改字符串是会比较影响性能的。
注意:并不是所有的字符串都会采用字符串驻留机制,当且仅当只包含字母、数字、下划线的字符串才会采用字符串驻留机制。
举例1:
a = "hello"
b = "hello"
print(a is b)  # 输出 True 
print(a == b)  # 输出 True

举例2:
a = "hello world"
b = "hello world"
print(a is b)  # 输出 False ,is判断的是对象的id值
print(a == b)  # 输出 True ,=号比较的是对象的value
注:在PyCharm或者保存为文件执行,结果是不一样的,主要是因为解释器做了一部分优化

举例3:
a = 'ab' + 'c' is 'abc'
print(a)    # 输出 True
ab = 'ab'
b = ab + 'c' is 'abc'
print(b)    # 输出 False
注:第一个’ab’+’c’是在compile-time(编译期)求值的,被替换成了’abc’,所以输出为True;第二个示例,ab+’c’是在run-time(运行期)拼接的,导致没有被自动字符串驻留(intern)

举例4:
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)  # 输出 False
print(a == b)  # 输出 True
注:a和b是列表,不是同一个对象

举例5:
a = [1, 2, 3]
b = a
print(a is b)  # 输出 True 
print(a == b)  # 输出 True
注:把a的引用复制给b(引用赋值),在内存中其实是指向同一个对象

举例6:
a = ["I", "love", "Python"]
b = a[:]
print(a is b)        # 输出 False
print(a == b)        # 输出 True
print(a[0] is b[0])  # 输出 True
print(a[0] == b[0])  # 输出 True
注:b通过切片操作重新分配了对象(切片赋值),但值和a相同。由于切片拷贝是浅拷贝,这说明列表中的元素并未重新创建,因此a[0] is b[0]输出为True

举例7:
a = 1
b = 1
print(a is b)  # 输出 True
print(a == b)  # 输出 True
注:Python会对比较小的整数对象进行缓存,下次用的时候直接从缓存中获取

举例8:
a = 320
b = 320
print(a is b)  # 输出 False
print(a == b)  # 输出 True
注:Python仅仅对比较小的整数对象进行缓存(范围为范围[-5,256]),而并非是所有整数对象。注意,这仅仅是在交互式命令行中执行,而在PyCharm或者保存为文件执行,结果是不一样的,主要是因为解释器做了一部分优化


十四、字符串比较和同一性
直接使用==,!=对字符串进行比较,是否含有相同的字符,即比较的是该对象的value值。
我们使用 is / not is,判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是否和 id(obj2)相等。

十五、成员操作符
in /not in 关键字,判断某个字符(子字符串)是否存在于字符串中。
a = "abcdef"
b = "bcd"
print(b in a)  #输出 True

十六、常用查找方法:
a = "abcdefghiejklmn"
print(len(a))
print(a.startswith("abc"))
print(a.endswith("lmn"))
print(a.find("e"))
print(a.rfind("e"))
print(a.count("e"))
print(a.isalnum())

方法和使用示例           说明                         结果
len(a)                   字符串长度                   15
a.startswith('abc')      以指定字符串开头             True
a.endswith('lmn')        以指定字符串结尾             True
a.find('e')              第一次出现指定字符串的位置    4
a.rfind('e')             最后一次出现指定字符串的位置   9
a.count("e")             指定字符串出现了几次           2
a.isalnum()              字符是否只由字母或数字组成     True

十七、去除首位信息
strip(str)方法去除字符串首位指定的字符串,不带参数时默认去除首位的空格
lstrip(str)方法去除字符串左边指定信息,不带参数时默认去除首位的空格
rstrip(str)方法去除字符串右边指定信息,不带参数时默认去除首位的空格
print("*s*t*r".strip("*"))     #结果:s*t*r
print("  s  t  r   ".strip())  #结果:s  t  r
print("  s  t  r   ".lstrip()) #结果:s  t  r  (右边是有空格的)
print("  s  t  r   ".rstrip()) #结果:  s  t  r


十八、大小写的转换
a.capitalize() 产生新的字符串,首字母大写
a.title()      产生新的字符串,每个单词都首字母大写
a.upper()      产生新的字符串,所有字符全转成大写
a.lower()      产生新的字符串,所有字符全转成小写
a.swapcase()   产生新的,所有字母大小写转换

a = "gaoqi love programming, love SXT"
print(a.capitalize())  #结果:Gaoqi love programming, love sxt
print(a.title())       #结果:Gaoqi Love Programming, Love Sxt
print(a.upper())       #结果:GAOQI LOVE PROGRAMMING, LOVE SXT
print(a.lower())       #结果:gaoqi love programming, love sxt
print(a.swapcase())    #结果:GAOQI LOVE PROGRAMMING, LOVE sxt

十九、格式排版
a.center(10,"#")  一共10个字符,str居中显示,剩下的用#号补充
a.center(10)      一共10个字符,str居中显示,不指定字符时默认用空格补充
a.ljust(10,"#")   一共10个字符,str左对齐,剩下的用#号补充;同理不指定字符时默认用空格补充
a.rjust(10,"#")   一共10个字符,str右对齐,剩下的用#号补充;同理不指定字符时默认用空格补充

a = "sxt"
print(a.center(10,"#")) #结果:###sxt####
print(a.center(10))     #结果:   sxt    
print(a.ljust(10,"#"))  #结果:sxt#######
print(a.rjust(10,"#"))  #结果:#######sxt

二十、其他方法
1. isalnum() 字符串是否只由字母或数字组成
2. isalpha() 检测字符串是否只由字母组成(包含含汉字)。
3. isdigit() 检测字符串是否只由数字组成。
4. isspace() 检测是否为空白符
5. isupper() 是否为大写字母
6. islower() 是否为小写字母

print("sxt100".isalnum())    #结果:True
print("sxt胡德朝".isalpha()) #结果:True
print("520.13".isdigit())    #结果:False
print("aB".isupper())        #结果:False
print("aB".islower())        #结果:False
print("\t\n".isspace())      #结果:True

 

 

发布了70 篇原创文章 · 获赞 57 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章