05 - 字符串字符串是编程里用得最多的数据类型之一没有之一。这章内容比较多但都很实用建议多动手试试。创建字符串前面已经见过了用引号包起来的就是字符串。单引号、双引号、三引号都行s1你好s2你好s3这是一段 很长的文字 可以换行单引号和双引号完全等价。三引号或比较特殊它可以跨越多行poem静夜思 床前明月光 疑是地上霜。 举头望明月 低头思故乡。print(poem)索引和切片字符串里的每个字符都有一个位置编号索引从 0 开始数sPython# P y t h o n# 0 1 2 3 4 5用索引取单个字符print(s[0])# Pprint(s[3])# hprint(s[-1])# n负数从后往前数-1 是最后一个print(s[-2])# o切片就是取一段格式是[起始:结束]包含起始不包含结束左闭右开sPythonprint(s[0:3])# Pyt索引 0、1、2print(s[2:5])# thoprint(s[:3])# Pyt从头开始0 可以省略print(s[3:])# hon到末尾可以省略print(s[:])# Python全部复制一份左闭右开这个设计一开始可能觉得别扭但用多了会发现很方便s[0:3]就是取 3 个字符s[3:6]也是取 3 个字符长度直接就是结束 - 起始。步长切片还可以加第三个参数——步长sPythonprint(s[::2])# Pto每隔一个取一个print(s[::-1])# nohtyP反转字符串s[::-1]反转字符串这个用法很经典面试也经常问。原理是步长为 -1从后往前取。字符串是不可变的这个很重要字符串一旦创建就不能修改。shello# s[0] H # 这行会报错TypeError# 要修改只能创建新的sHs[1:]# Hello你可能会想那s Hello不是修改了吗不是。那是创建了一个新字符串Hello然后让s指向它。原来的hello还在内存里只是没有变量引用它了之后会被垃圾回收。常用方法字符串的方法太多了我挑最常用的说。大小写sHello Worldprint(s.upper())# HELLO WORLDprint(s.lower())# hello worldprint(s.title())# Hello World每个单词首字母大写print(s.capitalize())# Hello world只有第一个字母大写print(s.swapcase())# hELLO wORLD查找和替换sHello Worldprint(s.find(World))# 6返回起始位置print(s.find(Python))# -1找不到返回 -1print(s.index(World))# 6跟 find 类似# print(s.index(Python)) # 这个会报错找不到会抛异常print(s.replace(World,Python))# Hello Pythonprint(s.count(l))# 3l 出现的次数find和index的区别找不到时find返回 -1index直接报错。看你的需求选如果不确定字符串里一定有就用find。去除空白s hello print(s.strip())# hello去两端空白print(s.lstrip())# hello 去左边print(s.rstrip())# hello去右边# 也可以指定去除的字符s2---hello---print(s2.strip(-))# hello处理用户输入时经常用strip()因为你永远不知道用户会不会多打几个空格。分割和拼接这两个方法特别实用# split把字符串按某个分隔符切成列表s苹果,香蕉,橘子fruitss.split(,)print(fruits)# [苹果, 香蕉, 橘子]# 不传参数的话按空白字符切s2hello world pythonprint(s2.split())# [hello, world, python]# join反过来把列表拼成字符串跟 split 相反words[I,love,Python]result .join(words)print(result)# I love Python# 用不同的连接符print(-.join(words))# I-love-Pythonprint(.join(words))# IlovePython注意join是字符串的方法不是列表的方法。语法是连接符.join(列表)不是列表.join(连接符)。我当初学的时候老搞反。判断类shelloprint(s.startswith(he))# Trueprint(s.endswith(lo))# Trueprint(s.isalpha())# True全是字母print(s.isdigit())# False不是纯数字print(s.isalnum())# True全是字母或数字print(12345.isdigit())# Trueprint(hello world.isalpha())# False有空格字符串格式化这个必须好好学因为你会用到非常非常多次。f-string推荐Python 3.6 加入的目前最好用的格式化方式name小明age25print(f我叫{name}今年{age}岁)# 我叫小明今年25岁大括号里可以放表达式price9.9count3print(f总价{price*count:.2f}元)# 总价29.70元:2f是格式说明符.2f表示保留两位小数。更多格式化选项# 控制小数位数print(f{3.14159:.2f})# 3.14# 百分比print(f{0.856:.1%})# 85.6%# 千位分隔符print(f{1000000:,})# 1,000,000# 补零print(f{5:03d})# 005# 对齐print(f{hello:10})# hello 左对齐总宽10print(f{hello:10})# hello右对齐print(f{hello:^10})# hello 居中format() 方法比 f-string 早有些老代码里会看到name小明age25print(我叫{}今年{}岁.format(name,age))print(我叫{name}今年{age}岁.format(namename,ageage))跟 f-string 效果差不多但写起来啰嗦一些。新代码直接用 f-string 就行。% 格式化老式Python 2 时代的写法了解就好别在新代码里用name小明print(我叫%s%name)print(价格是%.2f%9.9)转义字符有些特殊字符不能直接写在字符串里需要用反斜杠\转义print(他说\你好\)# 他说你好print(第一行\n第二行)# 换行print(制表符\t在这里)# Tabprint(反斜杠\\)# 反斜杠\如果觉得转义麻烦可以在字符串前面加rraw string所有字符都按原样处理# 文件路径经常用 raw stringpathrC:\Users\xiaoming\Desktopprint(path)# C:\Users\xiaoming\Desktop# 正则表达式也常用importre patternr\d字符串的编码Python 3 的字符串是 Unicode 的所以中文、日文、emoji 都没问题s你好print(len(s))# 4每个字符算一个包括 emoji但如果你需要跟文件、网络打交道就会遇到编码问题。最常见的UTF-8目前最通用的编码中文字符占 3 个字节GBKWindows 中文系统默认编码中文占 2 个字节# 字符串转字节b你好.encode(utf-8)print(b)# b\xe4\xbd\xa0\xe5\xa5\xbd# 字节转字符串sb.decode(utf-8)print(s)# 你好乱码问题 90% 都是编码不一致导致的。记住一个原则读进来的时候解码decode写出去的时候编码encode编码格式保持一致。format_map配合字典做模板format_map()跟format()类似但它接收一个字典来填充template我叫{name}今年{age}岁来自{city}info{name:小明,age:25,city:北京}print(template.format_map(info))# 我叫小明今年25岁来自北京跟format()的区别format()要一个个传参数format_map()直接丢一个字典进去。当你数据本身就是字典的时候比如从 JSON 读出来的用起来更顺手importjson datajson.loads({name: 小明, age: 25})template用户 {name}年龄 {age}print(template.format_map(data))还有一个技巧——用defaultdict来处理字典里缺少的键fromcollectionsimportdefaultdictclassSafeDict(defaultdict):def__missing__(self,key):returnf{{{key}}}# 缺少的键原样保留template我叫{name}喜欢{hobby}infoSafeDict(str,name小明)print(template.format_map(info))# 我叫小明喜欢{hobby}这样缺少的字段不会报错而是保留占位符。在做邮件模板、消息模板这类场景很实用。本章小结字符串用引号创建三引号可以跨行索引从 0 开始负数索引从后往前切片[起始:结束:步长]左闭右开s[::-1]是反转字符串的经典写法字符串不可变修改其实是创建新字符串f-string 是目前最好用的格式化方式split()切、join()拼这两个方法要记牢format_map()配合字典做模板填充面试题Q1如何反转一个字符串点击查看答案最 Pythonic 的方式是用切片shelloreversed_ss[::-1]# olleh[::-1]表示从头到尾取步长为 -1即从后往前效果就是反转。也可以用.join(reversed(s))但没有切片写法简洁。Q2find()和index()有什么区别点击查看答案都是查找子串的位置区别在于找不到时的行为find()返回-1index()抛出ValueError异常选择建议如果不确定子串一定存在用find()如果确定存在且找不到属于异常情况用index()。Q3为什么说 Python 的字符串是不可变的这对编程有什么影响点击查看答案不可变意味着字符串创建后不能修改其中某个字符。s[0] H会报 TypeError。影响每次修改字符串如拼接都会创建新对象频繁拼接大字符串效率低应该用join()字符串可以安全地作为字典的 key因为不可变所以哈希值稳定多个变量可以安全地引用同一个字符串不用担心被意外修改Q4split()和join()分别做什么为什么join是字符串的方法而不是列表的方法点击查看答案split()把字符串按分隔符切成列表a,b,c.split(,)→[a, b, c]join()把列表用连接符拼成字符串,.join([a, b, c])→a,b,cjoin()是字符串方法因为它要求列表元素都是字符串连接符本身也是字符串放在字符串类型下更自然它可以作用于任何可迭代对象不只是列表放在字符串下更通用从设计角度join的结果是字符串由结果类型来提供方法是合理的设计上一章 | 下一章列表与元组 →
05 - 字符串
发布时间:2026/5/26 20:00:23
05 - 字符串字符串是编程里用得最多的数据类型之一没有之一。这章内容比较多但都很实用建议多动手试试。创建字符串前面已经见过了用引号包起来的就是字符串。单引号、双引号、三引号都行s1你好s2你好s3这是一段 很长的文字 可以换行单引号和双引号完全等价。三引号或比较特殊它可以跨越多行poem静夜思 床前明月光 疑是地上霜。 举头望明月 低头思故乡。print(poem)索引和切片字符串里的每个字符都有一个位置编号索引从 0 开始数sPython# P y t h o n# 0 1 2 3 4 5用索引取单个字符print(s[0])# Pprint(s[3])# hprint(s[-1])# n负数从后往前数-1 是最后一个print(s[-2])# o切片就是取一段格式是[起始:结束]包含起始不包含结束左闭右开sPythonprint(s[0:3])# Pyt索引 0、1、2print(s[2:5])# thoprint(s[:3])# Pyt从头开始0 可以省略print(s[3:])# hon到末尾可以省略print(s[:])# Python全部复制一份左闭右开这个设计一开始可能觉得别扭但用多了会发现很方便s[0:3]就是取 3 个字符s[3:6]也是取 3 个字符长度直接就是结束 - 起始。步长切片还可以加第三个参数——步长sPythonprint(s[::2])# Pto每隔一个取一个print(s[::-1])# nohtyP反转字符串s[::-1]反转字符串这个用法很经典面试也经常问。原理是步长为 -1从后往前取。字符串是不可变的这个很重要字符串一旦创建就不能修改。shello# s[0] H # 这行会报错TypeError# 要修改只能创建新的sHs[1:]# Hello你可能会想那s Hello不是修改了吗不是。那是创建了一个新字符串Hello然后让s指向它。原来的hello还在内存里只是没有变量引用它了之后会被垃圾回收。常用方法字符串的方法太多了我挑最常用的说。大小写sHello Worldprint(s.upper())# HELLO WORLDprint(s.lower())# hello worldprint(s.title())# Hello World每个单词首字母大写print(s.capitalize())# Hello world只有第一个字母大写print(s.swapcase())# hELLO wORLD查找和替换sHello Worldprint(s.find(World))# 6返回起始位置print(s.find(Python))# -1找不到返回 -1print(s.index(World))# 6跟 find 类似# print(s.index(Python)) # 这个会报错找不到会抛异常print(s.replace(World,Python))# Hello Pythonprint(s.count(l))# 3l 出现的次数find和index的区别找不到时find返回 -1index直接报错。看你的需求选如果不确定字符串里一定有就用find。去除空白s hello print(s.strip())# hello去两端空白print(s.lstrip())# hello 去左边print(s.rstrip())# hello去右边# 也可以指定去除的字符s2---hello---print(s2.strip(-))# hello处理用户输入时经常用strip()因为你永远不知道用户会不会多打几个空格。分割和拼接这两个方法特别实用# split把字符串按某个分隔符切成列表s苹果,香蕉,橘子fruitss.split(,)print(fruits)# [苹果, 香蕉, 橘子]# 不传参数的话按空白字符切s2hello world pythonprint(s2.split())# [hello, world, python]# join反过来把列表拼成字符串跟 split 相反words[I,love,Python]result .join(words)print(result)# I love Python# 用不同的连接符print(-.join(words))# I-love-Pythonprint(.join(words))# IlovePython注意join是字符串的方法不是列表的方法。语法是连接符.join(列表)不是列表.join(连接符)。我当初学的时候老搞反。判断类shelloprint(s.startswith(he))# Trueprint(s.endswith(lo))# Trueprint(s.isalpha())# True全是字母print(s.isdigit())# False不是纯数字print(s.isalnum())# True全是字母或数字print(12345.isdigit())# Trueprint(hello world.isalpha())# False有空格字符串格式化这个必须好好学因为你会用到非常非常多次。f-string推荐Python 3.6 加入的目前最好用的格式化方式name小明age25print(f我叫{name}今年{age}岁)# 我叫小明今年25岁大括号里可以放表达式price9.9count3print(f总价{price*count:.2f}元)# 总价29.70元:2f是格式说明符.2f表示保留两位小数。更多格式化选项# 控制小数位数print(f{3.14159:.2f})# 3.14# 百分比print(f{0.856:.1%})# 85.6%# 千位分隔符print(f{1000000:,})# 1,000,000# 补零print(f{5:03d})# 005# 对齐print(f{hello:10})# hello 左对齐总宽10print(f{hello:10})# hello右对齐print(f{hello:^10})# hello 居中format() 方法比 f-string 早有些老代码里会看到name小明age25print(我叫{}今年{}岁.format(name,age))print(我叫{name}今年{age}岁.format(namename,ageage))跟 f-string 效果差不多但写起来啰嗦一些。新代码直接用 f-string 就行。% 格式化老式Python 2 时代的写法了解就好别在新代码里用name小明print(我叫%s%name)print(价格是%.2f%9.9)转义字符有些特殊字符不能直接写在字符串里需要用反斜杠\转义print(他说\你好\)# 他说你好print(第一行\n第二行)# 换行print(制表符\t在这里)# Tabprint(反斜杠\\)# 反斜杠\如果觉得转义麻烦可以在字符串前面加rraw string所有字符都按原样处理# 文件路径经常用 raw stringpathrC:\Users\xiaoming\Desktopprint(path)# C:\Users\xiaoming\Desktop# 正则表达式也常用importre patternr\d字符串的编码Python 3 的字符串是 Unicode 的所以中文、日文、emoji 都没问题s你好print(len(s))# 4每个字符算一个包括 emoji但如果你需要跟文件、网络打交道就会遇到编码问题。最常见的UTF-8目前最通用的编码中文字符占 3 个字节GBKWindows 中文系统默认编码中文占 2 个字节# 字符串转字节b你好.encode(utf-8)print(b)# b\xe4\xbd\xa0\xe5\xa5\xbd# 字节转字符串sb.decode(utf-8)print(s)# 你好乱码问题 90% 都是编码不一致导致的。记住一个原则读进来的时候解码decode写出去的时候编码encode编码格式保持一致。format_map配合字典做模板format_map()跟format()类似但它接收一个字典来填充template我叫{name}今年{age}岁来自{city}info{name:小明,age:25,city:北京}print(template.format_map(info))# 我叫小明今年25岁来自北京跟format()的区别format()要一个个传参数format_map()直接丢一个字典进去。当你数据本身就是字典的时候比如从 JSON 读出来的用起来更顺手importjson datajson.loads({name: 小明, age: 25})template用户 {name}年龄 {age}print(template.format_map(data))还有一个技巧——用defaultdict来处理字典里缺少的键fromcollectionsimportdefaultdictclassSafeDict(defaultdict):def__missing__(self,key):returnf{{{key}}}# 缺少的键原样保留template我叫{name}喜欢{hobby}infoSafeDict(str,name小明)print(template.format_map(info))# 我叫小明喜欢{hobby}这样缺少的字段不会报错而是保留占位符。在做邮件模板、消息模板这类场景很实用。本章小结字符串用引号创建三引号可以跨行索引从 0 开始负数索引从后往前切片[起始:结束:步长]左闭右开s[::-1]是反转字符串的经典写法字符串不可变修改其实是创建新字符串f-string 是目前最好用的格式化方式split()切、join()拼这两个方法要记牢format_map()配合字典做模板填充面试题Q1如何反转一个字符串点击查看答案最 Pythonic 的方式是用切片shelloreversed_ss[::-1]# olleh[::-1]表示从头到尾取步长为 -1即从后往前效果就是反转。也可以用.join(reversed(s))但没有切片写法简洁。Q2find()和index()有什么区别点击查看答案都是查找子串的位置区别在于找不到时的行为find()返回-1index()抛出ValueError异常选择建议如果不确定子串一定存在用find()如果确定存在且找不到属于异常情况用index()。Q3为什么说 Python 的字符串是不可变的这对编程有什么影响点击查看答案不可变意味着字符串创建后不能修改其中某个字符。s[0] H会报 TypeError。影响每次修改字符串如拼接都会创建新对象频繁拼接大字符串效率低应该用join()字符串可以安全地作为字典的 key因为不可变所以哈希值稳定多个变量可以安全地引用同一个字符串不用担心被意外修改Q4split()和join()分别做什么为什么join是字符串的方法而不是列表的方法点击查看答案split()把字符串按分隔符切成列表a,b,c.split(,)→[a, b, c]join()把列表用连接符拼成字符串,.join([a, b, c])→a,b,cjoin()是字符串方法因为它要求列表元素都是字符串连接符本身也是字符串放在字符串类型下更自然它可以作用于任何可迭代对象不只是列表放在字符串下更通用从设计角度join的结果是字符串由结果类型来提供方法是合理的设计上一章 | 下一章列表与元组 →