Python基础字符串类型str的创建方式汇总一、开篇字符串——你最常打交道的类型如果说整数是数字世界的基础那字符串就是文字世界的基础。在编程中你处理的绝大多数数据——用户名、邮件地址、网页内容、配置文件、JSON响应——本质上都是字符串。⌨️ Python的字符串处理能力在编程语言中是第一梯队的。它内置了非常丰富的字符串操作方法和格式化工具让文本处理变得优雅而高效。这篇文章我们先从最基础的开始字符串的创建方式。后面会有多篇文章分别深入讲解字符串的切片、常用方法、格式化等专题。二、字符串创建的几种方式2.1 单引号# 最简单的字符串创建方式——用单引号name小明messageHello, Python!# 单引号字符串中如果想包含单引号需要转义textI\m a Python developerprint(text)# Im a Python developer2.2 双引号# 和单引号等价但各有各的方便之处greeting你好世界pathD:\\Projects\\Python# 双引号内可以直接使用单引号不需要转义textIm a Python developer# 简洁print(text)# Im a Python developer# 单引号内可以直接使用双引号quote他说Python很有趣print(quote)# 他说Python很有趣 选择单引号还是双引号Python中两者完全等价。一般建议字符串中包含双引号时用单引号字符串中包含单引号时用双引号什么都没有时选一种风格在整个项目中保持一致2.3 三引号多行字符串# 三个单引号long_text这是第一行 这是第二行 这是第三行print(long_text)# 三个双引号效果相同poem静夜思 床前明月光 疑是地上霜。 举头望明月 低头思故乡。print(poem)# 三引号的换行是保留的multiline第一行 第二行 第三行print(repr(multiline))# 第一行\n第二行\n第三行 三引号的两个主要用途多行字符串包含换行的长文本文档字符串docstring函数、类、模块的文档说明2.4 str() 构造函数# 将其他类型转为字符串print(str(42))# 42print(str(3.14159))# 3.14159print(str(True))# Trueprint(str(None))# Noneprint(str([1,2,3]))# [1, 2, 3]print(str({a:1}))# {a: 1}# 自定义类的字符串表示classPerson:def__init__(self,name,age):self.namename self.ageagedef__str__(self):用户友好的字符串表示returnf{self.name}{self.age}岁def__repr__(self):开发者友好的字符串表示returnfPerson(name{self.name}, age{self.age})personPerson(小明,25)print(str(person))# 小明25岁print(repr(person))# Person(name小明, age25)2.5 原始字符串r-string# 普通字符串中反斜杠是转义字符path1C:\\Users\\小明\\Documents# 需要双反斜杠path2rC:\Users\小明\Documents# 原始字符串一个反斜杠即可print(path1)# C:\Users\小明\Documentsprint(path2)# C:\Users\小明\Documents# 正则表达式是原始字符串最主要的应用场景importre patternr\d{3}-\d{4}-\d{4}# 匹配电话号码text我的电话是138-1234-5678matchre.search(pattern,text)print(match.group()ifmatchelse未匹配)# 138-1234-5678⚠️ 原始字符串的注意事项原始字符串中反斜杠仍然不能出现在字符串末尾# rhello\ # SyntaxError即使原始字符串末尾也不能是单个反斜杠rhello\\# OK2.6 f-string格式化字符串# f-string是Python 3.6引入的目前最推荐的格式化方式name小明age25score95.5# 基本用法print(f我叫{name}今年{age}岁)# 表达式求值print(f明年我就{age1}岁了)print(f我的分数是{score}等级是{优秀ifscore90else良好})# 格式化数字pi3.141592653589793print(fπ ≈{pi:.2f})# 保留2位小数print(fπ ≈{pi:.4f})# 保留4位小数# 调用方法namepythonprint(f{name.upper()})# PYTHONprint(f{name.capitalize()})# Python# 调试模式Python 3.8{变量}print(f{name}{age}{score})# 输出namepython age25 score95.5三、字符串的特性3.1 不可变性字符串是不可变对象——一旦创建字符串的内容就不能被修改namePithon# name[1] y # TypeError! 字符串不能直接修改# ✅ 正确的修改方式——创建新字符串namename[:1]yname[2:]print(name)# Python每次对字符串的修改实际上都会创建一个新的字符串对象。这个特性确保了字符串在多处引用时的安全性。3.2 有序的字符序列字符串是一个有序的字符序列这意味着每个字符都有固定的位置索引从0开始可以通过索引访问单个字符可以切片获取子串可以遍历每个字符textHello# 索引访问print(text[0])# H第一个字符print(text[-1])# o最后一个字符# 遍历每个字符forcharintext:print(char,end )# H e l l oprint()# 长度print(len(text))# 53.3 Unicode支持Python 3的字符串以Unicode存储天然支持各种语言和符号# 各种语言的文字chinese你好世界japaneseこんにちは、世界arabicمرحبا بالعالمemoji Python print(chinese)# 你好世界print(emoji)# Python # 获取字符的Unicode码点print(ord(中))# 20013print(ord())# 128013# 从码点获取字符print(chr(20013))# 中print(chr(128013))# # 完整的Unicode范围forcodeinrange(128013,128018):print(fU{code:05X}:{chr(code)})四、转义字符4.1 常用转义字符print(Hello\nWorld)# \n换行print(Hello\tWorld)# \t制表符Tabprint(Hello\\World)# \\反斜杠本身print(I\m learning)# \单引号print(He said:\Hi!\)# \双引号print(Hello\rWorld)# \r回车很少用print(Hello\bWorld)# \b退格很少用4.2 Unicode转义# 16位Unicode转义\u 4位十六进制print(你好)# 你好# 32位Unicode转义\U 8位十六进制print(\U0001f40d)# 蛇的emoji# 八进制转义\ 3位八进制数print(\101)# A八进制101 十进制65 ASCII A# 十六进制转义\x 2位十六进制print(\x41)# A五、字符串拼接与重复5.1 用 拼接first_name张last_name三full_namelast_namefirst_nameprint(full_name)# 张三# 字符串 其他类型会报错age25# message 我今年 age 岁 # TypeError!# 需要先转成字符串message我今年str(age)岁print(message)# 我今年25岁5.2 用 * 重复print(-*40)# 40个减号组成的分隔线print(你好*3)# 你好你好你好print(*5标题*5)# 标题5.3 隐式拼接这个特性很多人不知道——相邻的字符串字面量会自动拼接# Python会自动拼接相邻的字符串字面量messageHello, World! 你好print(message)# Hello, World! 你好# 这在写长字符串时很有用long_text(这是一个很长的字符串它被分成了多行来写但Python会自动把它们拼起来。)print(long_text)# 一行显示# 注意只对字符串字面量有效对变量无效aHellobWorld# result a b # SyntaxError!resultab# OK5.4 join() 方法对于拼接多个字符串特别是拼接列表中的字符串join()比更高效words[Python,Java,Go,Rust]# 用join拼接——高效result, .join(words)print(result)# Python, Java, Go, Rust# 不用join拼接——低效每次都创建新字符串resultforwordinwords:resultword, resultresult[:-2]# 去掉最后的逗号和空格print(result)# Python, Java, Go, Rust# URL路径拼接path_parts[api,v1,users,123]url/.join(path_parts)print(url)# api/v1/users/123# HTML标签拼接items[苹果,香蕉,橘子]htmlul\n\n.join(f li{item}/liforiteminitems)\n/ulprint(html)六、字符串的编码与解码6.1 字符串str vs 字节串bytes这是很多初学者困惑的地方。关键区别str字符串人类可读的Unicode文本bytes字节串机器存储/传输的原始字节# str → bytes编码encodetext你好Pythonencodedtext.encode(utf-8)print(encoded)# b\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cPython\xef\xbc\x81print(type(encoded))# class bytes# bytes → str解码decodedecodedencoded.decode(utf-8)print(decoded)# 你好Pythonprint(type(decoded))# class str6.2 常见编码格式text你好世界# UTF-8最通用的编码建议默认使用utf8_bytestext.encode(utf-8)print(fUTF-8:{utf8_bytes}{len(utf8_bytes)}字节)# GBK/GB2312中文Windows系统常用gbk_bytestext.encode(gbk)print(fGBK:{gbk_bytes}{len(gbk_bytes)}字节)# UTF-16utf16_bytestext.encode(utf-16)print(fUTF-16:{utf16_bytes}{len(utf16_bytes)}字节)# ASCII只支持英文字符中文会报错# ascii_bytes text.encode(ascii) # UnicodeEncodeError!ascii_textHello Worldascii_bytesascii_text.encode(ascii)print(fASCII:{ascii_bytes}{len(ascii_bytes)}字节)⚠️ 文件操作中最常见的错误之一就是编码问题# 写文件时指定UTF-8编码withopen(output.txt,w,encodingutf-8)asf:f.write(中文内容)# 读文件时用相同的编码withopen(output.txt,r,encodingutf-8)asf:contentf.read()七、字符串创建的性能考量7.1 拼接 vs joinimporttime# 用拼接大量字符串慢words[hello]*10000starttime.perf_counter()resultforwordinwords:resultword elapsed_plustime.perf_counter()-startprint(f 拼接耗时{elapsed_plus:.4f}秒)# 用join快得多starttime.perf_counter()result.join(words)elapsed_jointime.perf_counter()-startprint(fjoin 耗时{elapsed_join:.4f}秒)# 速度差异可能达到上百倍 原因由于字符串不可变每次都会创建新的字符串对象并拷贝旧内容。join()只需要分配一次内存。7.2 用列表收集然后join# ❌ 频繁的字符串拼接resultforiinrange(1000):resultf第{i}行\n# ✅ 用列表收集最后一次性joinlines[]foriinrange(1000):lines.append(f第{i}行)result\n.join(lines)八、判断字符串类型的方法# 判断字符串的内容类型print(abc.isalpha())# True — 全是字母print(123.isdigit())# True — 全是数字print(abc123.isalnum())# True — 字母或数字print( .isspace())# True — 全是空白字符print(abc.islower())# True — 全是小写print(ABC.isupper())# True — 全是大写print(Abc.istitle())# True — 标题格式每个单词首字母大写print(123.isdecimal())# True — 十进制数字print(123.isnumeric())# True — 数字字符print(abc.isascii())# True — 全是ASCII字符# 这些判断方法在实际中非常有用defvalidate_password(password):验证密码复杂度iflen(password)8:returnFalse,密码至少8位ifnotany(c.isupper()forcinpassword):returnFalse,密码必须包含大写字母ifnotany(c.islower()forcinpassword):returnFalse,密码必须包含小写字母ifnotany(c.isdigit()forcinpassword):returnFalse,密码必须包含数字returnTrue,密码符合要求print(validate_password(abc))# (False, 密码至少8位)print(validate_password(abcdefgh))# (False, 密码必须包含大写字母)print(validate_password(Abcdefgh1))# (True, 密码符合要求)九、本篇小结✅ 字符串是Python中最常用的类型之一。本篇的核心收获六种创建方式单引号、双引号、三引号、str()、r-string、f-string不可变性字符串创建后不可修改所有修改都创建新字符串Unicode原生支持中文、日文、emoji都原生支持转义字符\n换行、\t制表、\\反斜杠、Unicode转义\u和\U拼接方式少量拼接、join()大量拼接性能差距巨大编码与解码encode()和decode()UTF-8最通用 字符串的创建是最基础的操作但很多开发者在性能问题上踩坑比如在循环中用拼接大量字符串。下一篇我们深入字符串的索引和切片操作。
Python基础:字符串类型str的创建方式汇总
发布时间:2026/6/6 21:24:05
Python基础字符串类型str的创建方式汇总一、开篇字符串——你最常打交道的类型如果说整数是数字世界的基础那字符串就是文字世界的基础。在编程中你处理的绝大多数数据——用户名、邮件地址、网页内容、配置文件、JSON响应——本质上都是字符串。⌨️ Python的字符串处理能力在编程语言中是第一梯队的。它内置了非常丰富的字符串操作方法和格式化工具让文本处理变得优雅而高效。这篇文章我们先从最基础的开始字符串的创建方式。后面会有多篇文章分别深入讲解字符串的切片、常用方法、格式化等专题。二、字符串创建的几种方式2.1 单引号# 最简单的字符串创建方式——用单引号name小明messageHello, Python!# 单引号字符串中如果想包含单引号需要转义textI\m a Python developerprint(text)# Im a Python developer2.2 双引号# 和单引号等价但各有各的方便之处greeting你好世界pathD:\\Projects\\Python# 双引号内可以直接使用单引号不需要转义textIm a Python developer# 简洁print(text)# Im a Python developer# 单引号内可以直接使用双引号quote他说Python很有趣print(quote)# 他说Python很有趣 选择单引号还是双引号Python中两者完全等价。一般建议字符串中包含双引号时用单引号字符串中包含单引号时用双引号什么都没有时选一种风格在整个项目中保持一致2.3 三引号多行字符串# 三个单引号long_text这是第一行 这是第二行 这是第三行print(long_text)# 三个双引号效果相同poem静夜思 床前明月光 疑是地上霜。 举头望明月 低头思故乡。print(poem)# 三引号的换行是保留的multiline第一行 第二行 第三行print(repr(multiline))# 第一行\n第二行\n第三行 三引号的两个主要用途多行字符串包含换行的长文本文档字符串docstring函数、类、模块的文档说明2.4 str() 构造函数# 将其他类型转为字符串print(str(42))# 42print(str(3.14159))# 3.14159print(str(True))# Trueprint(str(None))# Noneprint(str([1,2,3]))# [1, 2, 3]print(str({a:1}))# {a: 1}# 自定义类的字符串表示classPerson:def__init__(self,name,age):self.namename self.ageagedef__str__(self):用户友好的字符串表示returnf{self.name}{self.age}岁def__repr__(self):开发者友好的字符串表示returnfPerson(name{self.name}, age{self.age})personPerson(小明,25)print(str(person))# 小明25岁print(repr(person))# Person(name小明, age25)2.5 原始字符串r-string# 普通字符串中反斜杠是转义字符path1C:\\Users\\小明\\Documents# 需要双反斜杠path2rC:\Users\小明\Documents# 原始字符串一个反斜杠即可print(path1)# C:\Users\小明\Documentsprint(path2)# C:\Users\小明\Documents# 正则表达式是原始字符串最主要的应用场景importre patternr\d{3}-\d{4}-\d{4}# 匹配电话号码text我的电话是138-1234-5678matchre.search(pattern,text)print(match.group()ifmatchelse未匹配)# 138-1234-5678⚠️ 原始字符串的注意事项原始字符串中反斜杠仍然不能出现在字符串末尾# rhello\ # SyntaxError即使原始字符串末尾也不能是单个反斜杠rhello\\# OK2.6 f-string格式化字符串# f-string是Python 3.6引入的目前最推荐的格式化方式name小明age25score95.5# 基本用法print(f我叫{name}今年{age}岁)# 表达式求值print(f明年我就{age1}岁了)print(f我的分数是{score}等级是{优秀ifscore90else良好})# 格式化数字pi3.141592653589793print(fπ ≈{pi:.2f})# 保留2位小数print(fπ ≈{pi:.4f})# 保留4位小数# 调用方法namepythonprint(f{name.upper()})# PYTHONprint(f{name.capitalize()})# Python# 调试模式Python 3.8{变量}print(f{name}{age}{score})# 输出namepython age25 score95.5三、字符串的特性3.1 不可变性字符串是不可变对象——一旦创建字符串的内容就不能被修改namePithon# name[1] y # TypeError! 字符串不能直接修改# ✅ 正确的修改方式——创建新字符串namename[:1]yname[2:]print(name)# Python每次对字符串的修改实际上都会创建一个新的字符串对象。这个特性确保了字符串在多处引用时的安全性。3.2 有序的字符序列字符串是一个有序的字符序列这意味着每个字符都有固定的位置索引从0开始可以通过索引访问单个字符可以切片获取子串可以遍历每个字符textHello# 索引访问print(text[0])# H第一个字符print(text[-1])# o最后一个字符# 遍历每个字符forcharintext:print(char,end )# H e l l oprint()# 长度print(len(text))# 53.3 Unicode支持Python 3的字符串以Unicode存储天然支持各种语言和符号# 各种语言的文字chinese你好世界japaneseこんにちは、世界arabicمرحبا بالعالمemoji Python print(chinese)# 你好世界print(emoji)# Python # 获取字符的Unicode码点print(ord(中))# 20013print(ord())# 128013# 从码点获取字符print(chr(20013))# 中print(chr(128013))# # 完整的Unicode范围forcodeinrange(128013,128018):print(fU{code:05X}:{chr(code)})四、转义字符4.1 常用转义字符print(Hello\nWorld)# \n换行print(Hello\tWorld)# \t制表符Tabprint(Hello\\World)# \\反斜杠本身print(I\m learning)# \单引号print(He said:\Hi!\)# \双引号print(Hello\rWorld)# \r回车很少用print(Hello\bWorld)# \b退格很少用4.2 Unicode转义# 16位Unicode转义\u 4位十六进制print(你好)# 你好# 32位Unicode转义\U 8位十六进制print(\U0001f40d)# 蛇的emoji# 八进制转义\ 3位八进制数print(\101)# A八进制101 十进制65 ASCII A# 十六进制转义\x 2位十六进制print(\x41)# A五、字符串拼接与重复5.1 用 拼接first_name张last_name三full_namelast_namefirst_nameprint(full_name)# 张三# 字符串 其他类型会报错age25# message 我今年 age 岁 # TypeError!# 需要先转成字符串message我今年str(age)岁print(message)# 我今年25岁5.2 用 * 重复print(-*40)# 40个减号组成的分隔线print(你好*3)# 你好你好你好print(*5标题*5)# 标题5.3 隐式拼接这个特性很多人不知道——相邻的字符串字面量会自动拼接# Python会自动拼接相邻的字符串字面量messageHello, World! 你好print(message)# Hello, World! 你好# 这在写长字符串时很有用long_text(这是一个很长的字符串它被分成了多行来写但Python会自动把它们拼起来。)print(long_text)# 一行显示# 注意只对字符串字面量有效对变量无效aHellobWorld# result a b # SyntaxError!resultab# OK5.4 join() 方法对于拼接多个字符串特别是拼接列表中的字符串join()比更高效words[Python,Java,Go,Rust]# 用join拼接——高效result, .join(words)print(result)# Python, Java, Go, Rust# 不用join拼接——低效每次都创建新字符串resultforwordinwords:resultword, resultresult[:-2]# 去掉最后的逗号和空格print(result)# Python, Java, Go, Rust# URL路径拼接path_parts[api,v1,users,123]url/.join(path_parts)print(url)# api/v1/users/123# HTML标签拼接items[苹果,香蕉,橘子]htmlul\n\n.join(f li{item}/liforiteminitems)\n/ulprint(html)六、字符串的编码与解码6.1 字符串str vs 字节串bytes这是很多初学者困惑的地方。关键区别str字符串人类可读的Unicode文本bytes字节串机器存储/传输的原始字节# str → bytes编码encodetext你好Pythonencodedtext.encode(utf-8)print(encoded)# b\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cPython\xef\xbc\x81print(type(encoded))# class bytes# bytes → str解码decodedecodedencoded.decode(utf-8)print(decoded)# 你好Pythonprint(type(decoded))# class str6.2 常见编码格式text你好世界# UTF-8最通用的编码建议默认使用utf8_bytestext.encode(utf-8)print(fUTF-8:{utf8_bytes}{len(utf8_bytes)}字节)# GBK/GB2312中文Windows系统常用gbk_bytestext.encode(gbk)print(fGBK:{gbk_bytes}{len(gbk_bytes)}字节)# UTF-16utf16_bytestext.encode(utf-16)print(fUTF-16:{utf16_bytes}{len(utf16_bytes)}字节)# ASCII只支持英文字符中文会报错# ascii_bytes text.encode(ascii) # UnicodeEncodeError!ascii_textHello Worldascii_bytesascii_text.encode(ascii)print(fASCII:{ascii_bytes}{len(ascii_bytes)}字节)⚠️ 文件操作中最常见的错误之一就是编码问题# 写文件时指定UTF-8编码withopen(output.txt,w,encodingutf-8)asf:f.write(中文内容)# 读文件时用相同的编码withopen(output.txt,r,encodingutf-8)asf:contentf.read()七、字符串创建的性能考量7.1 拼接 vs joinimporttime# 用拼接大量字符串慢words[hello]*10000starttime.perf_counter()resultforwordinwords:resultword elapsed_plustime.perf_counter()-startprint(f 拼接耗时{elapsed_plus:.4f}秒)# 用join快得多starttime.perf_counter()result.join(words)elapsed_jointime.perf_counter()-startprint(fjoin 耗时{elapsed_join:.4f}秒)# 速度差异可能达到上百倍 原因由于字符串不可变每次都会创建新的字符串对象并拷贝旧内容。join()只需要分配一次内存。7.2 用列表收集然后join# ❌ 频繁的字符串拼接resultforiinrange(1000):resultf第{i}行\n# ✅ 用列表收集最后一次性joinlines[]foriinrange(1000):lines.append(f第{i}行)result\n.join(lines)八、判断字符串类型的方法# 判断字符串的内容类型print(abc.isalpha())# True — 全是字母print(123.isdigit())# True — 全是数字print(abc123.isalnum())# True — 字母或数字print( .isspace())# True — 全是空白字符print(abc.islower())# True — 全是小写print(ABC.isupper())# True — 全是大写print(Abc.istitle())# True — 标题格式每个单词首字母大写print(123.isdecimal())# True — 十进制数字print(123.isnumeric())# True — 数字字符print(abc.isascii())# True — 全是ASCII字符# 这些判断方法在实际中非常有用defvalidate_password(password):验证密码复杂度iflen(password)8:returnFalse,密码至少8位ifnotany(c.isupper()forcinpassword):returnFalse,密码必须包含大写字母ifnotany(c.islower()forcinpassword):returnFalse,密码必须包含小写字母ifnotany(c.isdigit()forcinpassword):returnFalse,密码必须包含数字returnTrue,密码符合要求print(validate_password(abc))# (False, 密码至少8位)print(validate_password(abcdefgh))# (False, 密码必须包含大写字母)print(validate_password(Abcdefgh1))# (True, 密码符合要求)九、本篇小结✅ 字符串是Python中最常用的类型之一。本篇的核心收获六种创建方式单引号、双引号、三引号、str()、r-string、f-string不可变性字符串创建后不可修改所有修改都创建新字符串Unicode原生支持中文、日文、emoji都原生支持转义字符\n换行、\t制表、\\反斜杠、Unicode转义\u和\U拼接方式少量拼接、join()大量拼接性能差距巨大编码与解码encode()和decode()UTF-8最通用 字符串的创建是最基础的操作但很多开发者在性能问题上踩坑比如在循环中用拼接大量字符串。下一篇我们深入字符串的索引和切片操作。