轻松熊喵喵个人笔记 -- Python字符串(下)
字符串切片 slice 操作
切片 slice 操作可以让我们快速的提取子字符串。标准格式为:
[起始偏移量 start:终止偏移量 end:步长 step]
典型操作(三个量为正数的情况)如下:
其他操作(三个量为负数)的情况:
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于 0 则会当做 0,终止偏移量大于“长度-1”会被当成-1。例如:
>>> "abcdefg"[3:50]
'defg'
我们发现正常输出了结果,没有报错。
【操作】
- 将”to be or not to be”字符串倒序输出
- 将”sxtsxtsxtsxtsxt”字符串中所有的 s 输出
split()分割和 join()合并
split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。示例代码如下:
>>> a = "to be or not to be" >>> a.split()
['to', 'be', 'or', 'not', 'to', 'be']
>>> a.split('be')
['to ', ' or not to ', '']
join()的作用和 split()作用刚好相反,用于将一系列子字符串连接起来。示例代码如下:
>>> a = ['sxt','sxt100','sxt200']
>>> '*'.join(a)
'sxt*sxt100*sxt200'
拼接字符串要点:
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐使用 join 函数,因为 join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
【操作】测试+拼接符和 join(),不同的效率 (mypy_07.py)
import time
time01 = time.time() #起始时刻
a = ""
for i in range(1000000):
a += "sxt"
time02 = time.time() #终止时刻
print("运算时间:"+str(time02-time01))
time03 = time.time() #起始时刻
li = []
for i in range(1000000):
li.append("sxt")
a = "".join(li)
time04 = time.time() #终止时刻
print("运算时间:"+str(time04-time03))
字符串驻留机制和字符串比较
字符串驻留:
仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母和数字)会启用字符串驻留机制驻留机制。
>>> a = "abd_33" >>> b = "abd_33" >>> a is b
True
>>> c = "dd#" >>> d = "dd#" >>> c is d
False
>>> str1 = "aa" >>> str2 = "bb" >>> str1+str2 is "aabb"
False
>>> str1+str2 == "aabb" True
字符串比较和同一性
我们可以直接使用==,!=对字符串进行比较,是否含有相同的字符。
我们使用 is / not is,判断两个对象是否同一个对象。比较的是对象的地址,即 id(obj1)是否和 id(obj2)相等。
成员操作符
in /not in 关键字,判断某个字符(子字符串)是否存在于字符串中。
字符串常用方法汇总
字符串有很多常用的方法,我们需要熟悉。我们通过表格将这些方法汇总起来,方便大家查阅。希望大家针对每个方法都做一次测试。
常用查找方法
我们以一段文本作为测试:
a=’’‘我是轻松熊,今年 3 岁了。我有个队友叫喵熊,她也 3 岁了。我喜欢打网球,喵熊也喜欢打网球,希望她将来能够打败我’’
去除首尾信息
我们可以通过 strip()去除字符串首尾指定信息。通过 lstrip()去除字符串左边指定信息,rstrip()去除字符串右边指定信息。
【操作】去除字符串首尾信息
>>> "*q*s*x*".strip("*")
'q*s*x' >>> "*q*s*x*".lstrip("*")
'q*s*x*' >>> "*q*s*x*".rstrip("*")
'*q*s*x' >>> " qsx ".strip()
'qsx'
大小写转换
编程中关于字符串大小写转换的情况,经常遇到。我们将相关方法汇总到这里。为了方便学习,先设定一个测试变量:
a = “icebear love programming, love SPORT”
格式排版
center()、ljust()、rjust()这三个函数用于对字符串实现排版。示例如下:
>>> a="QSX" >>> a.center(10,"*")
'***QSX****' >>> a.center(10)
' QSX ' >>> a.ljust(10,"*")
'QSX*******'
其他方法
- isalnum() 是否为字母或数字
- isalpha() 检测字符串是否只由字母组成(含汉字)。
- isdigit() 检测字符串是否只由数字组成。
- isspace() 检测是否为空白符
- isupper() 是否为大写字母
- islower() 是否为小写字母
>>> "qsx100".isalnum()
True
>>> "qsx 轻松熊".isalpha()
True
>>> "234.3".isdigit()
False
>>> "23423".isdigit()
True
>>> "aB".isupper()
False
>>> "A".isupper()
True
>>> "\t\n".isspace()
True
字符串的格式化
format()基本用法
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
format 函数可以接受不限个参数,位置可以不按顺序。
我们通过示例进行格式化的学习。
>>> a = "名字是:{0},年龄是:{1}"
>>>> a.format("轻松熊",18)
'名字是:轻松熊,年龄是:18'
>>> a.format("喵熊",3)
'名字是:喵熊,年龄是:3'
>>> b = "名字是:{0},年龄是{1}。{0}是个好小伙"
>>> b.format("轻松熊",18)
'名字是:轻松熊,年龄是 18。高淇是个好小伙'
>>> c = "名字是{name},年龄是{age}"
>>> c.format(age=19,name='轻松熊')
'名字是轻松熊,年龄是 19'
我们可以通过{索引}/{参数名},直接映射参数值,实现对字符串的格式化,非常方便。
填充与对齐
填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充
>>> "{:*>8}".format("245")
'*****245' >>> "我是{0},我喜欢数字{1:*^8}".format("轻松熊","666")
'我是轻松熊,我喜欢数字**666***'
数字格式化
浮点数通过 f,整数通过 d 进行需要的格式化。案例如下:
>>> a = "我是{0},我的存款有{1:.2f}" >>> a.format("轻松熊",3888.234342)
'我是轻松熊,我的存款有 3888.23'
其他格式,供大家参考:
可变字符串
在 Python 中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,智能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO
对象或 array 模块。
>>> import io
>>> s = "hello, qsx"
>>> sio = io.StringIO(s)
>>> sio
<_io.StringIO object at 0x02F462B0>
>>> sio.getvalue()
'hello, qsx'
>>> sio.seek(7)
7
>>> sio.write("g")
1
>>> sio.getvalue()
'hello, gsx'
作业
-
从控制台输入用户的月薪,进行运算计算出年薪。打印输出用户的年薪.
-
使用字符串复制,用计算机打印出“爱你一百遍”,打印 100 次,将”to be or not to be”字符串倒序输出。
-
将”qsxqsxqsxqsx”字符串中所有的 s 输出。
-
判断如下输出结果,并文字解释原因:
>>> a = "abd_33"
>>> b = "abd_33"
>>> c = "dd#"
>>> d = "dd#"
>>> a is b #输出 true or false?
>>> c is d #输出 true or false?
- 写出如下代码打印的结果:
>>> c = "名字是{name},年龄是{age}"
>>> c.format(age=19,name=''轻松熊")
参考:百战尚学堂 – 高淇老师