Python3.6将字符串强制转换为浮点型-错误或功能?

时间:2019-10-31 11:30:20

标签: string python-2.7 casting python-3.6

我正在处理字符串并从中提取浮点数,浮点数可以在字符串内部的不同位置。然后我注意到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_0011.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

2 个答案:

答案 0 :(得分:1)

从源代码12,您可以看到下划线的特殊处理,同时可以转换字符串的浮点数。

此功能在2.7中不存在,并在3.6中添加

它会检查是否存在下划线,然后检查以下条件。

  1. 下划线仅允许在数字之后。
  2. 下划线仅允许在数字之前。
  3. 下划线不允许结尾。

答案 1 :(得分:1)

PEP515应该包含您要寻找的答案。

  

此PEP建议扩展Python的语法和字符串中的数字   构造函数,以便将下划线用作以下内容的可视分隔符   整数,浮点数和复数的数字分组目的   文字。

     

这是其他现代语言的共同特征,可以帮助   长文字的可读性,或其值应明显的文字   分成多个部分,例如字节或十六进制表示的单词。

它也描述了使用它们的规则。