PYTHON BASICS
Python 单引号、双引号和三引号有什么区别?用法、转义与场景一次讲清
从普通字符串、转义与路径,到多行文本和 Docstring,一次理清引号的选择逻辑。
先说结论
单引号和双引号在功能上没有本质区别,选择时主要看哪一种写法能让代码更清晰、转义更少;三引号则更适合多行文本和文档字符串。

在刚开始开展 Python 学习的时候,我一直没有完全理解一个问题:既然单引号和双引号都能够用来表示字符串,那么 Python 为什么还需要同时保留这两种不同的写法?后来随着自己编写的代码逐渐增多,我才慢慢发现,它们之间真正存在的区别,并不是体现在功能方面,而是更多体现在代码的可读性以及书写便利性上。
这篇内容会讲清楚
01 单引号和双引号为什么功能相同
02 引号、反斜杠与路径应该怎么处理
03 三引号、Docstring 与注释的边界

01 / BASICS
单引号和双引号功能相同
它们创建的都是普通字符串对象,区别主要体现在书写方式。
在 Python 当中,'Python' 和 "Python" 所创建出来的内容,实际上都属于 str 字符串类型,在程序运行效果方面不存在本质上的区别。无论使用单引号还是双引号,只要前后引号保持一致,Python 都能够把其中的内容识别为字符串。
KEY POINT
单引号和双引号不是一个更高级、一个更低级,真正要比较的是哪种写法更清晰。

02 / SELECTION
根据字符串内部的符号选择
哪一种引号能减少转义,就优先使用哪一种。
在实际开展代码编写的时候,我通常会根据字符串内部已经包含的符号,选择更加合适的引号形式。例如,当字符串内容里面包含英文单引号时,我一般会在字符串外部使用双引号:
message = "I'm learning Python."
通过这样的写法,字符串内部的英文单引号就不需要额外开展转义处理,整体代码看起来也会更加直接。
如果字符串内容里面已经包含了双引号,我通常会在外部改用单引号:
message = 'He said "Hello".'
这种选择方式的主要好处,就是能够尽量减少反斜杠转义字符的使用,让字符串本身的内容更加清楚,同时也能够在一定程度上提升代码阅读过程中的直观性。
✓ 实用提示
不要死记某一种固定写法。字符串里有单引号,就优先用双引号包裹;字符串里有双引号,就优先用单引号包裹。

03 / ESCAPING
混合引号时如何转义
当两种引号都要出现时,反斜杠负责说明字符的真实含义。
当然,如果一个字符串当中同时包含单引号以及双引号,那么就可能需要使用 \' 或者 \" 来完成相对应的转义处理。通过转义字符,可以告诉 Python 某一个引号只是字符串内容的一部分,而不是表示字符串已经结束。

04 / PATHS
Windows 路径与原始字符串
反斜杠在路径里很常见,但在 Python 字符串中通常具有特殊含义。
在处理 Windows 文件路径的时候,还需要特别注意反斜杠本身所具有的特殊含义。由于反斜杠通常会被 Python 当作转义字符来处理,因此路径当中的一个反斜杠,有时需要写成两个反斜杠:
path = "C:\\Users\\Admin\\Desktop"
除此之外,也可以在字符串前面增加 r,把它写成原始字符串,从而减少反斜杠转义所带来的影响:
path = r"C:\Users\Admin\Desktop"
05 / MULTILINE
三引号适合多行字符串
它可以直接保留换行、空格与段落结构。
相比于单引号和双引号,三引号的使用场景则存在着比较明显的不同。三引号通常更加适合用来表示多行字符串,它能够直接保留文本内容当中的换行、空格以及段落格式,而不需要手动添加多个 \n 来完成换行。
例如,在编写多行 SQL 语句、模板文本或者较长的说明内容时,就可以使用三引号:
sql = """
SELECT name, age
FROM users
WHERE age >= 18
ORDER BY age DESC;
"""
通过这样的方式,可以让代码当中的文本结构与最终展示出来的结构保持相对一致,也不需要把多行内容拆分成多个字符串再进行拼接。

06 / DOCSTRING
三引号还可以编写 Docstring
文档字符串用于说明函数、类或模块的功能与使用方式。
此外,三引号还经常被用来编写 Docstring,也就是文档字符串。当一个字符串出现在函数、类或者模块的开头位置时,它可以用来说明相对应代码的功能、参数、返回结果以及使用方式。
def add(a, b):
"""
返回两个数字相加的结果。
参数:
a: 第一个数字
b: 第二个数字
返回:
a 与 b 的和
"""
return a + b
这种文档字符串不仅可以帮助开发人员理解代码,还能够通过 __doc__ 属性进行读取:

07 / COMMENTS
三引号不是多行注释
看起来像注释,不代表它在语法上就是注释。
不过,我后来才逐渐意识到,三引号在本质方面仍然是在创建字符串对象,而不是 Python 专门提供的一种多行注释语法。
有时候,人们会通过单独放置一个没有被赋值的三引号字符串,达到类似“注释掉一段内容”的效果。但是从语言本身的定义来看,这段内容依然属于字符串,只不过没有被进一步使用。如果需要编写真正意义上的代码注释,仍然应该使用 #:
注意事项
三引号创建的是字符串;真正意义上的代码注释,仍然应该使用井号。

∞ / SUMMARY
最后,记住这套选择原则
理解用途,比死记某一种引号写法更重要。
现在我在选择字符串引号的时候,主要遵循一个相对简单的原则:普通字符串可以使用单引号或者双引号,哪一种写法能够减少转义,就优先选择哪一种;多行文本以及文档字符串,可以使用三引号;而用来解释代码逻辑的说明内容,则应该使用 # 来编写注释。
1普通字符串单引号和双引号都可以,优先使用转义更少、阅读更清楚的写法。
2多行文本与文档字符串使用三引号,直接保留换行和段落结构。
3代码注释使用井号,不要把三引号直接等同于多行注释。

单引号、双引号以及三引号本身并不难,真正重要的是理解它们分别适合使用在哪些具体场景当中。相比于单纯记忆语法形式,能够根据字符串内容以及实际需求选择更加清晰的写法,往往会更加重要。
SUMMARY
单、双引号看可读性,三引号看多行与文档需求,代码注释始终使用井号。
如果你觉得今天这篇有收获
欢迎点赞、在看、转发三连,我们下篇见