字符串类型 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)
浙公网安备 33010602011771号