Python 數值中的下劃線是怎么回事?

      網友投稿 597 2025-04-03

      花下貓語:Python 中下劃線的用法令人嘆為觀止,相信你已在各種文章或教程中見識過了。在 2016 年的 3.6 版本之后,Python 還引入了一種新的語法,使得下劃線也可以出現在數值中。這篇翻譯的文檔,將帶你重溫這個特性的引入過程。

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

      PEP標題:PEP 515 – Underscores in Numeric Literals

      創建日期: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]

      C# (7.0 版本的提案):多個,僅在數字間 [6]

      C++14:單個,在數字之間(選了其它分隔符) [1]

      D:多個,任意位置,包括末尾 [2]

      Java:多個,僅在數字間 [7]

      Julia:單個,僅在數字間(但不含浮點指數部分) [9]

      Perl 5:多個,基本是任意位置,盡管文檔說數字間限制 1 個下劃線 [3]

      Ruby:單個,僅在數字間(盡管文檔說“任意位置”)[10]

      Rust:多個,任意位置,除了指數“e”與數字間 [4]

      Swift:多個,數字之間和末尾(盡管文檔說僅在“數字之間”) [5]

      被否決的語法

      (Python貓注:每個 PEP 在初提出階段,都可能引起很多關于語法設計的討論,在正式采納的 PEP 中,一般會保留一些有代表性的被否決的方案,例如下面的兩項)

      1、下劃線的放置規則

      減少下劃線的使用限制,而不是上面聲明的相對嚴格的規則。在其它語言中,常見的規則包括:

      只允許一個連續的下劃線,并且只能在數字之間。

      允許多個連續的下劃線,但只能在數字之間。

      允許多個連續的下劃線,在大多數位置,除了字面量的開頭,或特殊的位置(例如小數點后)。

      本 PEP 中的語法最終被選中,因為它涵蓋了常見的用例,并且不會出現被 Python 風格指南所不鼓勵使用的語法。

      一個不太常見的規則是只允許每 N 位數字有下劃線(其中 N 可能是 3 個十進制字面量,或 4 個十六進制字面量)。這是不必要的限制,特別是考慮到這些分隔符位置在不同的文化中是不同的。(Python貓注:例如,我們國家習慣將 4 個數字分為一組,即 10000 是 1 萬,而不是英語文化中的 10 thousand)

      2、其它的分隔符

      還有一種建議是使用空格進行分組。雖然字符串是一種結合相鄰字面量的先例,但這種行為可能會導致意外的效果,而下劃線則不會。而且,除了那些基本會忽略任何空格的語言外,沒有其它語言使用此規則。

      c++ 14 引入了單引號來進行分組(因為下劃線會與用戶定義的字面量產生歧義),由于單引號已經被 Python 的字符串字面量使用了,所以沒有考慮它。[1]

      實現

      實現上述規范的初步補丁已經發布到問題-。[12]

      參考內容

      [1] (1, 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3499.html

      [2] https://dlang.org/spec/lex.html#integerliteral

      [3] https://perldoc.perl.org/perldata#Scalar-value-constructors

      Python 數值中的下劃線是怎么回事?

      [4] https://web.archive.org/web/20160304121349/http://doc.rust-lang.org/reference.html#integer-literals

      [5] https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html

      [6] https://github.com/dotnet/roslyn/issues/216

      [7] https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html

      [8] http://archive.adaic.com/standards/83lrm/html/lrm-02-04.html#2.4

      [9] https://web.archive.org/web/20160223175334/http://docs.julialang.org/en/release-0.4/manual/integers-and-floating-point-numbers/

      [10] https://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html#label-Numbers

      [11] https://mail.python.org/pipermail/python-dev/2016-February/143283.html

      [12] http://bugs.python.org/issue26331

      版權

      該文檔已放入公共領域。

      源文件:https://github.com/python/peps/blob/master/pep-0515.txt

      Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:無代碼開發平臺有哪些優勢(無代碼開發平臺有哪些優勢和劣勢)
      下一篇:報表表格開源(java報表開源)
      相關文章
      亚洲一区二区三区在线| 亚洲精品国精品久久99热| 亚洲av高清在线观看一区二区| 国产精品亚洲精品观看不卡| 亚洲精品中文字幕麻豆| 亚洲人成亚洲精品| 久久精品国产精品亚洲色婷婷| 国产日韩成人亚洲丁香婷婷| 亚洲国产精品无码久久九九| 亚洲五月午夜免费在线视频| 亚洲国产精品日韩| 亚洲综合久久夜AV | 国产精品亚洲精品日韩已方| 国产成人亚洲综合无码| 久久精品国产亚洲精品| 亚洲三区在线观看无套内射| 亚洲老妈激情一区二区三区| 亚洲美女又黄又爽在线观看| 国产成A人亚洲精V品无码| 亚洲欧美日韩中文字幕在线一区| 久久亚洲AV成人无码电影| 亚洲午夜精品一区二区| 在线电影你懂的亚洲| 亚洲欧洲日韩在线电影| 亚洲一区二区三区91| 在线观看日本亚洲一区| 亚洲愉拍一区二区三区| 亚洲乱码国产乱码精华| 国产亚洲精品国产福利在线观看| 国产成人亚洲综合在线| 国产成人亚洲影院在线观看| 亚洲成A人片在线观看无码不卡| 久久亚洲国产成人亚| 亚洲综合一区二区| 亚洲一区二区三区乱码在线欧洲| 亚洲中文字幕无码久久| 日韩色日韩视频亚洲网站| 亚洲AV无码乱码精品国产| 亚洲一区二区三区香蕉| 亚洲国产精品久久久久婷婷软件| 色播亚洲视频在线观看|