我知道在浮点运算中会发生舍入错误,但有人可以解释这个问题的原因:
>>> 8.0 / 0.4 # as expected
20.0
>>> floor(8.0 / 0.4) # int works too
20
>>> 8.0 // 0.4 # expecting 20.0
19.0
Run Code Online (Sandbox Code Playgroud)
这在x64上的Python 2和3上都会发生.
据我所知,这是一个错误或非常愚蠢的规范,//因为我没有看到为什么最后一个表达式应该评估的原因19.0.
为什么a // b不简单定义为floor(a / b)?
编辑:8.0 % 0.4也评估为0.3999999999999996.至少这是因为随后8.0 // 0.4 * 0.4 + 8.0 % 0.4评估的结果8.0
编辑:这不是浮点数学的重复吗?因为我问为什么这个特定的操作受到(可能是可以避免的)舍入错误的影响,以及为什么a // b没有定义为/等于floor(a / b)
备注:我猜这个不起作用的深层原因是地板划分是不连续的,因此具有无限的条件数使其成为一个不适定的问题.地板划分和浮点数简单地基本上是不兼容的,你永远不应该使用//浮点数.只需使用整数或分数.
我已经配置了PyCharm Professional Edition 3.5 5.0
尽可能使用IPython
在我设置的运行/调试配置中
之后展示口译员
我经常使用交互式解释器,我非常喜欢IPython,但有一些我不喜欢在PyCharm中处理它的方式:
input()在我的程序中任何返回空字符串.
此外,当发生错误时,我无法再与程序交互.(你可以在运行带有-i标志的Python程序时)
控制台中的最后一行与当前行之间有很多空格
在IPython中...:,代码块中的提示不缩进2个空格,因此不与In [?]:提示对齐.
当发生错误时,我得到类似这样的东西,
import IPython; IPython.start_ipython()
我不需要/想要从内部看到回溯.
当运行文件时,需要启动IPython,这需要几秒钟,即使我之后不会使用解释.我希望PyCharm在程序结束后或者我开始调试时启动IPython(你可以通过执行在交互式控制台中启动IPython--no-banner
还有一些我不喜欢的小事
当IPython启动时,它会向控制台输出大量文本.我不想看到任何它除了版本号(你通常可以使用该Up选项,但将它添加到解释器选项不起作用)
当你输入内容并按下Ctrl + Space它时,用我历史记录的最后一项替换我所写的内容,而不是用我输入的内容开头的历史记录的最后一项替换它.普通的IPython就是这样做的.
我希望自动代码完成,而无需按下C:\Program Files (x86)\PyCharm\helpers\PyDev控制台
"问题"按重要性排序.有谁知道如何更改其中一些?我可以停止使用IPython来解决第二个,第三个和第四个问题,但其他问题仍然存在.所有这些行为(不包括IPython的东西)都在PyScripter中得到了很好的实现.
我找到了前两个问题的解决方案以及IPython横幅的问题.PyDev交互式解释器(由PyCharm使用)的源位于Windows上_pydev_imps/_pydev_execfile.py(当然,路径不同).
所以第一个问题可以通过编辑文件来解决exec(compile(contents+"\n", file, 'exec'), glob, loc).用以下代码作为异常处理程序包装块中的第18行(try ... except).如果出现错误,这将终止您的Python程序,同时让您在之后与变量进行交互.import traceback; traceback.print_exc()pydev_run_in_console.py
问题2可以通过编辑火来解决from pydev_console_utils import StdIn.在文件的开头添加此导入:sys.stdin = StdIn(interpreter, host, client_port)并pydev_ipython_console在添加导入之前插入第61行之后.
为了与旗帜,以解决这个问题,你必须下载最新的PyDev的源的版本在这里和替换文件pydev_ipython_console_011 …
在PyCharm中,当出现错误时,IDE会打开产生错误的模块(当按下产生错误时,这尤其令人讨厌Ctrl+C).
在打开调试模式时,它还会打开程序当前"正在"的模块.有没有办法禁用内置模块的这种行为?(最好以一种方式显示异常,以防您想要查看内置模块的来源)
问题已经在标题中,str.find(string, substring)如果n是的长度,string而m是的长度,那么Python中C实现的最坏情况下的时间复杂度是substring多少?源代码(https://hg.python.org/cpython/file/99f5a0475ead/Objects/stringlib/fastsearch.h)似乎在谈论boyer-moore-horspool算法,根据Wikipedia的说法,这种算法的复杂性最差O(m * n)的
编辑: O( m * n)指的是博耶·摩尔·霍尔斯普尔算法的运行时间,该算法查找字符串中所有出现的子字符串。Python的str.findMethod仅找到子字符串的一个实例,因此它的(str.find)将取决于第一次出现的位置substring。所以不,我还没有发布答案。
在Python 3中,许多返回列表的函数(现在是类)现在返回iterables,最常见的例子是range.在这种情况下,范围在Python 3中是可迭代的,以提高性能和内存效率(因为您不必再构建列表).
其他"新" iterables是map,enumerate,zip和字典操作的输出dict.keys(),dict.values()和dict.items().(可能还有更多,但我不知道).
他们中的一些(enumerate和map)通过将它们转换为迭代可能变得更有效.在Python 2.7中,其他人只是创建了已经在内存中的对象列表,因此它们可以提高内存效率.
为什么然后将它们变成可以在每次要对它们进行排序时必须转换为列表的迭代,等等?
python ×5
ide ×2
pycharm ×2
python-3.x ×2
algorithm ×1
built-in ×1
c ×1
dictionary ×1
ipython ×1
iterable ×1
pydev ×1
python-2.7 ×1
rounding ×1
string ×1