Loading...
墨滴

瀋凣

2021/11/24  阅读:35  主题:极简黑

python笔记24

Python day24

1. 字符串

1.6 截取

1.6.1 lstrip()rstrip()strip()

lstrip()\ rstrip() \ strip()方法用于截掉字符串 左边 \ 右边 \ 左右两边 的空格或指定字符。

语法
str.lstrip([chars])
str.rstrip([chars])

#chars --指定截取的字符。
举个栗子:

不加参数(默认为空格)

>>> x = "      左侧不要留白!"
>>> x.lstrip()
'左侧不要留白!'
>>> y = "右侧不要留白!      "
>>> y.rstrip()
'右侧不要留白!'
>>> z = "   左右不要留白!   "
>>> z.strip()
'左右不要留白!'

加上参数

>>> _ = "www.vanovel.com"
>>> _.lstrip("wcom.")
'vanovel.com'
>>> _.rstrip("wcom.")
'www.vanovel'
>>> _.strip("wcom.")
'vanovel'
黑人问号.jpg
黑人问号.jpg

为什么这截取的方式我看不懂了呢?

无字符集参数或为 None 时移除空格,str 时移除所有属于字符集子串的字符一旦不属于则停止移除并返回字符串副本。

所以一旦遇到以下情况,strip()方法就要歇逼了:

>>> weather = "今天天气很好"
>>> weather.lstrip("今天")
'气很好'

怎么办呢?

1.6.2 removeprefix()removesuffix()

python3.9新特性:截取原字符串中参数指定的字符串 前缀 \ 后缀

语法
str.removeprefix(substring)
str.removesuffix(substring)

#sub --指定截取的字符串
举个栗子:
>>> _ = "www.vanovel.com"
>>> _.removeprefix("www.")
'vanovel.com'
>>> _.removesuffix(".com")
'www.vanovel'

有了这两个方法,上面的尴尬问题就不再是问题了~

>>> weather = "今天天气很好"
>>> weather.removeprefix("今天")
'天气很好'

1.7 拆分和拼接

1.7.1 partition()rpartition()

partition() 方法用来根据指定的分隔符将字符串进行分割。
如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串

语法
str.partition(str)

#str --指定的分隔符。
举个栗子:
>>> _ = "www.vanovel.com"
>>> _.partition(".")
('www''.''vanovel.com')
>>> _.rpartition(".")
('www.vanovel''.''com')

1.7.2 split()rsplit()

split()\ rsplit() 通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。

语法
str.split(str="", num=string.count(str))
str.rsplit(str="", num=string.count(str))

#str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
#num -- 分割次数。默认为 -1, 即分隔所有。
举个栗子:
>>> s = "苟日新 日日新 又日新"
>>> s.split()
['苟日新''日日新''又日新']
>>> s2 = "苟日新,日日新,又日新"
>>> s2.split(",")
['苟日新''日日新''又日新']
>>> s2.rsplit(",")
['苟日新''日日新''又日新']
>>> s2.rsplit(",",1)
['苟日新,日日新''又日新']

练习:

  • 将如下包含换行符的字符串按照换行符进行拆分
"苟日新\n日日新\n又日新"

答案显而易见:

>>> "苟日新\n日日新\n又日新".split("\n")

但不同操作系统下的换行符不尽相同。如:linux下的换行符为\n,MacOS下为\r,Windows下为\r\n

那么这段代码到不同操作系统下就要进行适配修改。

而且你也拦不住有大聪明写这样的字符串:

s = """hello
world\nand\rpython\r\njava"""

逐渐陷入疯狂
逐渐陷入疯狂

这要怎么分呢?

1.7.3 splitlines()

splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keependsFalse,不包含换行符,如果为 True,则保留换行符。

语法
str.splitlines([keepends])

#keepends -- 在输出结果里是否去掉换行符('\r', '\r\n', \n'),默认为 False,不包含换行符,如果为 True,则保留换行符。
举个栗子:
>>> s.splitlines()
['hello''world''and''python''java']

其实这个split()也可以:

>>> s.split()
['hello''world''and''python''java']

但是splitlines()有它独特的地方:它可以填入参数keepends(True\False)来决定是否保留换行符在结尾:

>>> s.splitlines(True)
['hello\n''world\n''and\r''python\r\n''java']

1.7.4 join()

join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

语法
str.join(sequence)

#sequence -- 要连接的元素序列。
举个栗子:
>>> ".".join(['www''vanovel''com'])
'www.vanovel.com'
>>> ".".join(('www''vanovel''com'))
'www.vanovel.com'

join()方法通常也被我们用于字符串的拼接:

新手程序猿的写法:

>>> s = "Hello"
>>> s += s
>>> s
'HelloHello'

老手程序猿的写法:

>>> "".join(("Hello","Hello"))
'HelloHello'

为什么???

当拼接的数据比较少的时候,两者差别不大,但随着数据的增加,两者的性能差距越来越大……
由此可以看出,使用加号拼接的方式,一旦碰到大数据处理的时候,性能是非常非常缓慢的。
这就是大牛忠爱 join() 方法的原因啦~


《字符串拼接速度大比拼》

>>> # 字符串拼接速度大比拼 #
>>> # test1 是加号(+)拼接法
>>> def test1(n):
        result = ""
        for i in range(n):
                result += "FishC"
        return result

>>> # test2 是使用字符串的join()方法进行拼接
>>> def test2(n):
        str_list = []
        for i in range(n):
                str_list.append("FishC")
        return "".join(str_list)

>>> # 测试开始 #
>>> # timeit模块是用于计时滴,咱以后会讲到^o^
>>> import timeit
>>> 
>>> # 第一轮:1万个 "FishC" 拼接 #
>>> timeit.timeit("test1(10000)", setup="from __main__ import test1", number=1)
0.0012263000000984903
>>> timeit.timeit("test2(10000)", setup="from __main__ import test2", number=1)
0.0009582000000136759
>>> 
>>> # 第二轮:10万个 "FishC" 拼接 #
>>> timeit.timeit("test1(100000)", setup="from __main__ import test1", number=1)
0.011719300000095245
>>> timeit.timeit("test2(100000)", setup="from __main__ import test2", number=1)
0.006204399999887755
>>> 
>>> # 第三轮:100万个 "FishC" 拼接 #
>>> timeit.timeit("test1(1000000)", setup="from __main__ import test1", number=1)
1.2601186999997935
>>> timeit.timeit("test2(1000000)", setup="from __main__ import test2", number=1)
0.08013690000007045
>>> 
>>> # 第四轮:1000万个 "FishC" 拼接 #
>>> timeit.timeit("test1(10000000)", setup="from __main__ import test1", number=1)
131.86178619999987
>>> timeit.timeit("test2(10000000)", setup="from __main__ import test2", number=1)
0.8771347999995669
>>> 
>>> # 第五轮:1亿个 "FishC" 拼接 #
>>> timeit.timeit("test1(100000000)", setup="from __main__ import test1", number=1)
13738.4885822
>>> timeit.timeit("test2(100000000)", setup="from __main__ import test2", number=1)
8.882412499999191
点点关注不迷路
点点关注不迷路
- END -

瀋凣

2021/11/24  阅读:35  主题:极简黑

作者介绍

瀋凣