237 lines
13 KiB
Markdown
237 lines
13 KiB
Markdown
# 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 | 连接,加入 |
|
||
|