代码之家  ›  专栏  ›  技术社区  ›  Falmarri

python.join或字符串连接

  •  23
  • Falmarri  · 技术社区  · 14 年前

    我知道如果你有一个不可忽视的人,你应该经常使用 .join(iterable) 而不是 for x in y: str += x . 但是如果只有固定数量的变量不在ITerable中,则使用 .join() 还是推荐的方法?

    例如我有

    user = 'username'
    host = 'host'
    

    我该怎么办?

    ret = user + '@' + host
    

    ret = '@'.join([user, host])
    

    从性能的角度来看,我并没有问太多问题,因为这两个问题都是微不足道的。但我读过这里的人说总是用 连接() 我想知道是不是有什么特别的原因,还是只是一个好主意 连接() .

    5 回复  |  直到 11 年前
        1
  •  29
  •   Thomas Wouters    14 年前

    如果要创建这样的字符串,通常需要使用字符串格式:

    >>> user = 'username'
    >>> host = 'host'
    >>> '%s@%s' % (user, host)
    'username@host'
    

    python 2.6添加了另一个表单,它不依赖于运算符重载,并且具有一些额外的特性:

    >>> '{0}@{1}'.format(user, host)
    'username@host'
    

    一般来说,大多数人都会使用 + 只有在字符串中添加两个字符串时。对于更多的部分或更复杂的字符串,它们要么像上面那样使用字符串格式,要么将元素组合到一个列表中并将它们连接在一起(特别是如果涉及到任何形式的循环)。 str.join() 将字符串加在一起意味着创建一个新字符串(并可能破坏旧字符串) 每次添加 . python有时可以对其进行优化,但是 连接() 很快变得更清晰,更明显,速度明显更快。

        2
  •  13
  •   Nick Perkins    14 年前

    我认为这个问题的意思是:“这样做可以吗?”

    ret = user + '@' + host
    

    ……答案是肯定的。那很好。

    当然,您应该了解在Python中可以做的很酷的格式化工作,并且您应该知道对于长列表来说,“join”是一种方式,但是对于这样一个简单的情况,您所拥有的是完全正确的。它简单明了,性能不会成为问题。

        3
  •  9
  •   Glenn Maynard    14 年前

    (我很确定所有指向字符串格式的人都完全忽略了这个问题。)

    通过构造数组并将其联接来创建字符串,这只是出于性能方面的考虑。除非您需要这种性能,或者除非它恰好是实现它的自然方法,否则这样做没有好处,而不是简单的字符串连接。

    '@'.join([user, host]) 不具有说服力。这让我纳闷:他为什么要这样做?它是否有任何微妙之处;是否存在可能有多个“@”的情况?当然,答案是否定的,但得出这个结论所需的时间要比用自然的方式写的时间长。

    不要仅仅为了避免字符串串联而扭曲代码;它本身没有任何问题。加入数组只是一种优化。

        4
  •  7
  •   Matthew    13 年前

    我要注意的是,在我重读Python常规样式PEP的一部分之前,我一直倾向于使用就地连接。 PEP-8 Style Guide for Python Code .

    • 代码的编写方式不应使其他人处于不利地位。 python的实现(pypy、jython、ironpython、pyrex、psyco、 等等。 例如,不要依赖cpython的高效实现 格式为A+=B或A=A+B的语句的就地字符串连接。 这些语句在Jython中运行得更慢。对性能敏感 库的一部分,应改用“”join()窗体。这个 将确保在线性时间内跨多个 实施。

    通过这一点,我已经转向使用连接的实践,这样当效率非常关键时,我可以将这种习惯保留为一种更自动的实践。

    所以我会投赞成票:

    ret = '@'.join([user, host])
    
        5
  •  1
  •   anti_social    14 年前

    我使用下一个:

    ret = '%s@%s' % (user, host)