Python 中下划线的用法令人叹为观止,相信你已在各种文章或教程中见识过了。在 2016 年的 3.6 版本之后,Python 还引入了一种新的语法,使得下划线也可以出现在数值中。
概要和原理
本 PEP 提议扩展 Python 的语法,使得在“字符串变成数”(number-from-string)构造器中,下划线可以作为视觉分隔符,对整数、浮点和复数字面量的数字进行分组。
这是其它现代语言的一个常见特性,有助于理解长的或者值应该被直观地分成几部分的字面量,如十六进制表示法中的字节或单词。
例子:
# grouping decimal numbers by thousands
amount = 10_000_000.0
# grouping hexadecimal addresses by words
addr = 0xCAFE_F00D
# grouping bits into nibbles in a binary literal
flags = 0b_0011_1111_0100_1110
# same, for string conversions
flags = int('0b_1111_0000', 2)
规范
目前的提议是在数字之间和在数字字面量的基本标识符之后,允许有一个下划线。下划线没有语义上的意义,数字字面量会被解析得就像没有下划线一样。
字面量语法
因此,整型字面量的表示法看起来像这样:
integer: decinteger | bininteger | octinteger | hexinteger
decinteger: nonzerodigit (["_"] digit)* | "0" (["_"] "0")*
bininteger: "0" ("b" | "B") (["_"] bindigit)+
octinteger: "0" ("o" | "O") (["_"] octdigit)+
hexinteger: "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit: "1"..."9"
digit: "0"..."9"
bindigit: "0" | "1"
octdigit: "0"..."7"
hexdigit: digit | "a"..."f" | "A"..."F"
浮点数和复数的字面量:
floatnumber: pointfloat | exponentfloat
pointfloat: [digitpart] fraction | digitpart "."
exponentfloat: (digitpart | pointfloat) exponent
digitpart: digit (["_"] digit)*
fraction: "." digitpart
exponent: ("e" | "E") ["+" | "-"] digitpart
imagnumber: (floatnumber | digitpart) ("j" | "J")
构造函数
遵循相同的放置规则,下划线可以在以下构造函数中使用:
- int()(任意进制)
- float()
- complex()
- Decimal()
- Ada:单个,仅在数字间 [8]
- C# (7.0 版本的提案):多个,仅在数字间[6]
- C++14:单个,在数字之间(选了其它分隔符)[1]
- D:多个,任意位置,包括末尾 [2]
- Java:多个,仅在数字间 [7]
- Julia:单个,仅在数字间(但不含浮点指数部分) [9]
- Perl 5:多个,基本是任意位置,尽管文档说数字间限制 1 个下划线 [3]
- Ruby:单个,仅在数字间(尽管文档说“任意位置”)[10]
- Rust:多个,任意位置,除了指数“e”与数字间[4]
- Swift:多个,数字之间和末尾(尽管文档说仅在“数字之间”) [5]
- 只允许一个连续的下划线,并且只能在数字之间。
- 允许多个连续的下划线,但只能在数字之间。
- 允许多个连续的下划线,在大多数位置,除了字面量的开头,或特殊的位置(例如小数点后)。 本 PEP 中的语法最终被选中,因为它涵盖了常见的用例,并且不会出现被 Python 风格指南所不鼓励使用的语法。
© 版权声明
THE END
暂无评论内容