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]
- 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
[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
[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 数值中的下划线是怎么回事?的更多相关文章
- 详解 Python 中的下划线命名规则
在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- python 里面的单下划线与双下划线的区别
python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...
- Python 的类的下划线命名有什么不同?
1. 以一个下划线开头的命名 ,如_getFile2. 以两个下划线开头的命名 ,如__filename3. 以两个下划线开头和结尾的命名,如 __init__()4. 其它 单下划线前缀的 ...
- python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名
python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...
- 为什么Java7开始在数字中使用下划线
JDK1.7的发布已经介绍了一些有用的特征,尽管大部分都是一些语法糖,但仍然极大地提高了代码的可读性和质量.其中的一个特征是介绍字面常量数字的下划线.从Java7开始,你就可以在你的Java代码里把长 ...
- [转帖]Go中的下划线
Go中的下划线 https://blog.csdn.net/wanglei9876/article/details/50475864 下划线的作用: 在import 时 是仅引入 init 函数 在正 ...
- Python里的单下划线,双下划线,以及前后都带下划线的意义
Python里的单下划线,双下划线,以及前后都带下划线的意义: 单下划线如:_name 意思是:不能通过from modules import * 导入,如需导入需要:from modules imp ...
- 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题
1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...
随机推荐
- 09:CBV与settings
CBV源码 # 切入点 url(r'^login/', views.Mylogin.as_view()) '''类名点名字还加括号 名字要么是绑定给类的方法 要么是无参函数''' 1.as_vie ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(6) : 添加LUIS,理解自然语言 (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- 【linux】驱动-13-阻塞与非阻塞
目录 前言 13. 阻塞与非阻塞 13.1 阻塞与非阻塞 13.2 休眠与唤醒 13.2.1 内核休眠函数 13.2.2 内核唤醒函数 13.3 等待队列(阻塞) 13.3.1 定义等待队列头部 13 ...
- Pytest学习笔记4-assert断言
前言 pytest作为单元测试框架,自然少不了断言功能,用过unittest的人都知道,在unittest中有丰富的断言方法,比如assertEqual().assertIn().assertTrue ...
- python之str 字符串
str,字符串,有序的,存储多个字符,不可修改,通过下标值访问快捷方式 1, 定义一个空字符串 2,定义一个非空字符串 3,索引,又名下标值 4,切片与延长 5,转义字符 6, python 属于面向 ...
- React 开发环境准备
1. 使用reactjs,一般有以下两种方式: (1)通过script标签引入reactjs.这种方式不推荐使用,如果我们的项目比较大,就需要对项目进行拆分,于是页面就需要通过script标签引入很多 ...
- 5.1 万 Star!不用 root 就能连接控制安卓的开源工具
[导语]:一款在 PC 端控制安卓设备的小工具.可在 PC 和安卓设备间互通剪贴板.用电脑键盘打字.传输文件.安装程序.截图.录屏等等功能. 简介 scrcpy 可以显示并控制通过 USB (或 TC ...
- 35、sudo权限设置
提示:sudo的介绍在"13.linux中用户和用户组"中有详细介绍: (1)简历里要加上如下项目经验: 服务器用户权限管理改造方案与实施项目 日期: 在了解公司业务流程后,提出权 ...
- django项目部署到centos,踩的坑
FAQ1:在使用pip3安装库的时候,提示需要升级pip pip3 install --upgrade pip FAQ2:在创建软链接时,提示:ln: failed to create symboli ...
- Maven:Maven的project标签报错红线
作者在外网完成demo项目,把Maven的本地库打成压缩包放进内网时,Maven的project标签报错红线,且别的依赖不报错,同时Maven不引入本地仓库的依赖包. 解决方法: 进入自己的Maven ...