# python3小白课:字符串进阶 之前我们学习了python字符串的入门知识,它们内容不少,不知道大家消化得怎么样了呢? 这节课我们来学习一些字符串的进阶知识,掌握好本节课的内容,对你高效的使用字符串帮助颇大,我们依然提取最精练的内容传授给大家。 --- ### 转义字符 之前我们讲解过`\`符号可以作为转义字符。除了之前教学的场景之外,python还能支持一些其他的转义符,我们来列举常用的一些: ```python # coding:utf-8 # \n表示换行符,比较常用到 a = "我是第一行\n我是第二行" print(a) # 当我们要循环打出一段字符串的时候,不需要写多遍,用*号,后面加上重复的次数即可,比如这里打印40个*号 print("*" * 40) # \t表示制表符,类似你键盘上的Tab键的距离 b = "我是第一行\t我是第二行" print(b) ``` 上面的例子包含的知识点挺多哦,好好学习下。 其他还有一些自带支持的转义符我们就不一一列举了,感兴趣的同学可以自行找下资料。 --- ### 格式化字符串 还记得我们入门的时候,使用的是`+`号的方法把字符串联结起来,当遇到不同类型的数据的时候,我们需要把数据先转换成字符串型。这样有几点不便,其中的一点是,当字符串中的变量太多,需要写多个+号来联结,另一点是要经常关注数据类型,容易报错等。 这时候,我们更常用更常见的神器,格式化字符串,来了! 先来看下例子感受一下,我用了日常编程中更为常见的转换说明符来写: ```python # coding:utf-8 a = "我的名字是%s,我的年龄是%d。\n我知道,π的值为%.2f" % ("小白", 18, 3.1415926) print(a) b = "现在你在【%s】学习python小白课呢~" % "雪山凌狐教程" print(b) ``` 来我们来看一下,这两句示例代码都先用字符串定义了一串的内容,空格之后跟了一个`%`符号,再空格之后,对应的写入了一些内容,有的用括号括起来了,有的没用,对吧? 那么我们首先看一下第一部分的字符串内容,通过对比输出结果,我们可以看到,我们在字符串中也有`%`号,并且后面跟了一些字母等内容。接下来我们就来解释一下我们用到的几个转换说明符: | 转换说明符 | 说明 | | ---------- | ------------------------------------------------------------ | | %s | 将内容(变量或者表达式)用str命令转换为字符串 | | %d | 转换为带符号的十进制形式的整数 | | %f | 转换为十进制形式的浮点数,.num表示保留小数点后面num位,如果给的值不够这个num大,则会补位 | 其他一些转换说明符还有,不过掌握几个常见的日常也基本够用了,这样大家记忆起来就不费力。如果你对其他的说明符感兴趣,可以自行查阅资料。 然后接下来是一个固定的`%`符号作为分隔符。 最后就是我们的内容了,内容可以直接写值也可以支持变量或者表达式的形式。如果前面的字符串定义了多个,需要用逗号`,`隔开,并且外面套上小括号,需要注意的是,前面定义了几个,后面就给几个,不要数量不正确,否则会报错哦。如果只定义了一个,那么直接写它就可以了。将一些内容用小括号括起来,在python中叫做`元组(tuple)`。有关元组的知识后面我们会另外再重点讲解,你稍微知道一下即可。 怎么样?是不是很方便?+号是不是少写了很多? ### format函数 这也是实战中用得比较多的格式化字符串的方法,我们来看个简单的例子就懂了: ```python # coding:utf-8 # format函数的参数中,可以带上参数名,可以不按顺序,如果不带参数名,就必须按顺序给值 a = "我的名字是{name},我的年龄是{age}".format(age=18, name="小白") print(a) # 也可以这样写和定义 a = "我的名字是{},我的年龄是{}".format("小白", 98) print(a) ``` 很简单,会了吗?用上`{}`大括号即可。 ### f-string 上述的格式化方法是过去的版本python一直都有的,我们这里补充讲解一下据说是python3.6版本以上才新加的东东——`f-string`,让我们也来潮流一把。它可能比format函数更加顺畅哦。 `f-string`,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法,主要目的是使格式化字符串的操作更加简便。 来我们直接看例子: ```python # coding:utf-8 name = "小白" age = 18 a = f"我的名字是{name},我的年龄是{age}" print(a) ``` 其实在这里,大括号的作用是一个python表达式,你还可以在大括号里面写表达式的。基础使用我们就讲到这里吧,它的强大之处远远不止这些,如果你想深入了解,百度一下`f-string`即可得到很多你想要的答案了。 --- ### 字符串索引及相关方法 很多时候,我们仅需要取出一串字符串中的某些个内容,那么如何取出呢?这里我们来介绍一下索引的概念。 比如我们定义一个最简单的字符串:`a = "hello"`。 如果你算术够好,肯定能掰出五个手指头告诉我这里有**5**个字母。那么我们可以给他们每个字母编制一个索引。 > [!danger] > > 在python中,索引从**0**开始,务必记住!是0!不是1!很多编程语言的索引都从0开始(个别从1开始索引),这对于我们日常说一楼就是一楼的人有点难抽象出来,但定义如此,请你死记硬背好~ 所以,我们的五个字母的索引分别为:`0, 1, 2, 3, 4`。 我们用`[]`中括号表示索引,如果需要取出字母e,我们可以这样表示:`print(a[1])` 我们还可以有其他写法,看例子: ```python # coding:utf-8 a = "hello" # 我们有如下索引对应关系: # [h -> 0], [e -> 1], [l -> 2], [l -> 3], [o -> 4] print(a[1]) # 取出从右边开始第1个字符 print(a[-1]) # 取出索引从2到4(不含4)的字符(即索引2~3的字符),注意写冒号的话永远是包含头索引不包含尾索引 print(a[2:4]) # 取出倒数第3到倒数第1(不包含倒数第1)的字符串(不能反过来写哦) print(a[-3:-1]) # 取出索引为2之后的所有字符串 print(a[2:]) # 取出索引为1(不包含1)之前的所有字符串 print(a[:1]) # 用in运算符判断某字符串在不在原字符串里面,在返回True真,不在返回False假,这个布尔型我们之前讲过 print("lo" in a) # 获取字符的总长度,可以使用len函数 print(len(a)) # 经过测试,对于中文字符串,它的数数也是按照英文字符串那样来数的,你可以自行深入测试 b = "我是小白little bai" print(b[1]) ``` --- ### 字符串str类型自带的一些内置方法 字符串还有一些它内置的方法,让我们处理起字符串来可以得心应手。 我们可以通过`dir(str)`命令查看内置的方法有哪些,dir命令也能查看其它类的内置方法,这个大家可以自己探索下。运行后,会返回一个命令列表(list),关于列表的知识我们在后面的课程中会详细的讲解,大家稍微知道一下中括号括起来的是一个列表就可以了。 我这里运行结果如下: ```python ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] ``` > [!note] > > 方法有很多,其中我们注意到有很多方法开头结尾都有`__`双下划线符号,这些命令为python系统定义的名字,是特殊方法专用的标识,请不要自己随意定义这类命令。 剩下的那些就是内置类方法啦,里面太多了,如果你感兴趣,可以使用我们学过的help命令来查看帮助文档哦。我们来挑一些重点的来写示例讲解: ```python # coding:utf-8 # 大小写相关方法 a = "my name is liTTle bai 小白" # title方法,将每个单词首字母改为大写 print(a.title()) # lower方法,将每个字母改为小写。比如在比较文件后缀名时十分有用 print(a.lower()) # upper方法,将每个字母改为大写 print(a.upper()) # 删除空白相关方法,空格,制表符等都可以 b = " my name is liTTle bai 小白 " # strip方法,删除首尾的空白 print(b.strip()) # lstrip方法,删除左边left的空白 print(b.lstrip()) # rstrip方法,删除右边right的空白 print(b.rstrip()) # 补充一句,这些方法有时候是可以嵌套的,不用写多行来处理,比如先变小写再删首尾空 print(b.lower().strip()) # 查找替换相关方法 c = "my name is little bai 小白" # startswith方法,判断字符串是不是以传入的参数开头,会返回布尔型返回值真或假 print(c.startswith("my")) # endswith方法,判断字符串是不是以传入的参数结尾,会返回布尔型返回值真或假 print(c.endswith("bai")) # find方法,获取参数在字符串中出现的位置索引,没有找到返回-1 print(c.find("is")) # replace方法,将字符串中的某些内容(如有),替换成别的内容 print(c.replace("小白", "小黑")) # 分割、连接方法 # split方法,将字符串按照指定的分割符分割文本,默认分割符(如果不写)为空格(可以是多个空格) d = "my name is liTTle bai 小白" # 出来的结果是一个列表list,后面我们可以再做详细讲解如何后续处理 print(d.split()) # join方法,刚才分割的反向操作,把一个列表的每个元素(列表中逗号分隔开的一个个称作元素) # 按照指定的连接符(比如点号.)连接起来 print(".".join(d.split())) ``` 说了这么多,可能大家都已经有些晕晕乎乎的了。不过没关系,本节课值得大家细细品味,如果一遍没有掌握,请多回来看几遍,记住常用的那些命令的单词,当你需要的时候就很容易了,它们的使用都是相当简单的。 ### 单词释义 | 单词 | 释义 | | ------------------------- | ------------------------------------------- | | Tab | 这里指键盘上的Tab键,会输出一个制表符\t | | num | number数字的简写 | | tuple | 元组 | | format | 格式化 | | formatted string literals | 格式化字符串常量 | | dir | 全称为directory,你可以理解为目录,罗列出来 | | list | 列表 | | in | 在...里面 | | len | length长度的简洁写法,这里是一个命令名 | | title | 标题,这里是一个命令名 | | lower | 下面的 | | upper | 上面的 | | strip | 除去,剥去 | | lstrip | 应该是left strip的简写,left为左边 | | rstrip | 应该是right strip的简写,right为右边 | | startswith | start开始,with结合上下文理解为跟着啥 | | endswith | end结束,with结合上下文理解为跟着啥 | | find | 寻找 | | replace | 替换 | | split | 分割,分裂 | | join | 连接,加入 |