花猫语:Python中下划线的使用很神奇,相信大家在各种文章或者教程中都看到过。在2016年3.6版本之后,Python还引入了一种新的语法,允许下划线也出现在数值中。这份翻译文档将带您回顾该功能的介绍过程。总结和基本原理本PEP提议扩展Python的语法,以便在“number-from-string”构造函数中,下划线可以用作整数、浮点数和复杂文字的可视分隔符。分组。(Python猫注:对于Python的数值类型,可以查看PEP-3141)这是其他现代语言的共同特征,有助于理解应该直观地分成几个部分的长值或字面值,例如十六进制字节orwordsinnotation.例子:#groupingdecimalnumbersbythousandsamount=10_000_000.0#groupinghexadecimaladdressesbywordsaddr=0xCAFE_F00D#groupingbitsintonibblesinabinaryliteralflags=0b_0011_1111_0100_1110#same,forstringconversionsflags=int('0b_1111_0000',2)规范目前的提议是在数字之间和在数字字面量的基本标准符之后,允许有下划线。下划线没有语义意义,并??且数字文字被解析为好像没有下划线一样。文字语法因此,整数文字的表示法如下所示:integer:decinteger|bininteger|octinteger|hexintegerdecinteger: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|exponentfloatpointfloat:[digitpart]fraction|digitpart"."exponentfloat:(digitpart|pointfloat)exponentdigitpart:digit(["_"]digit)*fraction:"."digitpartexponent:("e"|"E")["+"|"-"]digitpartimagnumber:(floatnumber|digitpart)("j"|"J")构造函数遵循相同的放置规则,在以下构造函数中可以使用下划线:int()(任意基数)float()complex()Decimal()进一步将数字转换为字符数字-to-string格式化语法将被扩展以允许_作为千位分隔符。这允许使用更易读的文字更轻松地生成代码。[11]语法与逗号相同,例如{:10_}表示宽度为10,带有_分隔符。也将支持并按4位数字分组。允许对下划线进行分组的现有语言实现了大量放置下划线的规则。在语言规范与实际行为相矛盾的情况下,下面列出了实际行为。(“单个”或“多个”是指允许有多少个连续的下划线。)Ada:单个,仅在数字之间[8]C#(7.0版提案):多个,仅在数字[6]之间C++14:单个,数字之间(选择其他分隔符)[1]D:多个,任何地方,包括结尾[2]Java:多个,仅在数字之间[7]Julia:单个,仅在数字之间(但不是浮点指数部分)[9]Perl5:多个,基本上任何地方,尽管文档说数字之间限制1个下划线[3]Ruby:单个,仅在数字之间(尽管文档说“任何地方”)[10]Rust:多个,除了指数“e”之外的任何地方andbetweendigits[4]Swift:multiple,betweendigitsandattheend(althoughdocssayonly"betweendigits")[5]弃用的语法(PythonCat注:每个PEP可能会在初始阶段引起大量关于语法设计的讨论stageofproposal.在正式通过的PEP中,一般会保留一些有代表性的被拒绝的方案,比如下面的2个itemoftheunderscore)1.放置下划线的规则减少了对下划线使用的限制,而不是上面说的相对严格的规则。在其他语言中,通用规则包括:只允许一个连续的下划线,并且只能在数字之间。允许有多个连续的下划线,但只能在数字之间。允许使用多个连续的下划线,在除文字开头以外的大多数位置,或在特殊位置(例如小数点后)。最终选择此PEP中的语法是因为它涵盖了常见的用例,并且不包含Python风格指南不鼓励使用的语法。一个不太常见的规则是只允许每N个数字使用下划线(其中N可能是3个十进制文字,或4个十六进制文字)。这是不必要的限制,特别是考虑到这些分隔符位置在不同文化中是不同的。(蟒猫注:比如我们国家习惯对4个数字进行分组,即10,000是10,000,不是英文文化中的10,000)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[9]https://web.archive.org/web/20160223175334/http://docs.julialang.org/en/release-0.4/manual/integers-and-浮点数/[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.txtPEP原文:https://www.python.org/dev/peps/pep-0515PEP标题:PEP515--下划线inNumericLiteralsPEP作者:GuidovanRossum,NickCoghlan创建日期:GeorgBrandl,SerhiyStorchaka合并版本:3.6译者:PeaFlowerUndertheCat@Python猫PEP翻译计划:https://github.com/chinesehuazhou/peps-cn本文转载自微信公众号“蟒猫”,可通过以下二维码关注。转载本文请联系Python猫公众号。
