2023/1/11python学习笔记(字符串)

字符串

引入字符串方法可以轻松解决回文数问题

>>> x = "12321"
>>> "是回文数。" if x == x[::-1] else "不是回文数。"
'是回文数。'

1字符串大小写改变方法

capitalize()将首字母改为大写

casefold()将所有的字母改为小写

title()将每个单词的第一个字母改为大写

swapcase()将大小写字母反转

upper()将所有字母变为大写

lower()将所有的字母变为小写

>>> x = "I love FishC"
>>> x.capitalize()
'I love fishc'
>>> x.casefold()
'i love fishc'
>>> x.title()
'I Love Fishc'
>>> x.swapcase()
'i LOVE fISHc'
>>> x.upper()
'I LOVE FISHC'
>>> x.lower()
'i love fishc'

2字符串左右中对齐

center(width, fillchar=' ')居中对齐

ljust(width, fillchar=' ')左对齐

rjust(width, fillchar=' ')右对齐

zfill(width)在左边加0使其变为想要的长度

>>> x = "有内鬼,停止交易!"
>>> x.center(15)
'   有内鬼,停止交易!   '
>>> x.ljust(15)
'有内鬼,停止交易!      '
>>> x.rjust(15)
'      有内鬼,停止交易!'
>>> x.zfill(15)
'000000有内鬼,停止交易!'
>>> "520".zfill(5)
'00520'
>>> "-520".zfill(5)
'-0520'
>>> x.center(15, "淦")
'淦淦淦有内鬼,停止交易!淦淦淦'
>>> x.ljust(15, "淦")
'有内鬼,停止交易!淦淦淦淦淦淦'
>>> x.rjust(15, "淦")
'淦淦淦淦淦淦有内鬼,停止交易!'

3字符串的查找

count(sub[, start[, end]])、find(sub[, start[, end]])、rfind(sub[, start[, end]])、index(sub[, start[, end]])、rindex(sub[, start[, end]])

>>> x = "上海自来水来自海上"
>>> x.count("海")
2
>>> x.count("海", 0, 5)
1
>>> x.find("海")
1
>>> x.rfind("海")
7
>>> x.find("龟")
-1
>>> x.index("龟")
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    x.index("龟")
ValueError: substring not found

4字符串的替换

expandtabs([tabsize=8])、replace(old, new, count=-1)、translate(table)

首先是 expandtabs([tabsize=8]) 方法,它的作用是使用空格替换制表符并返回新的字符串。

>>> new_code = code.expandtabs(4)
>>> print(new_code)
    
    print("I love FishC.")
    print("I love my wife.")
>>>

replace(old, new, count=-1) 方法返回一个将所有 old 参数指定的子字符串替换为 new 的新字符串。另外,还有一个 count 参数是指定替换的次数,默认值 -1 表示替换全部。

>>> "在吗!我在你家楼下,快点下来!!".replace("在吗", "想你")
'想你!我在你家楼下,快点下来!!'

translate(table) 方法,这个是返回一个根据 table 参数(用于指定一个转换规则的表格)转换后的新字符串。

需要使用 str.maketrans(x[, y[, z]]) 方法制定一个包含转换规则的表格。

>>> table = str.maketrans("ABCDEFG", "1234567")
>>> "I love FishC.com".translate(table)
'I love 6ish3.com'

这个 str.maketrans() 方法还支持第三个参数,表示将其指定的字符串忽略:

>>> "I love FishC.com".translate(str.maketrans("ABCDEFG", "1234567", "love"))
'I  6ish3.cm'

5字符串判断

startswith(prefix[, start[, end]])、endswith(suffix[, start[, end]])、istitle()、isupper()、islower()、isalpha()、isascii()、isspace()、isprintable()、isdecimal()、isdigit()、isnumeric()、isalnum()、isidentifier()

这 14 个方法都是应对各种情况的判断,所以返回的都是一个布尔类型的值 —— 要么是 True,要么是 False。

startswith(prefix[, start[, end]]) 方法用于判断 prefix 参数指定的子字符串是否出现在字符串的起始位置

>>> x = "我爱Python"
>>> x.startswith("我")
True
>>> x.startswith("小甲鱼")
False

对应的,endswith(suffix[, start[, end]]) 方法则相反,用于判断 suffix 参数指定的子字符串是否出现在字符串的结束位置:

>>> x.endswith("Python")
True
>>> x.endswith("C")
False

两个方法都有start和end两个可选的参数,可指定匹配的开始和结束位置

>>> x.startswith("我", 1)
False
>>> x.startswith("爱", 1)
True
>>> x.endswith("Py")
False
>>> x.endswith("Py", 0, 4)
True

如果你希望判断一个字符串中的所有单词是否都是以大写字母开头,其余字母均为小写,那么可以使用 istitle() 方法进行测试:

>>> x = "I Love Python"
>>> x.istitle()
True

如果你希望判断一个字符串中所有字母是否都是大写,可以使用 isupper() 方法进行测试:

>>> x.isupper()
False
>>> x.upper().isupper()
True

相反,判断是否所有字母都是小写,用 islower() 方法,我们这里就不再赘述了。

如果你希望判断一个字符串中是否只是由字母组成,可以使用 isalpha() 方法进行检测:

>>> x.isalpha()
False
>>> "IlovePython".isalpha()
True

如果你希望判断一个字符串中是否只是由 ASCII 字符组成,可以使用 isascii() 方法进行检测:

>>> x.isascii()
True
>>> "我爱Pyhon".isascii()
False

如果你希望判断是否为一个空白字符串,可以用 isspace() 方法进行检测:

>>> "    \t\n".isspace()
True

如果你希望判断一个字符串中是否所有字符都是可打印的,可以使用 isprintable() 方法:

>>> x.isprintable()
True
>>> "I love FishC\n".isprintable()
False

isdecimal()、isdigit() 和 isnumeric() 三个方法都是用来判断数字的。

首先是十进制数字:

>>> x = "12345"
>>> x.isdecimal()
True
>>> x.isdigit()
True
>>> x.isnumeric()
True

如果写成罗马数字:

>>> x = "ⅠⅡⅢⅣⅤ"
>>> x.isdecimal()
False
>>> x.isdigit()
False
>>> x.isnumeric()
True

或者中文数字:

>>> x = "一二三四五"
>>> x.isdecimal()
False
>>> x.isdigit()
False
>>> x.isnumeric()
True

最后,isidentifier() 方法用于判断该字符串是否一个合法的 Python 标识符

>>> "I a good gay".isidentifier()
False
>>> "I_a_good_gay".isidentifier()
True
>>> "FishC520".isidentifier()
True
>>> "520FishC".isidentifier()
False

就是如果你想判断一个字符串是否为 Python 的保留标识符,就是像 “if”、“for”、“while” 这些关键字的话,可以使用 keyword 模块的 iskeyword() 函数来实现:

>>> import keyword
>>> keyword.iskeyword("if")
True
>>> keyword.iskeyword("py")
False

6字符串的截取

lstrip(chars=None)、rstrip(chars=None)、strip(chars=None)、removeprefix(prefix)、removesuffix(suffix)

这几个方法都是用来截取字符串的:

>>> "    左侧不要留白".lstrip()
'左侧不要留白'
>>> "右侧不要留白    ".rstrip()
'右侧不要留白'
>>> "    左右不要留白    ".strip()
'左右不要留白'

这三个方法都有一个 chars=None 的参数,None 在 Python 中表示没有,意思就是去除的是空白。

那么这个参数其实是可以给它传入一个字符串的:

>>> "www.ilovefishc.com".lstrip("wcom.")
'ilovefishc.com'
>>> "www.ilovefishc.com".rstrip("wcom.")
'www.ilovefish'
>>> "www.ilovefishc.com".strip("wcom.")
'ilovefish'

如果只是希望踢掉一个具体的子字符串,应该怎么办?

那么你可以考虑 removeprefix(prefix) 和 removesuffix(suffix) 这两个方法。

它们允许你指定将要删除的前缀或后缀:

>>> "www.ilovefishc.com".removeprefix("www.")
'ilovefishc.com'
>>> "www.ilovefishc.com".removesuffix(".com")
'www.ilovefishc'

7字符串拆分

partition(sep)、rpartition(sep)、split(sep=None, maxsplit=-1)、rsplit(sep=None, maxsplit=-1)、splitlines(keepends=False)

拆分字符串,言下之意就是把字符串给大卸八块,比如 partition(sep) 和 rpartition(sep) 方法,就是将字符串以 sep 参数指定的分隔符为依据进行切割,返回的结果是一个 3 元组(3 个元素的元组):

>>> "www.ilovefishc.com".partition(".")
('www', '.', 'ilovefishc.com')

partition(sep) 和 rpartition(sep) 方法的区别是前者是从左往右找分隔符,后者是从右往左找分隔符:

>>> "ilovefishc.com/python".partition("/")
('ilovefishc.com', '/', 'python')

注意:它俩如果找不到分隔符,返回的仍然是一个 3 元组,只不过将原字符串放在第一个元素,其它两个元素为空字符串。

split(sep=None, maxsplit=-1) 和 rsplit(sep=None, maxsplit=-1) 方法则是可以将字符串切成一块块:

>>> "苟日新,日日新,又日新".split(",")
['苟日新', '日日新', '又日新']
>>> "苟日新,日日新,又日新".rsplit(",")
['苟日新', '日日新', '又日新']
>>> "苟日新,日日新,又日新".split(",", 1)
['苟日新', '日日新,又日新']
>>> "苟日新,日日新,又日新".rsplit(",", 1)
['苟日新,日日新', '又日新']

splitlines(keepends=False) 方法会将字符串进行按行分割,并将结果以列表的形式返回:

>>> "苟日新\n日日新\n又日新".splitlines()
['苟日新', '日日新', '又日新']
>>> "苟日新\r日日新\r又日新".splitlines()
['苟日新', '日日新', '又日新']
>>> "苟日新\r日日新\r\n又日新".splitlines()
['苟日新', '日日新', '又日新']

keepends 参数用于指定结果是否包含换行符,True 是包含,默认 False 则表示是不包含:

>>> "苟日新\r日日新\r\n又日新".splitlines(True)
['苟日新\r', '日日新\r\n', '又日新']

8字符串的拼接

join(iterable) 方法是用于实现字符串拼接的。

虽然的它的用法在初学者看来是非常难受的,但是在实际开发中,它却常常是受到大神追捧的一个方法。

字符串是作为分隔符使用,然后 iterable 参数指定插入的子字符串:

>>> ".".join(["www", "ilovefishc", "com"])
'www.ilovefishc.com'
>>> "^".join(("F", "ish", 'C'))
'F^ish^C'
>>> "".join(("FishC", "FishC"))
'FishCFishC'

9字符串格式化

在字符串中,格式化字符串的套路就是使用一对花括号({})来表示替换字段,就在原字符串中先占一个坑的意思,然后真正的内容被放在了 format() 方法的参数中。

比如:

>>> year = 2010
>>> "鱼C工作室成立于 year 年。"
'鱼C工作室成立于 year 年。'
>>> "鱼C工作室成立于 {} 年。".format(year)
'鱼C工作室成立于 2010 年。'

又比如:

>>> "1+2={}, 2的平方是{},3的立方是{}".format(1+2, 2*2, 3*3*3)
'1+2=3, 2的平方是4,3的立方是27'

在花括号里面,可以写上数字,表示参数的位置:

>>> "{1}看到{0}就很激动!".format("小甲鱼", "漂亮的小姐姐")
'漂亮的小姐姐看到小甲鱼就很激动!'

注意,同一个索引值是可以被多次引用的:

>>> "{0}{0}{1}{1}".format("是", "非")
'是是非非'

还可以通过关键字进行索引,比如:

>>> "我叫{name},我爱{fav}。".format(name="小甲鱼", fav="Pyhon")
'我叫小甲鱼,我爱Pyhon。'

当然,位置索引和关键字索引可以组合使用:

>>> "我叫{name},我爱{0}。喜爱{0}的人,运气都不会太差^o^".format("python", name="小甲鱼")
'我叫小甲鱼,我爱python。喜爱python的人,运气都不会太差^o^'

如果我只是想单纯的输出一个纯洁的花括号,那应该怎么办呢?

有两种办法可以把这个纯洁的花括号安排进去:

>>> "{}, {}, {}".format(1, "{}", 2)
'1, {}, 2'
>>> "{}, {
    
    {}}, {}".format(1, 2)
'1, {}, 2'

字符串格式化语法参考

>>> "{:^}".format(250)
'250'
>>> "{:^10}".format(250)
'   250    '
>>> "{1:>10}{0:<10}".format(520, 250)
'       250520       '
>>> "{left:>10}{right:<10}".format(right=520, left=250)
'       250520       '

填充选项

在指定宽度的前面还可以添加一个 '0',则表示为数字类型启用感知正负号的 '0' 填充效果:

>>> "{:010}".format(520)
'0000000520'
>>> "{:010}".format(-520)
'-000000520'

注意,这种用法只对数字有效.

还可以在对齐([align])选项的前面通过填充选项([fill])来指定填充的字符:

>>> "{1:%>10}{0:%<10}".format(520, 250)
'%%%%%%%250520%%%%%%%'
>>> "{:0=10}".format(520)
'0000000520'
>>> "{:0=10}".format(-520)
'-000000520'

符号([sign])选项

符号([sign])选项仅对数字类型有效,可以使用下面3个值:

精度([.precision])选项

精度([.precision])选项是一个十进制整数,对于不同类型的参数,它的效果是不一样的:

对于以 'f' 或 'F' 格式化的浮点数值来说,是限定小数点后显示多少个数位

对于以 'g' 或 'G' 格式化的浮点数值来说,是限定小数点前后共显示多少个数位

对于非数字类型来说,限定最大字段的大小(换句话说就是要使用多少个来自字段内容的字符)

对于整数来说,则不允许使用该选项值

类型([type])选项

类型([type])选项决定了数据应该如何呈现。

以下类型适用于整数

以下类型值适用于浮点数、复数和整数(自动转换为等值的浮点数)如下:

更灵活的玩法

Python 事实上支持通过关键参数来设置选项的值,比如下面代码通过参数来调整输出的精度:

>>> "{:.{prec}f}".format(3.1415, prec=2)
'3.14'

同时设置多个选项也是没问题的,只要你自己不乱,Python 就不会乱:

>>> "{:{fill}{align}{width}.{prec}{ty}}".format(3.1415, fill='+', align='^', width=10, prec=3, ty='g')
'+++3.14+++'

f-字符串

Python 随着版本的更迭,它的语法也是在不断完善的。“简洁胜于复杂”是 Python 之禅中强调的理念。

因此,在 Python3.6 的更新中,他们给添加了一个新的语法,叫 f-string,也就是 f-字符串。

f-string 可以直接看作是 format() 方法的语法糖,它进一步简化了格式化字符串的操作并带来了性能上的提升。

注:语法糖(英语:Syntactic sugar)是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。

来,我们使用 f-string 将前面讲解 format() 方法的例子给大家修改一遍,你就知道该怎么玩了:

>>> year = 2010
>>> f"鱼C工作室成立于 {year} 年"
'鱼C工作室成立于 2010 年'
>>> 
>>> f"1+2={1+2}, 2的平方是{2*2},3的立方是{3*3*3}"
'1+2=3, 2的平方是4,3的立方是27'
>>> 
>>> "{:010}".format(-520)
>>> f"{-520:010}"
'-000000520'
>>> 
>>> "{:,}".format(123456789)
>>> f"{123456789:,}"
'123,456,789'
>>> 
>>> "{:.2f}".format(3.1415)
>>> f"{3.1415:.2f}"
'3.14'

猜你喜欢

转载自blog.csdn.net/qq_61134394/article/details/128650402