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í),不做填充。