Python中字符串填充空间的效率和pythonicy

2024-06-17 07:56:28 发布

您现在位置:Python中文网/ 问答频道 /正文

How can I fill out a Python string with spaces?开始,对右边的字符串填充字符的公认答案是使用^{}。在

但是如果我们想将字符填充到左边的字符串中,我们可以使用str.rjust()来填充这两个字符,我们可以使用str.center(),例如

>>> s = 'foobar'
>>> s.ljust(len(s)+1) # pads one space to the right
'foobar '
>>> s.rjust(len(s)+1) # pads one space to the left
' foobar'
>>> s.center(len(s)+2) # pads one space to both left and right
' foobar '

但在后端,这真的比简单地这样做更有效吗?

^{pr2}$

是否str.center()/str.ljust()/str.rjust()' ' + s + ' '更可读?

str函数和' ' + s + ' '在程序集级别执行不同的操作,如中所示:

>>> import dis
>>> dis.dis(lambda: ' ' + s + ' ')
  1           0 LOAD_CONST               1 (' ')
              3 LOAD_GLOBAL              0 (s)
              6 BINARY_ADD          
              7 LOAD_CONST               1 (' ')
             10 BINARY_ADD          
             11 RETURN_VALUE        
>>> dis.dis(lambda: s.center(len(s)+2))
  1           0 LOAD_GLOBAL              0 (s)
              3 LOAD_ATTR                1 (center)
              6 LOAD_GLOBAL              2 (len)
              9 LOAD_GLOBAL              0 (s)
             12 CALL_FUNCTION            1
             15 LOAD_CONST               1 (2)
             18 BINARY_ADD          
             19 CALL_FUNCTION            1
             22 RETURN_VALUE        

有没有其他方法可以做同样的事情,更像Python一样/更有效率?在


已编辑

或者,这似乎节省了反汇编程序中的一个步骤:

>>> ' {} '.format(s)
' foobar '
>>> dis.dis(lambda: ' {} '.format(s))
  1           0 LOAD_CONST               1 (' {} ')
              3 LOAD_ATTR                0 (format)
              6 LOAD_GLOBAL              1 (s)
              9 CALL_FUNCTION            1
             12 RETURN_VALUE      

那么,节省拆卸器是提高效率吗?或者它和' ' + s + ' '没有什么不同?在


Tags: tolambdalenloadspace字符globalone
2条回答

这些函数(str.ljuststr.rjuststr.center)的目的不是在字符串的开始和/或结尾添加固定数量的字符,而是添加适当数量的字符,并且根据字符串的长度。在

如果您只想添加固定数量的字符,则不会使用这些字符,因为它们不是为此而设计的(它会花费您读取字符串的长度),并且会丢失一些可读性。你可能会用你自己的建议:

' ' * num + s + ' ' * num

甚至,如果数字是固定的:

' ' + s + ' '

这是一种更容易阅读和理解的方法,也许也更容易计算。在

在某些列中打印垂直对齐的字符串时,将文本置于右侧或左侧以及居中,这才是真正的含义。要使这些对齐在整个列上都正确,您必须计算每个字符串的长度,以正确填充每个字符串:

def my_centering(s, width):
    padding = width - len(s)
    left = padding // 2
    right = padding - left
    return ' '*left + s + ' '*right

根据我的Python 3.4环境,其反汇编为:

^{pr2}$

因此,无论在汇编程序中填充一个字符串的效率有什么改进,如果我们至少垂直对齐两个字符串,让我们调用任何库或内置函数/方法。他们会快得多:-)

相关问题 更多 >