Python模块功能的意外用法
根据“在Python中按空格分割字符串”的内容,里面提到使用shlex.split这个方法可以聪明地分割带引号的字符串。我很想知道还有哪些常见的任务是通过那些不太明显的标准库函数来解决的。
如果这变成了每周模块的讨论,那也没问题。
10 个回答
我使用itertools这个工具,特别是里面的cycle、repeat和chain,来让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]: range(10) + range(3) 输出[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]
常被忽视的模块、用法和技巧:
collections.defaultdict():当你想要字典中缺失的键有一个默认值时,可以使用这个。
functools.wraps():用于编写装饰器,让它们在检查时表现得更好。
posixpath:这是一个适用于POSIX系统的os.path模块。即使在Windows和其他非POSIX系统上,你也可以用它来处理POSIX路径(包括URI元素)。
ntpath:这是Windows专用的os.path模块;可以在非Windows系统上处理Windows路径。
(还有:macpath,适用于MacOS 9及更早版本,os2emxpath适用于OS/2 EMX,但我不确定还有多少人关心这些。)
pprint:更有结构的打印容器的repr(),让调试变得简单多了。
imp:提供你需要的所有工具来编写自己的插件系统,或者让Python从任意档案中导入模块。
rlcompleter:在普通的交互式解释器中实现Tab键补全。只需执行“import readline, rlcompleter; readline.parse_and_bind('tab: complete')”即可。
PYTHONSTARTUP环境变量:可以设置为一个文件的路径,当你进入交互式解释器时,这个文件会被执行(在主命名空间中);这对于放置像上面提到的rlcompleter的设置非常有用。
我很惊讶地发现,使用bisect模块可以在一个序列中进行非常快速的二分查找。它的说明文档里并没有提到这一点:
这个模块可以帮助你在插入新元素时保持列表的有序状态,而不需要在每次插入后都对列表进行排序。
使用起来非常简单:
>>> import bisect
>>> lst = [4, 7, 10, 23, 25, 100, 103, 201, 333]
>>> bisect.bisect_left(lst, 23)
3
不过你要记住,逐个查找列表中的某个元素比先对列表排序再进行二分查找要快。前者的时间复杂度是O(n),而后者是O(nlogn)。