我正在处理字符串并从中提取浮点数,浮点数可以在字符串内部的不同位置。然后我注意到Python版本2.7和3.6之间的行为不同。例如,包含非数字文字的字符串,例如_
这是我发现的摘要:
Python 2.7:
In [3]: float('0_001')
ValueError: invalid literal for float(): 0_001
In [4]:
Python 3.6:
In [16]: float( '0_001' )
Out[16]: 1.0
我期望转换的行为与2.7版本一致,并且由于0_001
和1.0
之间的范围很广,我怀疑这在3.6版本中是一个错误,但我可能错了。
如果我将3.6版中的_
文字替换为其他任何内容,例如- * ,
等。我得到了预期的ValueError:
。
如果这不是错误,而是功能,有人可以向我解释为什么这样的强制转换有效吗?
Python 2.7版本:
Python 2.7.16 (default, Apr 6 2019, 01:42:57)
IPython 5.8.0 -- An enhanced Interactive Python.
Python 3.6版本:
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31)
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
编辑: 根据Sach的回答,这是v3.6的实际功能,但我仍然不明白为什么会这样?它有什么作用?
In [2]: float( '0.0_1_2_3_4' )
Out[2]: 0.01234
答案 0 :(得分:1)
从源代码1和2,您可以看到下划线的特殊处理,同时可以转换字符串的浮点数。
此功能在2.7中不存在,并在3.6中添加
它会检查是否存在下划线,然后检查以下条件。
答案 1 :(得分:1)
PEP515应该包含您要寻找的答案。
此PEP建议扩展Python的语法和字符串中的数字 构造函数,以便将下划线用作以下内容的可视分隔符 整数,浮点数和复数的数字分组目的 文字。
这是其他现代语言的共同特征,可以帮助 长文字的可读性,或其值应明显的文字 分成多个部分,例如字节或十六进制表示的单词。
它也描述了使用它们的规则。