第三章 数据类型:字符串
字符串
字符串使用语法
使用引号创建字符串类型数据
知识点:
- 字符串就是一系列字符。
- 使用引号创建字符串,引号必须要用英文输入法,中文会出错!。
- 用引号括起的都是字符串,可以是单引号,也可以是双引号。
- 字面量:直接通过引号创建的字符串称为字面量。
1 | "This is a string." |
通过print在Jupyter中输出所有内容
知识点:
- Jupyter只输出最后一个字符串。
- 使用
print()
函数输出需要输出的内容(不仅是字符串,也可是变量值)。
1 | print("This is a string.") |
正确使用引号创建字符串类型数据
知识点:
- 由于引号在python中有特殊意义,用于标识字符串的起止标识。
- 如果在
""
双引号作为标识的字符串中使用"
字符,那么,python就只能把"
错误地解析为起止标识,而无法解析为该"
字符本身,进而引发语法错误。 - 为了解决此歧义问题,Python引入了转移字符技术,即通过转义字符
\'
和\"
方式来明确告诉Python,当前的字符解析为字符本身,而非起止标识。
1 | print('-----------两种引号的嵌套使用------------') |
习题
- 第1题
- 第2题
- 第3题
使用方法修改字符串的大小写
使用方法title()修改字符串为首字母大写
知识点:
Python的字符串敏感于大小写。
比如
Ada
和ada
是不同的字符串。方法:在类中定义的函数。这里的类指的是特定的类型。
- 比如在字符串类型
str
中定义了字符串首字母大写转换函数title()
。
- 比如在字符串类型
方法的调用:
变量名.方法()
。- 首先,创建该类型的变量。
然后,通过该变量来调用对应的方法。
具体程序如下:
1
2
3
4
5
6name = "ada lovelace" # 创建该类型的变量
print(type(name)) # <class 'str'> 查询变量类型
print(name.title()) # Ada Lovelace,通过该变量来调用对应的方法
# <class 'str'>
# Ada Lovelace在这个示例中,小写的字符串
"ada lovelace"
存储到了变量name
中。- 在
print()
语句中,方法title()
出现在这个变量(对象)的后面。 - 在
name.title()
中,name
后面的句点(.
)让Python对变量name
执行方法title()
指定的操作。 - 每个方法后面都跟着一对括号,为方法传入额外的参数(信息)。 函数
title()
不需要额外的信息,因此它后面的括号是空的。 title()
以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。这很有用,因为你经常需要将名字视为信息。例如,你可能希望程序将值Ada
、ADA
和ada
视为同一个名字,并将它们都显示为Ada
。
使用方法upper()和lower()修改字符串大小写
知识点:
- # message.lower() : this is string example from runoob….wow!!!
# message.upper() : THIS IS STRING EXAMPLE FROM RUNOOB….WOW!!!
str.lower()
:转换字符串中所有大写字符为小写。- 无参数,返回全为小写的字符串。
str.upper()
:转换字符串中所有小写字符为大写。- 无参数,返回全为大写的字符串。
- 在
1 | name = "Ada Lovelace" |
1 | message = "this is string example from runoob....wow!!!" |
习题
- 第4题
合并(拼接)字符串
字符串拼接操作
知识点:
- Python使用加号(
+
)来合并字符串。- 拼接的类型必须是字符串,否则会出错。
例如,你可能想将姓和名存储在不同的变量中,等要显示姓名时再将它们合而为一:
1 | print("--字符串的拼接 通过 + 操作----") |
在这个示例中,我们使用+
来合并first_name
、空格和last_name
,以得到完整的姓名。这种合并字符串的方法称为拼接。通过拼接,可使用存储在变量中的信息来创建完整的消息。下面来看一个例子:
1 | first_name = "ada" |
将字符串拼接的结果存变量中
在这里,一个问候用户的句子中使用了全名,并使用了方法title()
来将姓名设置为合适的格式。这些代码显示一条格式良好的简单问候语。还可以使用拼接来创建消息,再把整条消息都存储在一个变量中:
1 | first_name = "ada" |
- 上述代码也显示消息“Hello, Ada Lovelace!”,但将这条消息存储在了一个变量中,这让最后的
print
语句简单得多。
习题
- 第5题
转义字符
使用制表符
知识点:
- 在程序中,空白泛指任何非打印字符,如空格、制表符和换行符。
- 可使用空白来组织输出,以使其更易读。
- 横向制表符:转义字符
\t
。
1 | print("\tPython\tPython\tPython\tPython") |
使用换行符
知识点:
- 换行符 :在字符串中添加换行符,可使用转义字符
\n
。
1 | print("Languages:\nPython\nC\nJavaScript") |
组合使用
知识点:
- 组合使用:可在同一个字符串中同时包含制表符和换行符。
- 字符串
"\n\t"
让Python换到下一行,并在下一行开头添加一个制表符。
下面的示例演示了如何使用一个单行字符串来生成四行输出:
1 | print("Languages:\n\tPython11111\tPython\tPython\n\tC\tC\n\tJava\tJava") |
引号和反斜杠
知识点:
- 单引号:
\'
。- 双引号:
\"
。- 反斜杠符号:
\\
。
习题
- 第6题
- 第7题
删除字符串中的空白
认识程序中的空白
知识点:
- 对人来说,
'python'
和'python '
看起来几乎一样。- 对程序来说,它们却是两个不同的字符串。
- 程序对字符串中的空白敏感。
处理字符串中的空白很重要,因为经常需要比较两个字符串是否相同。例如,在用户登录网站时检查其用户名。通过对字符串空白删除操作,对用户输入数据中的多余空白进行删除。
使用方法rstrip()
删除字符串末尾空白
知识点:
rstrip()
方法
- 调用语法:
str.rstrip([chars])
。- 描述:删除
string
字符串末尾的指定字符,默认为空格。- 参数:
chars
,指定删除的字符,默认为空格。- 返回:删除
string
字符串末尾的指定字符后生成的新字符串。
1 | favorite_language = ' python ' |
分析:
- 存储在变量
favorite_language
中的字符串末尾包含多余的空白。Jupyter输出可看到末尾的空格。 - 对变量
favorite_language
调用方法rstrip()
后,这个多余的空格被删除了。 - 然而,这种删除只是暂时的,在Jupyter输出中输出
favorite_language
时,会发现它依然包含多余的空白。
设置参数chars
,删除指定的字符。
1 | str = " this is string example....wow!!! " |
永久删除字符串的空白
要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中。
1 | print('-------通过赋值的方式覆盖原字符串-----------') |
分析:
- 因为
rstrip()
操作不直接修改字符串,而是返回一个新的字符串。 - 在编程中,经常需要修改变量的值,再将新值存回到原来的变量中。
使用方法lstrip()
和strip()
删除字符串首和两端空白
Python还可以删除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法lstrip()
和strip()
。在这个示例中,我们首先创建了一个开头和末尾都有空白的字符串。接下来,我们分别删除末尾、开头和两端的空格。
1 | print('------Jupyter对赋值语句结果不输出----------') |
习题
- 第8题
- 第9题
字符串引起的语法错误
字符串引号引起的语法错误
知识点:
- 语法错误在编程过中经常会被遇到,当程序中包含非法的Python代码时,就会导致语法错误。
- 可通过Python解释器提供的错误信息,来较快的解决。
下面演示了如何正确地使用单引号和双引号。撇号位于两个双引号之间,因此Python解释器能够正确地理解这个字符串:
1 | message = "One of Python's strengths is its diverse community." |
在用单引号括起的字符串中,如果包含撇号,就将导致错误。这是因为这会导致Python将第一个单引号和撇号之间的内容视为一个字符串,进而将余下的文本视为Python代码,从而引发错误。因为,Python将无法正确地确定字符串的结束位置:
1 | message = 'One of Python's strengths is its diverse community.' |
从上述输出可知,错误发生在第二个单引号后面。这种语法错误表明,在解释器看来,其中的有些内容不是有效的Python代码。
知识点:
- 编写程序时,编辑器的语法突出功能可帮助你快速找出某些语法错误。
- 看到Python代码以普通句子的颜色显示,或者普通句子以Python代码的颜色显示时,就可能意味着文件中存在引号不匹配的情况。
习题
- 第10题
- 第11题
- 第12题
- 第13题
- 第14题
(重要)格式化字符串
.format()函数的语法
认识.format()
字符串格式化函数
Python提供了.format()
字符串格式化函数。该函数操作起来方便,可读性很强。 .format()
函数常与print()
函数结合使用,具备很强的格式化输出能力。
知识点:.format()
字符串格式化函数。
语法:
str.format(**args)
。例如:
"{} {}".format("hello", "world")
。描述:该函数将通过
{}
和:
来设置模板字符串str
,然后通过.format(**args)
传入实参来对str
进行格式化。- 模板字符串
str
中包含由大括号{}
包围的“替换字段”。 {}
中填写文本替换和格式化规则,如果不填任何规则(直接使用{}
),则进行直接替换。- 具体的“替换字段”由
args
参数传入。 .format()
函数中有几个参数,模板字符串str
中包含几个{}
。
- 模板字符串
该函数使用方法较多,下面将一一介绍。
认识.format()
函数默认参数位置
知识点:.format()
函数的默认位置。
- 不指定格式化位置,按照默认顺序格式化。
args
参数以,
相隔,按顺序填入相应的{}
。str
字符串模板中的{}
数量不能超过参数个数,否则会出错。
1 | str1 = "{} {}".format("hello", "world") |
.format()
函数中有2个参数,模板字符串str
中包含2个{}
。- 模板字符串
str
为"{} {}"
,仅包含两个{}
。 args
参数包括:"hello"
和"world"
。- 根据规则,按照默认顺序格式化
str
。"hello"
填入第1个{}
;"world"
填入第2个{}
。
IndexError
错误
知识点:当{}
超过args
输入参数个数时,会出错IndexError
。
1 | str1 = "{} {} {}".format("hello", "world") |
.format()函数的位置索引
知识点:.format()
函数的3中位置索引方式:默认位置索引、序号位置索引和关键字位置索引。
参数的序号位置索引
知识点:
.format()
函数的参数的序号位置索引。
- 设置参数索引来指定格式化的位置。
- 为
str
字符串模板设置带参数索引的{}
。- 参数索引从0开始,即第1个参数,对应
{0}
。
1 | str1 = "{1} {0}".format("hello", "world") |
- 模板字符串
str
为"{0} {1}"
,在每个{}
中包含数字,来指明所替换的参数索引。 args
参数包括:"hello"
对应第0参数索引、"world"
对应第1参数索引。- 根据规则,按照参数索引格式化
str
。"hello"
填入{0}
;"world"
填入{1}
。
位置索引可重复使用
知识点:参数索引可以重复使用来替换字符串。
1 | str1 = "{1} {0} {1}".format("hello", "world") |
.format()
参数的关键字位置索引
知识点:
.format()
函数的关键字位置索引。
- 设置关键字来指定格式化的位置。该功能与数字位置类似。
- 为
str
字符串模板设置带关键字的{}
,指定参数替代字符串模板的位置。- 关键字可以为位置取更有意义的标识。
- 注意:在使用关键字索引时,避免使用
0
和o
、1
和l
,以免混淆。
1 | # 下面的关键字l很容易被误认为是1 |
.format()函数样式格式输出
.format()
函数的填充与格式化
知识点:
.format()
函数的填充与格式化。
- 大括号中可以设定特殊的格式:
{:[填充字符][对齐方式 <^>][宽度]}
:
为格式起始标志,不能少。:
号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。- 对齐方式:
<^>
分别为左、中、右对齐。- 宽度:整形,指定填充位置宽度,如果替换文本比这个宽度小,则用填充字符进行填充。
1 | # 左对齐,使用*填充,宽度为10 |
定制输出格式:
{:>n}
将字段设置为n
个字符,并让内容右对齐。数字默认右对齐。{: 将字段设置为
n`个字符,并让内容左对齐。非数字的字符默认左对齐。{:^n}
将字段设置为n
个字符,并让内容居中。
1 | x = 'hello' |
- 输出以右对齐的方式打印2~20的偶数,每个字段的宽度都设置为3个字符。
.format()
函数的精度
知识点:
.format()
函数的精度。
大括号中可以设定特殊的格式:
{:[m].[n][格式]}
:
为格式起始标志,不能少。
m
为整形,整数部分的宽度。
- 默认值为原数字整数部分的长度。
- 如果
m
大于整数部分的长度,则有空格左边填充。
.
为小数点。
n
为整形,小数点后保留几位精度。
- 默认值为原数字小数部分的长度。
- 如果
n
大于小数部分的长度,则有0补全填充。格式:
f
为浮点数。
1 | #m=10,n=1,f为浮点数 |
.format()
函数的进制转换
知识点:进制转换,
b
、d
、o
、x
分别是二进制、十进制、八进制、十六进制。
1 | print('{:b}'.format(11)) |
.format()
函数的数字格式输出
- 请使用
.format()
函数得到下面的结果运行结果。
数字(输入) | 格式 | 输出 | 描述(结果) |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1.00 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
10 | {:x<4d} | 10xx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
f-string技术
初识f-string
f-string基本介绍
f-string
,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法,主要目的是使格式化字符串的操作更加简便。
知识点:
f-string
在形式上是以f
或F
修饰符引领的字符串(f'xxx'
或F'xxx'
),以大括号{}
标明被替换的字段f-string
在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。f-string
在功能方面不逊于传统的%-formatting
语句和str.format()
函数,同时性能又优于二者,且使用起来也更加简洁明了,因此对于Python3.6及以后的版本,推荐使用f-string
进行字符串格式化。
f-string语法
知识点:
- 语法:
f'<text> {<content:format specifier>} <text> ...'
f
是f-string
的标识符,位于字符串标识符'
之前。标识符不能忘记。<text>
:为普通字符串文本。{<content>}
:大括号是需要被替换的字段,外部传入的变量名为<expr>
。<:format specifier>
:可选,类似于.format()
,自定义的格式。- 例如:
f's is {s:8s}'
,其中s is
是<text>
;{s:8s}
中s
为<content>
,8s
为格式,中间:
间隔。
f-string
用大括号{}
表示被替换字段,其中直接填入替换内容:
1 | name = 'Eric' |
深入f-string
表达式求值与函数调用
f-string
的大括号 {}
可以填入表达式或调用函数,Python会求出其结果并填入返回的字符串内:
1 | str = f'A total number of {24 * 8 + 4}' |
引号、大括号与反斜杠
f-string
大括号内所用的引号不能和大括号外的引号定界符冲突,可灵活切换 '
和 "
:
1 | str = f'I am {"Eric"}' |
若 '
和 "
不足以满足要求,还可以使用 '''
和 """
:
1 | # SyntaxError: invalid syntax |
1 | str = f"""He said {"I'm Eric"}""" |
大括号外的引号还可以使用 \
转义,但大括号内不能使用 \
转义:
1 | str = f'''He\'ll say {"I'm Eric"}''' |
1 | # SyntaxError: f-string expression part cannot include a backslash |
f-string
大括号外如果需要显示大括号,则应输入连续两个大括号 {{` 和 `}}
:
1 | str = f'5 {"{stars}"}' |
f-string
大括号内不能使用 \
转义,事实上不仅如此,f-string
大括号内根本就不允许出现 \
。如果确实需要 \
,则应首先将包含 \
的内容用一个变量表示,再在f-string
大括号内填入变量名:
1 | # SyntaxError: f-string expression part cannot include a backslash |
1 | # ord()为将'\n'的ASCII码转为八进制 |
多行f-string
f-string
还可用于多行字符串:
1 | name = 'Eric' |
自定义f-string格式
自定义格式
f-string采用 {content:format}
设置字符串格式,其中 content
是替换并填入字符串的内容,可以是变量、表达式或函数等,format
是格式描述符。自定义格式与.format()
类似。采用默认格式时不必指定 {:format}
,如上面例子所示只写 {content}
即可。
宽度与精度相关格式描述符
格式描述符 | 含义与作用 |
---|---|
width |
整数 width 指定宽度 |
0width |
整数 width 指定宽度,开头的 0 指定高位用 0 补足宽度 |
width.precision |
整数 width 指定宽度,整数 precision 指定显示精度 |
数值类型基本格式
格式描述符 | 含义与作用 | 适用变量类型 |
---|---|---|
s |
普通字符串格式 | 字符串 |
b |
二进制整数格式 | 整数 |
c |
字符格式,按unicode编码将整数转换为对应字符 | 整数 |
d |
十进制整数格式 | 整数 |
o |
八进制整数格式 | 整数 |
x |
十六进制整数格式(小写字母) | 整数 |
X |
十六进制整数格式(大写字母) | 整数 |
e |
科学计数格式,以e 表示×10^ |
浮点数、复数、整数(自动转换为浮点数) |
E |
与e 等价,但以E 表示×10^ |
浮点数、复数、整数(自动转换为浮点数) |
f |
定点数格式,默认精度(precision )是6 |
浮点数、复数、整数(自动转换为浮点数) |
F |
与f 等价,但将nan 和inf 换成NAN 和INF |
浮点数、复数、整数(自动转换为浮点数) |
g |
通用格式,小数用f ,大数用e |
浮点数、复数、整数(自动转换为浮点数) |
G |
与G 等价,但小数用F ,大数用E |
浮点数、复数、整数(自动转换为浮点数) |
% |
百分比格式,数字自动乘上100后按f 格式排版,并加% 后缀 |
浮点数、整数(自动转换为浮点数) |
1 | # {content:format} |
1 | str = f'a is {a:8.2g}' |
对齐方式相关格式描述符
格式描述符 | 含义与作用 |
---|---|
< | 左对齐(字符串默认对齐方式) |
> | 右对齐(数值默认对齐方式) |
^ | 居中 |
数字符号相关格式描述符(只适合数值类型)
格式描述符 | 含义与作用 |
---|---|
+ | 负数前加负号(-),正数前加正号(+) |
- | 负数前加负号(-),正数前不加任何符号(默认) |
(空格) | 负数前加负号(-),正数前加一个空格 |
数字显示方式相关格式描述符(是否加#
)
数值类型 | 不加**#**(默认) | 加**#** | 区别 |
---|---|---|---|
二进制整数 | ‘1111011’ | ‘0b1111011’ | 开头是否显示 0b |
八进制整数 | ‘173’ | ‘0o173’ | 开头是否显示 0o |
十进制整数 | ‘123’ | ‘123’ | 无区别 |
十六进制整数(小写字母) | ‘7b’ | ‘0x7b’ | 开头是否显示 0x |
十六进制整数(大写字母) | ‘7B’ | ‘0X7B’ | 开头是否显示 0X |
1 | # 居中'^',显示0X前缀'#',宽度10位,十六进制整数(大写字母) |
1 | # 左对齐,宽度10位,显示正号(+),定点数格式,2位小数 |
1 | # 高位补零,宽度15位,十进制整数,使用,作为千分分割位 |
1 | # 宽度30位,科学计数法,3位小数 |
任务
第1题
题目要求:
- 使用单引号和双引号分别创建字符串(可以用中文作为字符串内容)。
代码如下:
1 | "hello world" |
运行结果:
1 | 'hello world' |
第2题
题目要求:
- 创建含有引号的字符串,观察引号错误使用引起的错误。
代码如下:
1 | "hello"world" |
运行结果:
1 | File "<ipython-input-2-47bd8e44abc4>", line 1 |
第3题
题目要求:
- 创建含有引号的字符串,使用转义字符。
代码如下:
1 | print("\"hello\"wprld") |
运行结果:
1 | "hello"wprld |
第4题
题目要求:
- 使用
input()
输入1个字符串,并使用上述3个字符串的方法对该字符串进行修改操作,并输出结果。
代码如下:
1 | massage=input() |
运行结果:
1 | Hello World |
第5题
题目要求:
- 接受键盘输入,将输入字符串储存到变量,然后进行字符串拼接,最后输出 “你好,姓名”。
代码如下:
1 | name=input() |
运行结果:
1 | 你好,XieSenshi |
第6题
题目要求:
- 使用制表符和换行符分别自定义创建字符串(可以为中文),并输出结果。
代码如下:
1 | print("System:\tWindows\tLinux\tMacOS\tAndroid\tiOS") |
运行结果:
1 | System: Windows Linux MacOS Android iOS |
第7题
题目要求:
- 组合使用制表符(3列)和换行符(2行)自定义创建字符串(可以为中文),并输出结果。
代码如下:
1 | print("System:\tWindows\tLinux\tMacOS\n\tAndroid\tiOS") |
运行结果:
1 | System: Windows Linux MacOS |
第8题
题目要求:
- 外部输入含有空格的字符串,使用上述方法对字符串进行空白删除处理。
代码如下:
1 | massage=input() |
运行结果:
1 | hello world |
第9题
题目要求:
- 外部输入含有空格的字符串,指定
chars
参数,分别rstrip()
、lstrip()
和strip()
调用删除特定字符。
代码如下:
1 | massage=input() |
运行结果:
1 | hello world |
第10题
题目要求:
- 个性化消息:将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello Eric, would you like to learn some Python today?”。
代码如下:
1 | name='Eric' |
运行结果:
1 | Hello Eric, would you like to learn some Python today? |
第11题
题目要求:
- 调整名字的大小写:将一个人名存储到一个变量中,再以小写、大写和首字母大写的方式显示这个人名。
代码如下:
1 | name="xiesenshi" |
运行结果:
1 | xiesenshi |
第12题
题目要求:
- 名言:找一句你钦佩的名人说的名言,将这个名人的姓名和他的名言打印出来。输出应类似于下面这样(包括引号):Albert Einstein once said, “A person who never made a mistake never tried anything new.”
代码如下:
1 | print('Albert Einstein once said, “A person who never made a mistake never tried anything new.”') |
运行结果:
1 | Albert Einstein once said, “A person who never made a mistake never tried anything new.” |
第13题
题目要求:
- 名言2:重复练习11-14,但将名人的姓名存储在变量
famous_person
中,再创建要显示的消息,并将其存储在变量message
中,然后打印这条消息。
代码如下:
1 | famous_person="Albert Einstein" |
运行结果:
1 | Albert Einstein once said, “A person who never made a mistake never tried anything new.” |
第14题
题目要求:
- 剔除人名中的空白:存储一个人名,并在其开头和末尾都包含一些空白字符。务必至少使用字符组合
"\t"
和"\n"
各一次。打印这个人名,以显示其开头和末尾的空白。然后,分别使用剔除函数lstrip()
、rstrip()
和strip()
对人名进行处理,并将结果打印出来。
代码如下:
1 | name=" XieSenshi " |
运行结果:
1 | XieSenshi XieSenshi XieSenshi |