【问题标题】:Python module functions used in unexpected waysPython 模块函数以意想不到的方式使用
【发布时间】:2010-09-10 16:32:06
【问题描述】:

基于"Split a string by spaces in Python",它使用 shlex.split 巧妙地分割带引号的字符串,我有兴趣了解其他由非显而易见的标准库函数解决的常见任务。

如果这变成Module of The Week,那也没关系。

【问题讨论】:

    标签: python


    【解决方案1】:

    得知您可以使用 bisect 模块在序列中进行非常快速的二进制搜索,我感到非常惊讶。它的文档没有说明任何内容:

    此模块支持按排序顺序维护列表,而无需在每次插入后对列表进行排序。

    用法很简单:

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

    您必须记住,在列表中逐项线性查找比对列表进行排序然后对其进行二分搜索要快。第一个选项是O(n),第二个是O(nlogn)。

    【讨论】:

    • 那么 bisect.insort() 也是 O(log n) 是真的吗?
    【解决方案2】:

    经常被忽视的模块、用途和技巧:

    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:在普通交互式解释器中获得制表符补全。只需执行“import readline, rlcompleter; readline.parse_and_bind('tab: complete')”

    PYTHONSTARTUP 环境变量:可以设置为进入交互式解释器时将执行的文件的路径(在主命名空间中);对于像上面的 rlcompleter 配方那样放入东西很有用。

    【讨论】:

      【解决方案3】:

      我使用 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 #普通蟒蛇 在[1]中:范围(10)+范围(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]
      

      【讨论】:

        【解决方案4】:

        得知 struct.unpack 后发现它是解压二进制数据格式的天赐之物!

        【讨论】:

          【解决方案5】:

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

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

          dircache 在您反复轮询目录内容的情况下可能很有用。

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

          shutil 在您需要复制、删除或重命名文件时很有用。

          csv 可以简化分隔文本文件的解析。

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

          bz2 在您需要操作 bzip2 压缩文件时会派上用场。

          urlparse 将为您省去将 URL 分解为组件部分的麻烦。

          【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            fnmatch 和 shlex 一样,可以以意想不到的方式应用。 fnmatch 是一种穷人的正则表达式,不仅可以用于匹配文件,还可以将字符串与简化的通配符模式进行比较。

            【讨论】:

              【解决方案8】:

              我开始欣赏的一个功能是 string.translate。它的工作速度非常快,并且在您想要更改或删除字符串中的字符的任何地方都很有用。我刚刚在一个看似不适用的problem 中使用它,发现它轻松击败了所有其他解决方案。

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

              【讨论】:

                【解决方案9】:

                pickle 模块非常棒

                【讨论】:

                  【解决方案10】:

                  复数。 (complexobject.c 定义了一个类,所以从技术上讲它不是一个模块)。非常适合二维坐标,易于平移/旋转等

                  例如。

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

                  【讨论】:

                    猜你喜欢
                    • 2013-12-27
                    • 2013-02-17
                    • 2013-11-07
                    • 1970-01-01
                    • 2021-05-09
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-05-31
                    相关资源
                    最近更新 更多