说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
字面值是内置类型常量值的表示法。在 Python 中,构建数据类型的实例时,literals(字面量、字面值、直接量等)是表示源代码中固定值的符号,它们也可以定义为原始值或变量或常量中给定的数据。字面量所表示的意思就是他字面的值,也就是说其意思是表里如一的,你看到的是什么,他就是什么。在我们的程序中可以直接使用字面量。
Python 支持以下类型的字面量:
'''
字符串字面值 :: "halo" , '12345', u"hello"
整型字面值 :: 0,1,2,-1,-2
浮点型字面值 :: 3.14
虚数字面值 :: 12j
'''
Python 中不同的字面量有:
其他包含字面值的称为 displays 表达式,用于创建各种容器。它们不是真正的字面值,因为它们可以包含非文字表达式。
布尔型中的 True 和 False 是 Python 的内置常量,也是关键字,他们不是字面值。
文字都可以用匹配的单引号(')或双引号(")括起来。它们也可以用三个单引号或双引号(通常称为三引号字符串)组成的匹配组括起来。反斜杠(\)字符用于给n等普通字符赋予特殊含义,在转义时表示“换行符”(\n). 它还可以用于转义其他具有特殊含义的字符,例如换行符、反斜杠本身或引号字符。有关示例,请参见下面的转义序列。
# 单引号
'hello'
# 双引号
"hello"
# 三引号
"""hello"""
'''hello'''
# 三引号可显式换行
"""
hello
"""
字符串和字节串都可以加前缀 'r' 或 'R',称为 原始字符串,原始字符串把反斜杠当作原义字符,不执行转义操作。因此,原始字符串不转义 '\U' 和 '\u'。与 Python 2.x 的原始 unicode 字面值操作不同,Python 3.x 现已不支持 'ur' 句法。
前缀为 'f' 或 'F' 的字符串称为 格式字符串;详见 格式字符串字面值。'f' 可与 'r' 连用,但不能与 'b' 或 'u' 连用,因此,可以使用原始格式字符串,但不能使用格式字节串字面值。
三引号字面值可以包含未转义的换行和引号(原样保留),除了连在一起的,用于终止字面值的,未经转义的三个引号。("引号" 是启用字面值的字符,可以是 ',也可以是 "。)
如未标注 'r' 或 'R' 前缀,字符串和字节串字面值中,转义序列以类似 C 标准的规则进行解释。可用的转义序列如下:
转义序列 | 含意 |
---|---|
\newline
|
忽略反斜杠与换行符 |
\\
|
反斜杠(\ )
|
\'
|
单引号(' )
|
\"
|
双引号(" )
|
\a
|
ASCII 响铃(BEL) |
\b
|
ASCII 退格符(BS) |
\f
|
ASCII 换页符(FF) |
\n
|
ASCII 换行符(LF) |
\r
|
ASCII 回车符(CR) |
\t
|
ASCII 水平制表符(TAB) |
\v
|
ASCII 垂直制表符(VT) |
\ooo
|
八进制数 ooo 字符 |
\xhh
|
十六进制数 hh 字符 |
字符串字面值专用的转义序列:
转义序列 | 含意 |
---|---|
\N{name}
|
Unicode 数据库中名为 name 的字符 |
\uxxxx
|
16 位十六进制数 xxxx 码位的字符 |
\Uxxxxxxxx
|
32 位 16 进制数 xxxxxxxx 码位的字符 |
即使在原始字面值中,引号也可以用反斜杠转义,但反斜杠会保留在输出结果里;例如 r""" 是由两个字符组成的有效字符串字面值:反斜杠和双引号;r"" 则不是有效字符串字面值(原始字符串也不能以奇数个反斜杠结尾)。尤其是,原始字面值不能以单个反斜杠结尾 (反斜杠会转义其后的引号)。还要注意,反斜杠加换行在字面值中被解释为两个字符,而 不是 连续行。
以空白符分隔的多个相邻字符串或字节串字面值,可用不同引号标注,等同于合并操作。因此,"hello" 'world' 等价于 "helloworld"。此功能不需要反斜杠,即可将长字符串分为多个物理行,还可以为不同部分的字符串添加注释,例如:
re.compile("[A-Za-z_]" # letter or underscore
"[A-Za-z0-9_]*" # letter, digit or underscore
)
注意,此功能在句法层面定义,在编译时实现。在运行时,合并字符串表达式必须使用 '+' 运算符。还要注意,字面值合并可以为每个部分应用不同的引号风格(甚至混用原始字符串和三引号字符串),格式字符串字面值也可以与纯字符串字面值合并。
格式字符串字面值 或称 f-string 是标注了 'f' 或 'F' 前缀的字符串字面值。这种字符串可包含替换字段,即以 {} 标注的表达式。其他字符串字面值只是常量,格式字符串字面值则是可在运行时求值的表达式。
见:格式化字符串。
3.6 新版功能。
自 Python 3.6以来,在字符串文字中使用无效的转义序列一直受到反对。从那时起,试图使用无效的转义序列会发出DeprecationWarning。如果不在启用警告的情况下运行Python,这通常会被忽略。DeprecationWarnings默认情况下处于静默状态。
Python 3.12将DeprecationWarning升级为SyntaxWarning。SyntaxWarnings是编译器在解析代码时发出的,而不是在运行代码时发出,因此不能使用运行时警告过滤器来忽略它们。与DeprecationWarnings不同,SyntaxWarnings是默认显示的,这就是您现在看到它的原因。这种能见度的提高是有意的。在Python的未来版本中,在字符串文字中使用无效的转义序列计划最终成为一个硬SyntaxError。
显而易见的解决方案是使用注释代替字符串文字。与字符串文字不同,注释不需要在语法上有效。请参阅Python注释中的讨论:#与字符串,了解为什么不建议使用字符串文字作为注释。
为了解决此警告,您可以将字符串文字设置为原始字符串文字 r'...'
。原始字符串文字不处理转义序列。例如,r"\n"
被简单地视为字符\和n,而不是换行转义序列。
字节串字面值要加前缀 'b' 或 'B';生成的是类型 bytes 的实例,不是类型 str 的实例;字节串只能包含 ASCII 字符;字节串数值大于等于 128 时,必须用转义表示。
数值字面值有三种类型:整数、浮点数、虚数。没有复数字面值(复数由实数加虚数构成)。
注意,数值字面值不含正负号;实际上,-1 等负数是由一元运算符 '-' 和字面值 1 合成的。
整数字面值的长度没有限制,能一直大到占满可用内存。
确定数值时,会忽略字面值中的下划线。下划线只是为了分组数字,让数字更易读。下划线可在数字之间,也可在 0x 等基数说明符后。
注意,除了 0 以外,十进制数字的开头不允许有零。以免与 Python 3.0 版之前使用的 C 样式八进制字面值混淆。
整数字面值示例如下:
7
3
2147483647
79228162514264337593543950336
100_000_000_000
0o177
0o377
0b100110111
0o377
0xdeadbeef
0b_1110_0101
在 3.6 版更改: 现已支持在字面值中,用下划线分组数字。
注意,解析时,整数和指数部分总以 10 为基数。例如,077e010 是合法的,表示的数值与 77e10 相同。浮点数字面值的支持范围取决于具体实现。整数字面值支持用下划线分组数字。
浮点数字面值示例如下:
3.14
10.
.001
1e100
3.14e-10
0e0
3.14_15_93
在 3.6 版更改: 现已支持在字面值中,用下划线分组数字。
虚数字面值生成实部为 0.0 的复数。复数由一对浮点数表示,它们的取值范围相同。创建实部不为零的复数,则需添加浮点数,例如 (3+4j)。虚数字面值示例如下:
3.14j
10.j
10j
.001j
1e100j
3.14e-10j
3.14_15_93j
默认命名空间的 Ellipsis
与省略号字面值 ...
相同,该特殊值主要是与用户定义的容器数据类型的扩展切片语法结合使用。 Ellipsis 是 types.EllipsisType 类型的唯一实例。
Ellipsis
# Ellipsis
...
# Ellipsis
Ellipsis == 1
# False
import builtins
'Ellipsis' in dir(builtins)
# True
type(...)
# ellipsis
# 是一个单例
id(...)
# 4316973504
bool(...)
# True
使用场景可以参考 NumPy Array 的索引。
todo
参考:https://farer.org/2017/11/29/python-ellipsis-object/
元组是不同数据类型的集合。它由圆括号“()”括起,每个元素用逗号(,)分隔。它是不变的。
(a, b)
(2, 4, 6, 8)
(1, )
() # 空元组
1,
1,2
单元素的元组可以不使用括号,在其他字面加逗号,如果使用括号必须使用一个逗号。
请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。
圆括号内如果是单个字面量、标识符会被认为是表达式,圆括号也能起到隐式拼接行作用,此时就不能用于元组字面值的表达。
内置库中的 typing.Literal 表示类型检查器对应变量或函数参数的值等价于给定字面量(或多个字面量之一)的类型。
typing.Literal[1, 2, 3, "foo", 5, None]
typing.Literal[None]
typing.Literal[{"a": "b", "c": "d"}]
更新时间:June 21, 2024, 8:19 a.m. 标签:python 字面值 常量