Python 字符串
姓名、手机号、商品标题、文件路径和网页内容,在程序中通常都要使用字符串保存。
上一节的学习信息卡已经使用了字符串:
student_name = "小明"
course_name = "Python 核心编程"
print("姓名:", student_name)
print("课程:", course_name)这一节继续解决三个问题:怎样创建字符串、怎样把变量放进字符串,以及怎样清理和修改文本。
字符串的创建与组合
字符串的类型是 str,可以使用单引号、双引号或三引号创建。
student_name = "小明"
course_name = 'Python 核心编程'
print(type(student_name))
print(type(course_name))运行结果:
<class 'str'>
<class 'str'>引号与多行字符串
单引号和双引号创建的字符串没有本质区别。字符串内部包含某种引号时,可以用另一种引号包住它:
question = "What's your name?"
message = '他说:"正在学习 Python。"'
print(question)
print(message)这样可以减少转义字符,让代码更容易阅读。
多行字符串
三个单引号或三个双引号可以创建多行字符串,并保留其中的换行:
course_notice = """Python 核心编程
上课时间:周六 09:00
请提前准备开发环境"""
print(course_notice)运行结果:
Python 核心编程
上课时间:周六 09:00
请提前准备开发环境三引号不是多行注释
三个引号创建的仍然是字符串。放在模块、函数或类的特定位置时,它可以作为文档字符串;普通代码注释仍然使用 #。
类型转换与基本运算
使用 str() 可以把数字等数据转换成字符串:
age = 18
age_text = str(age)
print(age_text)
print(type(age_text))运行结果:
18
<class 'str'>+ 可以连接字符串,* 可以重复字符串:
first_name = "张"
last_name = "三"
full_name = first_name + last_name
print(full_name)
print("-" * 20)运行结果:
张三
--------------------+ 两边必须都是字符串。字符串和数字不能直接拼接:
age = 18
print("年龄:" + age)这段代码会出现 TypeError。可以先转换类型:
age = 18
print("年龄:" + str(age))不过,当字符串中需要放入多个变量时,更推荐使用字符串格式化。
格式化字符串
字符串格式化就是先预留位置,再把变量的值放进去。
Python 常见的格式化方式有三种:
- f-string:当前课程优先使用
.format():很多项目中仍然常见%:主要用于阅读和维护较早的代码
f-string 格式化
在字符串前加上字母 f,再把变量写进 {}:
student_name = "张三"
age = 18
course_name = "Python 核心编程"
message = f"姓名:{student_name},年龄:{age},课程:{course_name}"
print(message)运行结果:
姓名:张三,年龄:18,课程:Python 核心编程f-string 中的 {} 还可以放简单表达式:
price = 12.5
quantity = 4
print(f"商品总价:{price * quantity}")控制数字显示格式
在变量后写 :,可以设置显示格式:
price = 12.5
progress = 0.856
print(f"商品单价:{price:.2f} 元")
print(f"学习进度:{progress:.1%}")运行结果:
商品单价:12.50 元
学习进度:85.6%.2f:按照两位小数显示.1%:转成百分比,并保留一位小数
格式化只改变显示方式,不会修改变量原来的值。
不要漏掉字符串前面的 f
name = "张三"
print("你好,{name}")这段代码会原样输出 {name}。正确写法是:
name = "张三"
print(f"你好,{name}")format() 与 % 格式化
format() 格式化
.format() 同样使用 {} 作为占位符,再按顺序填入数据:
student_name = "张三"
age = 18
message = "姓名:{},年龄:{}".format(student_name, age)
print(message)也可以在占位符中指定名称:
message = "姓名:{name},年龄:{age}".format(name="张三", age=18)
print(message)新代码优先使用 f-string,但看到 .format() 时要能读懂。
% 格式化
% 格式化在较早的 Python 代码中很常见:
student_name = "张三"
age = 18
message = "姓名:%s,年龄:%d" % (student_name, age)
print(message)常见格式化符号如下:
| 符号 | 作用 | 示例 |
|---|---|---|
%s | 转换为字符串 | "姓名:%s" % name |
%d | 十进制整数 | "年龄:%d" % age |
%06d | 整数不足 6 位时在左侧补 0 | "%06d" % 25 |
%f | 浮点数 | "%f" % price |
%.2f | 浮点数保留两位小数 | "%.2f" % price |
%% | 输出百分号 % | "进度:80%%" % () |
%c | 单个字符或字符对应的整数 | "%c" % 65 |
%o | 八进制整数 | "%o" % 8 |
%x | 十六进制整数 | "%x" % 255 |
%e | 科学计数法 | "%e" % 1000 |
三种格式化方式怎样选择
- 自己编写新代码:优先使用 f-string
- 阅读已有项目:需要认识
.format()和% - 同一段代码中:尽量保持一种写法,不要来回混用
常用字符串操作
字符串方法可以完成清理、替换、拆分和判断等操作。方法通常写在字符串变量后面:
字符串.方法名()清理与替换
strip() 默认去掉字符串左右两端的空白字符,不会删除中间的空格:
text = " hello Python "
clean_text = text.strip()
print(f"|{text}|")
print(f"|{clean_text}|")运行结果:
| hello Python |
|hello Python|也可以指定要从两端去掉的字符:
text = "###hello Python###"
print(text.strip("#"))运行结果:
hello Pythonstrip() 不是删除指定前后缀
strip("abc") 会持续删除两端出现的 a、b、c 字符,并不是删除一个完整的 abc 前缀或后缀。
替换内容与不可变特性
replace(old, new) 把旧内容替换成新内容:
message = "hello world"
message.replace("world", "Python")
print(message)
message = message.replace("world", "Python")
print(message)运行结果:
hello world
hello Python字符串是不可变类型。replace() 会返回一个新字符串,不会直接修改原字符串。第一次调用没有接收返回值,所以 message 没有变化;第二次把新字符串重新赋值给 message,修改结果才被保存。
strip()、replace()、upper() 等字符串方法都遵循这个规律。
拆分与连接
split() 把一个字符串拆成多个部分:
course_text = "Python,Java,Go"
course_list = course_text.split(",")
print(course_list)运行结果:
['Python', 'Java', 'Go']join() 使用指定字符串把多个字符串连接起来:
course_list = ["Python", "Java", "Go"]
course_text = " | ".join(course_list)
print(course_text)运行结果:
Python | Java | Gojoin() 的成员必须都是字符串。下面的代码会出现 TypeError:
print(",".join([1, 2, 3]))列表会在后面的数据容器章节中详细讲解。当前阶段先把它理解为按顺序保存多个数据的结构。
大小写转换与内容判断
常见方法如下:
| 方法 | 作用 | 示例结果 |
|---|---|---|
text.upper() | 转换为大写 | "Python" → "PYTHON" |
text.lower() | 转换为小写 | "Python" → "python" |
text.title() | 每个单词首字母大写 | "hello python" → "Hello Python" |
text.isupper() | 判断字母是否全部为大写 | 返回 True 或 False |
text.startswith(prefix) | 判断是否以指定内容开头 | 返回 True 或 False |
text.endswith(suffix) | 判断是否以指定内容结尾 | 返回 True 或 False |
text = "hello Python"
print(text.upper())
print(text.title())
print(text.startswith("hello"))
print(text.endswith("Python"))运行结果:
HELLO PYTHON
Hello Python
True
True转义字符与原始字符串
转义字符
有些字符很难直接写进普通字符串。例如,我们需要在字符串中表示换行、制表符或反斜杠。这时可以使用以反斜杠 \ 开头的转义字符。
| 转义字符 | 作用 |
|---|---|
\\ | 表示一个反斜杠 |
\' | 表示单引号 |
\" | 表示双引号 |
\n | 换行 |
\t | 水平制表符 |
\r | 回车 |
print("第一行\n第二行")
print("姓名\t课程")
print("张三\tPython")
print("安装目录:C:\\Python314")运行结果:
第一行
第二行
姓名 课程
张三 Python
安装目录:C:\Python314\t 不是固定数量的空格
\t 表示水平制表符,会移动到下一个制表位置。它显示出来的宽度受终端和当前位置影响,不能简单理解为“四个空格”。
如果一行代码过长,优先使用括号换行。虽然反斜杠放在代码行末也可以续行,但它容易因为后面多出空格或注释而出错,当前课程不推荐这种写法。
原始字符串与文件路径
Windows 路径中包含很多反斜杠。普通字符串可能把 \n、\t 等内容识别成转义字符:
path = "C:\\new_project\\test.py"
print(path)除了写成双反斜杠,还可以在引号前加 r,创建原始字符串:
path = r"C:\new_project\test.py"
print(path)运行结果:
C:\new_project\test.py原始字符串会把大多数反斜杠当成普通字符,很适合保存 Windows 路径和正则表达式。
原始字符串不能以单个反斜杠结尾
下面的写法会出现 SyntaxError:
path = r"C:\new_project\"路径需要以反斜杠结尾时,可以使用普通字符串并写成双反斜杠,或者调整字符串的组合方式。
综合案例:清洗课程通知
现在处理一段从网页中取得的课程信息。原始内容包含多余空格、 和 <br>:
raw_text = " Python 核心编程 <br>上课时间:周六 09:00<br>请提前准备开发环境 "需求如下:
- 删除两端空格和
- 按照
<br>拆分内容 - 使用换行符重新合并
- 添加通知标题并输出
第一步:清理并拆分内容
raw_text = " Python 核心编程 <br>上课时间:周六 09:00<br>请提前准备开发环境 "
clean_text = raw_text.replace(" ", "").strip()
notice_lines = clean_text.split("<br>")
print(notice_lines)运行结果:
['Python 核心编程', '上课时间:周六 09:00', '请提前准备开发环境']第二步:合并并格式化通知
raw_text = " Python 核心编程 <br>上课时间:周六 09:00<br>请提前准备开发环境 "
clean_text = raw_text.replace(" ", "").strip()
notice_lines = clean_text.split("<br>")
notice_body = "\n".join(notice_lines)
notice_title = "课程通知"
notice = f"【{notice_title}】\n{notice_body}"
print(notice)运行结果:
【课程通知】
Python 核心编程
上课时间:周六 09:00
请提前准备开发环境这个案例按顺序使用了 replace()、strip()、split()、join() 和 f-string。处理文本时,也可以先把需求拆成这样的小步骤,再逐步检查每一步的结果。
常见问题
| 问题 | 排查方法 |
|---|---|
| 引号没有成对出现 | 检查字符串开始和结束的引号;内部也有引号时,可以换一种引号包裹或使用转义字符 |
| 拼接字符串和数字时报错 | "年龄:" + 18 会出现 TypeError,可以使用 str(18) 或 f-string |
| 调用方法后原字符串没有变化 | 字符串不可变,需要使用变量接收方法返回的新字符串 |
| 路径中的反斜杠显示异常 | 检查是否包含 \n、\t 等转义组合,改用 \\ 或原始字符串 |
动手练习
- 使用 f-string 输出姓名、年龄和课程名称,并让年龄保持数字类型。
- 把字符串
" hello world "两端的空白去掉,再把world替换成Python。 - 把字符串
"Python,Java,Go"拆开,再使用" | "重新连接。 - 根据用户输入的页码,生成对应的猫眼榜单地址。
- 分别使用普通字符串和原始字符串表示路径
C:\course\new\test.py。
小结
本节课最核心的是掌握 5 件事:
- 字符串可以使用单引号、双引号和三引号创建
- 新代码优先使用 f-string,已有代码中还会看到
.format()和% strip()、replace()、split()和join()可以完成常见文本处理- 字符串不可变,方法返回的结果需要使用变量接收
- 遇到换行、引号和路径时,要会使用转义字符或原始字符串
延伸阅读:Python 3.14 字符串入门、格式化字符串、字符串方法