Python代碼閱讀(第87篇):字符串填充

Python 代碼閱讀合集介紹:為什么不推薦Python初學(xué)者直接看項(xiàng)目源碼

本篇閱讀的代碼實(shí)現(xiàn)了使用指定字符在字符串兩邊填充至指定長(zhǎng)度的功能。

本篇閱讀的代碼片段來自于30-seconds-of-python

pad

from math import floor

def pad(s, length, char = ' '):
  return s.rjust(floor((len(s) + length)/2), char).ljust(length, char)

# EXAMPLES
print(pad('cat', 8)) # '  cat   '
print(pad('42', 6, '0')) # '004200'
print(pad('foobar', 3)) # 'foobar'

pad函數(shù)接收一個(gè)字符串、指定長(zhǎng)度和填充字符,返回填充后的字符串。如果原字符串的長(zhǎng)度短于指定的長(zhǎng)度,則用指定的字符在字符串的兩邊進(jìn)行填充。

先看下代碼中的兩種單邊填充的方法。

str.rjust(width[, fillchar])右對(duì)齊函數(shù)返回長(zhǎng)度為width的字符串,原字符串在其中靠右對(duì)齊。使用指定的fillchar填充空位(默認(rèn)使用ASCII空格符)。 如果width小于等于len(s)則返回原字符串的副本。

str.ljust(width[, fillchar])左對(duì)齊函數(shù)返回長(zhǎng)度為width的字符串,原字符串在其中靠左對(duì)齊。使用指定的fillchar填充空位(默認(rèn)使用ASCII空格符)。 如果width小于等于len(s)則返回原字符串的副本。

>>> s.rjust(6, '#')
'###123'
>>> s.ljust(9, '#')
'123######'
>>> s.rjust(6, '#')
'###123'
>>> s.ljust(6, '#')
'123###'
>>> s.rjust(6, '#').ljust(9, '#')
'###123###'

pad函數(shù)中先使用右對(duì)齊,并使用指定字符串填充左邊的空位。再使用左對(duì)齊,并使用指定字符串填充右邊的空位。這樣就可以像上面最后一個(gè)例子一樣在字符串兩邊進(jìn)行填充。根據(jù)直覺,兩邊分別需要填充的長(zhǎng)度,其實(shí)就是指定長(zhǎng)度減去字符串長(zhǎng)度的一半。

  • 針對(duì)右對(duì)齊。

如果函數(shù)指定的長(zhǎng)度小于字符串長(zhǎng)度,那么(len(s) + length)/2 < len(s)無需填充。

如果指定長(zhǎng)度大于字符串長(zhǎng)度,那么根據(jù)s.rjust(floor((len(s) + length)/2), char)這段代碼,需要填充的長(zhǎng)度為(len(s) + length)/2 - len(s) = (length - len(s))/2,也就是說左側(cè)填充長(zhǎng)度是指定長(zhǎng)度減去字符串長(zhǎng)度后的一半,符合函數(shù)要求。

  • 針對(duì)左對(duì)齊。

在已經(jīng)正確填充左側(cè)之后,直接使用指定長(zhǎng)度,填充字符串右側(cè)。特別的,當(dāng)指定的長(zhǎng)度小于字符串長(zhǎng)度時(shí),不做填充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。