Python模块函数以意外方式使用

时间:2020-03-06 14:21:17  来源:igfitidea点击:

基于使用shlex.split巧妙地将带引号的字符串分割成字符串的"在Python中用空格分割字符串",我很想了解其他由非显而易见的标准库函数解决的常见任务。

如果这成为本周的模块,那也很好。

解决方案

我了解到struct.unpack是解压缩二进制数据格式的天赐之物!

我发现sched模块对类似cron的活动很有帮助。它简化了很多事情。不幸的是我发现为时已晚。

经常忽略的模块,用法和技巧:

collections.defaultdict():用于当我们希望字典中的键缺失时使用默认值。

functools.wraps():用于编写可以很好地与内省一起使用的装饰器。

posixpath:POSIX系统的os.path模块。我们甚至可以在Windows和其他非POSIX系统上使用它来处理POSIX路径(包括URI元素)。

ntpath:Windows的os.path模块;可用于在非Windows系统上操纵Windows路径。

(另请参阅:macpath,对于MacOS 9和更早版本,对于OS / 2 EMX,为os2emxpath,但是我不确定是否有人在乎。)

pprint:对容器的repr()进行更结构化的打印可以使调试更加容易。

imp:编写自己的插件系统或者从任意档案库制作Python导入模块所需的所有工具。

rlcompleter:在普通的交互式解释器中获取制表符完成。只需执行"导入readline,rlcompleter; readline.parse_and_bind('tab:complete')"

PYTHONSTARTUP环境变量:可以设置为进入交互式解释器时将要执行的文件的路径(在主命名空间中);用于放入类似上面的rlcompleter配方的内容。

getpass对于确定当前用户的登录名很有用。

grp允许我们按名称查找Unix组ID,反之亦然。

在重复轮询目录内容的情况下,dircache可能会很有用。

glob可以像Unix shell一样找到与通配符匹配的文件名。

当需要复制,删除或者重命名文件时,shutil非常有用。

csv可以简化定界文本文件的解析。

optparse提供了一种分析命令行选项的可靠方法。

当我们需要处理bzip2压缩文件时,bz2会派上用场。

urlparse可以避免将URL分解为各个组成部分的麻烦。

其他大多数示例仅被忽略,而不是模块的意外使用。

像shlex一样,fnmatch可以以意想不到的方式应用。 fnmatch是穷人的RE,可以用于匹配多个文件,它可以将字符串与简化的通配符模式进行比较。

我使用itertools(尤其是循环,重复,链接)来使python的行为更像R以及在其他功能/矢量应用程序中。通常,这使我避免了Numpy的开销和复杂性。

# in R, shorter iterables are automatically cycled
# and all functions "apply" in a "map"-like way over lists
> 0:10 + 0:2
 [1]  0  2  4  3  5  7  6  8 10  9 11

Python
#普通python
在[1]中:范围(10)+范围(3)
Out [1]:[0、1、2、3、4、5、6、7、8、9、0、1、2]

## this code is terrible, but it demos the idea.
from itertools import cycle
def addR(L1,L2):
    n = max( len(L1), len(L2))
    out = [None,]*n
    gen1,gen2 = cycle(L1), cycle(L2)
    ii = 0
    while ii < n:
        out[ii] = gen1.next() + gen2.next()
        ii += 1
    return out

In [21]: addR(range(10), range(3))
Out[21]: [0, 2, 4, 3, 5, 7, 6, 8, 10, 9]

得知我们可以使用bisect模块在序列中进行非常快速的二进制搜索,我感到非常惊讶。它的文档没有对此说什么:

This module provides support for maintaining a list in sorted order without having to sort the list after each insertion.

用法很简单:

>>> import bisect
>>> lst = [4, 7, 10, 23, 25, 100, 103, 201, 333]
>>> bisect.bisect_left(lst, 23)
3

不过,我们必须记住,线性排序列表中的某些内容比逐项排序然后对它进行二进制搜索要快。第一个选项是O(n),第二个选项是O(nlogn)。

我要欣赏的一个功能是string.translate。它的执行速度非常快,并且在我们想要更改或者删除字符串中的字符的任何地方都非常有用。我只是在一个看似不适用的问题中使用了它,发现它轻而易举地击败了所有其他解决方案。

缺点是它的API有点笨拙,但是在Py2.6 / Py3.0中有所改善。

泡菜模块非常棒

复数。 (complexobject.c定义了一个类,因此从技术上讲它不是模块)。非常适合2D坐标,具有轻松的平移/旋转等

例如。

TURN_LEFT_90= 1j
TURN_RIGHT_90= -1j

coord= 5+4j # x=5 y=4
print coord*TURN_LEFT_90