【问题标题】:Add string to another string将字符串添加到另一个字符串
【发布时间】:2010-06-16 14:30:19
【问题描述】:

我目前遇到一个问题: 我想非常有效地处理将字符串添加到其他字符串,所以我查找了许多方法和技术,我想出了“最快”的方法。 但我完全无法理解它实际上是如何工作的:

def method6():
    return ''.join([`num` for num in xrange(loop_count)])

来自source (Method 6)

尤其是([`num` for num in xrange(loop_count)]) 完全让我感到困惑。

【问题讨论】:

    标签: python string


    【解决方案1】:

    这是一个list comprehension,它使用反引号进行repr 转换。不要这样做。反引号在 py3k 中已被弃用和删除,更高效和 Python 的方式根本不是构建中间列表,而是使用生成器表达式:

    ''.join(str(num) for num in xrange(loop_count))        # use range in py3k
    

    【讨论】:

    • 你有什么推荐的?
    • repr(num) 而不是num 对我们大多数人来说应该更明显。不确定是否还有其他优点。你确定你想要 repr() 吗?
    【解决方案2】:

    xrange() 是 range() 的更快(用 C 语言编写)版本。

    反引号 --num,将变量强制转换为字符串,与 str(num) 相同。

    [x for x in y] 被称为列表推导,基本上是一个单行 for 循环,它返回一个列表作为其结果。总之,您的代码在语义上等同于以下代码,但速度更快,因为列表推导和 xrange 比 for 循环和 range 更快:

    z = []
    for i in range(loop_count):
       z.append(str(i))
    return "".join(z)
    

    【讨论】:

    • 还有两个优点: - 使用生成器 - 反引号符号显然是 repr 强制,而不是 str 强制,我没有意识到这一点,因为我从不使用它。
    【解决方案3】:

    括号中的部分是列表推导,可以说是 Python 中最强大的元素之一。它从迭代中产生一个列表。您可能需要查看它的文档。不建议使用反引号将 num 转换为字符串 - 请尝试使用 str(num) 或类似的方法。

    join() 是字符串类的一个方法。它接受一个字符串列表并返回一个由“self”分隔的每个组件字符串组成的单个字符串(也称为调用字符串)。这里的诀窍是 join() 是直接从字符串文字 '' 调用的,这在 Python 中是允许的。这段代码将生成一个字符串,该字符串由 xrange(loop_count) 的每个元素的字符串形式组成,没有分隔。

    【讨论】:

      【解决方案4】:

      首先:虽然这段代码在 Python 2.x 系列中仍然是正确的,但有点混乱,可以不同的写法:

      def method6a():
          return ''.join(str(num) for num in xrange(loop_count))
      

      在 Python 2.x 中,可以使用反引号代替 repr 函数。方括号 [] 中的表达式是列表推导式。如果您不熟悉列表推导:它们就像循环和列表附加语句的组合一样工作,只是您不必为变量发明名称:

      这两个是等价的:

      a = [repr(num) for num in xrange(loop_count)]
      # <=>
      a = []
      for num in xrange(loop_count):
          a.append(repr(num))
      

      因此,列表推导式将包含从 0 到 loop_count 的所有数字的列表(不包括在内)。

      最后,string.join(iterable) 将使用string 的内容连接iterable 中的所有字符串,使用string 作为每个元素之间的分隔符。如果您使用空字符串作为分隔符,那么所有元素都将连接在一起,它们之间没有任何内容 - 这正是您想要的:从 0 到 loop_count 的所有数字的连接。

      至于我的修改:

      • 我使用了str 而不是repr,因为所有整数的结果都是相同的,并且更易于阅读。
      • 我正在使用generator expression 而不是列表推导,因为由列表推导构建的列表是不必要的,并且无论如何都会被垃圾收集。生成器表达式是可迭代的,但它们不需要存储列表的所有元素。当然,如果您已经有一个字符串列表,那么只需将该列表传递给连接。

      一般来说,''.join(iterable) 成语被大多数 Python 程序员理解为“任何字符串列表的字符串连接”,因此可理解性应该不是问题。

      【讨论】:

        猜你喜欢
        • 2020-04-13
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多