乐趣区

关于python:Python-数值中的下划线是怎么回事

花下猫语:Python 中下划线的用法令人叹为观止,置信你已在各种文章或教程中见识过了。在 2016 年的 3.6 版本之后,Python 还引入了一种新的语法,使得下划线也能够呈现在数值中。这篇翻译的文档,将带你重温这个个性的引入过程。

PEP 原文:https://www.python.org/dev/peps/pep-0515

PEP 题目:PEP 515 — Underscores in Numeric Literals

PEP 作者:Guido van Rossum, Nick Coghlan

创立日期:Georg Brandl, Serhiy Storchaka

合入版本:3.6

译者:豌豆花下猫 @Python 猫

PEP 翻译打算:https://github.com/chinesehuazhou/peps-cn

概要和原理

本 PEP 提议扩大 Python 的语法,使得在“字符串变成数”(number-from-string)结构器中,下划线能够作为视觉分隔符,对整数、浮点和复数字面量的数字进行分组。

(Python 猫注:对于 Python 的数值类型,能够查看 PEP-3141)

这是其它古代语言的一个常见个性,有助于了解长的或者值应该被直观地分成几局部的字面量,如十六进制表示法中的字节或单词。

例子:

# 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()

    进一步的变更

旧式的数字转字符串(number-to-string)格式化语法将被扩大,容许 _ 作为千位分隔符。这能够用更具可读性的字面量来轻松地生成代码。[11]

The syntax would be the same as for the comma, e.g. {:10_} for a width of 10 with _ separator.(这句没看懂 … 不译)

对于 b、x 和 o 格局符,_ 也将反对,并按 4 位数分组。

现有的技术

那些容许下划线分组的语言,实现了大量搁置下划线的规定。在语言标准与理论行为相矛盾的状况下,以下会列出理论的行为。(“单个”或“多个”指的是容许多少间断的下划线。)

  • Ada:单个,仅在数字间 [[8]](https://www.python.org/dev/pe…
  • C#(7.0 版本的提案):多个,仅在数字间 [[6]](https://www.python.org/dev/pe…
  • C++14:单个,在数字之间(选了其它分隔符)[[1]](https://www.python.org/dev/pe…
  • D:多个,任意地位,包含开端 [[2]](https://www.python.org/dev/pe…
  • Java:多个,仅在数字间 [[7]](https://www.python.org/dev/pe…
  • Julia:单个,仅在数字间(但不含浮点指数局部)[[9]](https://www.python.org/dev/pe…
  • Perl 5:多个,根本是任意地位,只管文档说数字间限度 1 个下划线 [[3]](https://www.python.org/dev/pe…
  • Ruby:单个,仅在数字间(只管文档说“任意地位”)[[10]](https://www.python.org/dev/pe…
  • Rust:多个,任意地位,除了指数“e”与数字间 [[4]](https://www.python.org/dev/pe…
  • Swift:多个,数字之间和开端(只管文档说仅在“数字之间”)[[5]](https://www.python.org/dev/pe…

    被否决的语法

(Python 猫注:每个 PEP 在初提出阶段,都可能引起很多对于语法设计的探讨,在正式驳回的 PEP 中,个别会保留一些有代表性的被否决的计划,例如上面的两项)

1、下划线的搁置规定

缩小下划线的应用限度,而不是下面申明的绝对严格的规定。在其它语言中,常见的规定包含:

  • 只容许一个间断的下划线,并且只能在数字之间。
  • 容许多个间断的下划线,但只能在数字之间。
  • 容许多个间断的下划线,在大多数地位,除了字面量的结尾,或非凡的地位(例如小数点后)。

本 PEP 中的语法最终被选中,因为它涵盖了常见的用例,并且不会呈现被 Python 格调指南所不激励应用的语法。

一个不太常见的规定是只容许每 N 位数字有下划线(其中 N 可能是 3 个十进制字面量,或 4 个十六进制字面量)。这是不必要的限度,特地是思考到这些分隔符地位在不同的文化中是不同的。(Python 猫注:例如,咱们国家习惯将 4 个数字分为一组,即 10000 是 1 万,而不是英语文化中的 10 thousand)

2、其它的分隔符

还有一种倡议是应用空格进行分组。尽管字符串是一种联合相邻字面量的先例,但这种行为可能会导致意外的成果,而下划线则不会。而且,除了那些根本会疏忽任何空格的语言外,没有其它语言应用此规定。

c++ 14 引入了单引号来进行分组(因为下划线会与用户定义的字面量产生歧义),因为单引号曾经被 Python 的字符串字面量应用了,所以没有思考它。[1]

实现

实现上述标准的初步补丁曾经公布到问题跟踪器。[[12]](https://www.python.org/dev/pe…

参考内容

[1] (1, 2) http://www.open-std.org/jtc1/…

[2] https://dlang.org/spec/lex.ht…

[3] https://perldoc.perl.org/perl…

[4] https://web.archive.org/web/2…

[5] https://docs.swift.org/swift-…

[6] https://github.com/dotnet/ros…

[7] https://docs.oracle.com/javas…

[8] http://archive.adaic.com/stan…

[9] https://web.archive.org/web/2…

[10] https://ruby-doc.org/core-2.3…

[11] https://mail.python.org/piper…

[12] http://bugs.python.org/issue2…

版权

该文档已放入公共畛域。

源文件:https://github.com/python/pep…

退出移动版