字符串类型 str

字符串类型 str

用引号引起来的就是字符串,单引号,双引号,三引号

转义字符 \ + 字符
\n   : 换行
\r\n : 换行
\t   : 缩进(水平制表符)    
\r   : 将\r后面的字符串拉到了当前行的行首


单引号的字符串

strvar = '生活不止眼前的苟且'
print(strvar , type(strvar) )

 

双引号的字符串

strvar = "还有诗和远方的田野"
print(strvar , type(strvar))

# 可以将无意义的字符变得有意义
strvar = "还有诗和\n远方的田野"
strvar = "还有诗和\r\n远方的田野"
strvar = "还有诗和\t远方的田野"
strvar = "还有诗和\r远方的田野"
strvar = "还有诗和\n远方的\r田野"

# 可以将有意义的字符变得无意义
strvar = "还有诗和\"远\"方的田野"
print(strvar)
strvar = "还有诗和\"远\"方的田野"


三引号的字符串 (可以支持跨行效果)

strvar = '''
生活就像"醉"酒
表面上说'不'要
身体却很诚实
'''
print(strvar)


元字符串 r"字符串"

#原型化输出字符串
strvar = "D:\nython32_python\tay02"
strvar = r"D:\nython32_python\tay02"
print(strvar)

 

字符串的格式化format

(1)顺序传参

{}是format中的占位符

strvar = "{}向{}开了一枪,饮弹而亡".format("张三","李四")
print(strvar)

 

(2)索引传参

strvar = "{1}向{0}开了一枪,饮弹而亡".format("张三","李四")
print(strvar)

 

(3)关键字传参

strvar = "{who1}看了{who2}一下,回头一巴掌".format(who1="张三",who2="李四")
print(strvar)

 

(4)容器类型数据(列表或元祖)传参

方法一(推荐)

strvar = "{group1[0]}看了{group2[1]}一下,嘿嘿一笑".format(group1=["张三","李四","王麻子"] , group2 = ("谢广坤","刘能"))
print(strvar)

 

方法二(推荐) 
注意一.如果该容器是字典,通过键取值时,不需要加引号  
注意二.通过下标取值时,不能使用负号(逆向索引)

strvar = "{group1[zs]}看了{group2[-1]}一下,嘿嘿一笑".format(group1={"zs":"张三","lisi":"李四"} , group2 = ("谢广坤","刘能"))
print(strvar)

 

方法三

strvar = "{0[0]}看了{1[1]}一下,嘿嘿一笑".format(["张三","李四","王麻子"] , ("谢广坤","刘能"))
print(strvar)

 

format的占位符的使用

"""
%d 整型占位符
%f 浮点型占位符
%s 字符串占位符
语法形式:
    "字符串" % (值1,值2)
"""
# %d 整型占位符
strvar = "昨天买了%d鸡腿饭"  %  (2)
print(strvar)

# %2d  占两位 (不够两位拿空格来补位) 原字符串具右
strvar = "昨天买了%2d鸡腿饭"  %  (2)
print(strvar)

# %-2d 占两位 (不够两位拿空格来补位) 原字符串具左
strvar = "昨天买了%-2d鸡腿饭"  %  (2)
print(strvar)

# %f 浮点型占位符
strvar = "小王一个月开%f工资" % (9.9)
print(strvar)

# %.2f 保留小数点后面两位小数 (存在四舍五入的情况,默认保留六位小数)
strvar = "小王一个月开%.2f工资" % (9.178)
print(strvar)

# %s 字符串占位符
strvar = "%s最喜欢吃鸡腿" % ("小王")
print(strvar)

f-Strings

str.format() 比 %格式化高级了一些,但是它还是有自己的缺陷。当需要传入的字符串过多时,仍然会显得非常冗长。与在Python 3.6中引入 了f-strings,不仅比str.format更简洁,性能上也更胜一筹

​ f-string是以f或F开头的字符串, 核心在于字符串中符号{}的使用

{}中可以是变量名

name = 'egon'
age = 18
print(f'{name} {age}')  # egon 18
print(F'{age} {name}')  # 18 egon

{}中可以是表达式

# 可以在{}中放置任意合法的Python表达式,会在运行时计算
# 比如:数学表达式
print(f'{3*3/2}') # 4.5

# 比如:函数的调用
def foo(n):
    print('foo say hello')
    return n

print(f'{foo(10)}') # 会调用foo(10),然后打印其返回值

# 比如:调用对象的方法
name='EGON'
print(f'{name.lower()}') # egon

在类中的使用

>>> class Person(object):
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def __str__(self):
...         return f'{self.name}:{self.age}'
...     def __repr__(self):
...         return f'===>{self.name}:{self.age}<==='
... 
>>> 
>>> obj=Person('egon',18)
>>> print(obj) # 触发__str__
egon:18
>>> obj        # 触发__repr__
===>egon:18<===
>>> 
>>> 
>>> 
>>> # 在f-Strings中的使用
>>> f'{obj}'   # 触发__str__
'egon:18'
>>> f'{obj!r}' # 触发__repr__
'===>egon:18<==='  

多行f-Stings

# 当格式化字符串过长时,如下列表info
name = 'Egon'
age = 18
gender = 'male'
hobbie1='play'
hobbie2='music'
hobbie3='read'
info = [f'名字:{name}年龄:{age}性别:{gender}',f'第一个爱好:{hobbie1}第二个爱好:{hobbie2}第三个爱好:{hobbie3}'] 

# 我们可以回车分隔到多行,注意每行前都有一个f
info = [
    # 第一个元素
    f'名字:{name}'
    f'年龄:{age}'
    f'性别:{gender}',

    # 第二个元素
    f'第一个爱好:{hobbie1}'
    f'第二个爱好:{hobbie2}'
    f'第三个爱好:{hobbie3}'
]

print(info)
# ['名字:Egon年龄:18性别:male', '第一个爱好:play第二个爱好:music第三个爱好:read']

引号的嵌套

# 当字符串嵌套发送冲突时,与正常的字符串处理方式是一样的
# 1、外层为单引号,内层嵌套也为单引号,并且想要输入的内容也为单引号,那么外层需要改用双引号
print("my name is 'egon'")

# 2、外层为单引号,内层嵌套也为单引号,并且想要输入的内容也为单引号,需要用到转义
print('my name is \'egon\'')

注意

#1、反斜杠可以用来进行字符转义,但不能用在{}的表达式中
f'{1\2}' # 语法错误

#2、注释#号也不能出现在{}的表达式中
f'{x#}' # 语法错误

括号的处理

基于3.5我们得知,不能在{}内出现反斜杠\,所以,当我们的输出的结果中需要包含{}时,下面的做法就是错误的

print(f'\{天王盖地虎\}')

类似于输出%号的做法

>>> print('%s%%' %30)
30%

若想输出{},那么需要在原有的基础上再套一层,如下

print(f'{{天王盖地虎}}') # {天王盖地虎}

print(f'{{{{天王盖地虎}}}}') # {{天王盖地虎}}

性能对比=>f_Stings性能最高

from timeit import timeit


def test_s():
    name = 'Egon'
    age = 18
    return '%s:%s.' % (name, age)


def test_format():
    name = 'Egon'
    age = 18
    return '{}:{}.'.format(name, age)


def test_f_strings():
    name = 'Egon'
    age = 18
    return f'{name}:{age}.'


res1 = timeit(test_s, number=1000000)
res2 = timeit(test_format, number=1000000)
res3 = timeit(test_f_strings, number=1000000)
print(res1) # 0.3709844550030539
print(res2) # 0.47834375899401493
print(res3) # 0.3111891380031011, 最快

 

format的填充符号的使用( ^、>、< )

^ 原字符串居中显示
> 原字符串居右显示
< 原字符串居左显示

{who:*^10}
* : 填充的符号
^ : 原字符串居中显示
10: 原字符串长度 + 填充符号的长度 = 10

strvar = "{who:*^10}去医药公司,{do:>>10},感觉{feel:!<10}".format(who="张三",do="扎疫苗",feel="血槽被掏空")
print(strvar)

 

进制转换等特殊符号的使用( :d :f :s :, )

:d 整型占位符 (强制要求类型是整型)

strvar = "张三昨天晚上买了{:d}个花露水泡脚".format(9)
print(strvar)

 

:3d 占3位,不够三位拿空格来补位(原字符串居右)

strvar = "张三昨天晚上买了{:3d}个花露水泡脚".format(9)
print(strvar)
strvar = "张三昨天晚上买了{:<3d}个花露水泡脚".format(9)
print(strvar)
strvar = "张三昨天晚上买了{:^3d}个花露水泡脚".format(9)
print(strvar)

 

:f 浮点型占位符 (强制要求类型是浮点型) 默认保留小数6位

strvar = "张三毕业之后的薪资是{:f}".format(9.9)
print(strvar)

 

:.2f 小数点后保留2位,存在四舍五入

strvar = "张三毕业之后的薪资是{:.2f}".format(9.188888)
print(strvar)

 

:s 字符串占位符

strvar = "{:s}".format("赵子龙真帅")
print(strvar)

 

:, 金钱占位符

strvar = "{:,}".format(12345678)
print(strvar)

 

综合案例

strvar = "{:s}开工资{:.2f}元,买了{:d}个兰博基尼".format("张三",300000.12345,10)
print(strvar)

 

字符串类型下标访问

特征: 可获取,不可修改,有序

# 正向索引   0 1 2 3 4 5 6 7 8
strvar =    "看你,我就心跳加速"
# 逆向索引  -9-8-7-6-5-4-3-2-1

# 获取字符串中的元素
print(strvar[3])
print(strvar[-6])

# 不能修改字符串中的元素
# strvar[3] = "你" error

 

字符串相关操作

字符串的拼接 +

str1 = "小马哥,"
str2 = "so strong"
res = str1 + str2
res = "小马哥," + "so strong"
print(res)

# res = res + ",旁边的同学很喜欢他~"
res += ",旁边的同学很喜欢他~"
print(res)

 

字符串的重复 *

strvar = "重要的事情说三遍~"
res = strvar * 3
print(res)

 

字符串跨行拼接 \

str1 = "螺蛳粉" \
"1122334"
print(str1)

 

字符串的索引

#          0 1 2 3 4 5
strvar = "赵云真帅呀"
#         -6-5-4-3-2-1
print(strvar[1])

 

字符串的切片: (截取)

语法 => 字符串[::]  完整格式:[开始索引:结束索引:间隔值]
    (1)[开始索引:]  从开始索引截取到字符串的最后
    (2)[:结束索引]  从开头截取到结束索引之前(结束索引-1)
    (3)[开始索引:结束索引]  从开始索引截取到结束索引之前(结束索引-1)
    (4)[开始索引:结束索引:间隔值]  从开始索引截取到结束索引之前按照指定的间隔截取字符
    (5)[:]或[::]  截取所有字符串

strvar = "赵子龙是这个宇宙当中,最完美,无暇,善良,漂亮,英俊,帅气,潇洒,风流倜傥的神秘男孩"
# (1)[开始索引:]  从开始索引截取到字符串的最后
res = strvar[3:]
print(res)
    
# (2)[:结束索引]  从开头截取到结束索引之前(结束索引-1)
"""4这个最大值本身获取不到,要获取到4之前的那一个数据 : 取头舍尾"""
res = strvar[:5]
print(res)
    
# (3)[开始索引:结束索引]  从开始索引截取到结束索引之前(结束索引-1)
res = strvar[10:16]
print(res)

# (4)[开始索引:结束索引:间隔值]  从开始索引截取到结束索引之前按照指定的间隔截取字符

# 从左向右截取
res = strvar[::3]
# 0 3 6 9 12 15 ... 
print(res)

# 从右向左截取
res = strvar[::-1]
# -1 -2 -3 -4 -5 -6 .... 
print(res)

res = strvar[-3:-10:-2]
# -3 -5 -7 -9   
print(res)


从左到右截,间隔值为正值,反过来,间隔值是负值,才能保证截取到数据

res = strvar[-3:-10:10] # 错误的逻辑
print(res)
res = strvar[1:10]
print(res)

 

字符串相关函数

capitalize

字符串首字母大写 

strvar = "how are you"
res = strvar.capitalize()
print(res)

 

title

每个单词的首字母大写 

strvar = "how old are you"
res = strvar.title()
print(res)

 

upper

将所有字母变成大写

strvar = "How Old Are You"
res = strvar.upper()
print(res)

 

lower

将所有字母变成小写 

res = strvar.lower()
print(res)

 

swapcase

大小写互换 

strvar = "How old Are You"
res = strvar.swapcase()
print(res)

 

len

计算字符串的长度 

strvar = "python32真热"
res = len(strvar)
print(res)

 

count

统计字符串中某个元素的数量 

count(字符,[开始值,结束值])

strvar = "真热真热呀"
res = strvar.count("真")     # 2
# res = strvar.count("热",2)   # 1
# res = strvar.count("热",2,3) # 只有真这个字符 没有热
print(res)

 

find

查找某个字符串第一次出现的索引位置  (推荐)
find(字符,[开始值,结束值])

strvar = "To be or not to be that is a question"
res = strvar.find("to")
res = strvar.find("be",4)
# 如果find 返回的是 -1 代表没找到
res = strvar.find("be",4,10) # 4 ~ 9
print(res)

 

index

index 与 find 功能相同 find找不到返回-1,index找不到数据直接报错

res = strvar.index("be",4,10) 
print(res)


startswith

判断是否以某个字符或字符串为开头 

startswith(字符,[开始值,结束值])

strvar = "To be or not to be that is a question"
res = strvar.startswith("To")
res = strvar.startswith("To",10)
print(res)

 

endswith

判断是否以某个字符或字符串结尾 

endswith(字符,[开始值,结束值])
res = strvar.endswith("question")
res = strvar.endswith("is",-14,-11) #  is
print(res)

 


isupper

判断字符串是否都是大写字母 

strvar = "HOW  A  YOU"
res = strvar.isupper()
print(res)

 

islower

判断字符串是否都是小写字母 

strvar = "asdf - as"
res = strvar.islower()
print(res)

 

isdecimal

检测字符串是否以数字组成  必须是纯数字

strvar = "abcdefg"
strvar = "2134234.123"
strvar = "2134234"
res = strvar.isdecimal()
print(res)

 


split

按某字符将字符串分割成列表(默认字符是空格)  

strvar = "you can you up no can no bb"
lst = strvar.split()
strvar = "you#can#you#up#no#can#no#bb"
lst = strvar.split("#")
print(lst)

 

join  

按某字符将列表拼接成字符串(容器类型都可)   

lst = ['you', 'can', 'you', 'up', 'no', 'can', 'no', 'bb']
strvar = " ".join(lst)
strvar = "#".join(lst)
print(strvar)

 

replace

把字符串的旧字符换成新字符

字符串.replace('旧字符','新字符'[, 限制替换的次数])

strvar = "范冰冰爱不爱我,爱我,不爱我,爱我,不爱我"
res = strvar.replace("不爱我","爱我")
# 选择替换的次数
res = strvar.replace("不爱我","爱我",1)
print(res)

 

strip  

默认去掉首尾两边的空白符  ***

空白符 空格 \n \t \r ... 

strvar = "     周润发  "
res = strvar.strip()
print(strvar)
print(res)

 

center

填充字符串,原字符居中 (默认填充空格)

center(字符长度,填充符号)

strvar = "赵世超"
res = strvar.center(10)
# res = strvar.center(10,"*")
print(res)

 

posted @ 2022-10-22 23:36  屠魔的少年  阅读(8)  评论(0)    收藏  举报