python有强大吗_python有多强大
一個格式化輸出的例子
相應源碼
看完示例,我們一起研究一下這個format函數到底什么鬼!
首先大家要知道,format函數是字符串對象的一個方法,也可以寫為str.format(),它提供了非常強大的用于創建字符串的途徑。對于簡單的情況,使用str.format()方法是容易的,但是如果需要進行復雜的格式化操作,就要學習該方法需要的格式化語法。
str.format()方法會返回一個新字符串,在新字符串中,原字符串的替換字段被適當格式化后的參數所替代,例如;
>>> "{0}語言{1}函數可以用來生成格式化字符串.".format("Python", "format")
'Python語言format函數可以用來生成格式化字符串.'
每個替換字段都是由包含在花括號中的字段名標識的。如果字段名是簡單的整數,就將被作為傳遞給str.format()方法的一個參數的索引位置。因此,在這種情況下,名為0的字段被第一個參數所替代,名為1的字段則被第二個參數所替代。
如果需要在格式化字符串中包含花括號,就需要將其復寫,下面看示例:
>>> "{{{{{0}語言}}{1}函數}}可以用來生成格式化字符串。".format("Python", "format")
'{{Python語言}format函數}可以用來生成格式化字符串。'
值得提醒的是,str.format()函數也可以用來連接字符串,作用同str.join()函數。
替換字段可以使用下面的任意一種語法格式:
1、{字段名}
2、{字段名!轉換格式符}
3、{字段名:格式規約}
4、{字段名!轉換格式符:格式規約}
先上例子,再繼續說
四種語法格式示例
>>>#{字段名}
>>> '{0}'.format('Hello world!')
'Hello world!'
>>>#{字段名!轉換格式符}
>>>'{0!a}'.format('戰狼2')
"'\戰\狼2'"
>>>#{字段名:格式化規約}
>>>'{0:a>30,.2f}'.format(1234567.876543)
'aaaaaaaaaaaaaaaaaa1,234,567.88'
>>>#{字段名!轉換格式符:格式化規約}
>>>'{0!a:>30}'.format('戰狼2')
" '\戰\狼2'"
一、字段名
字段名或者是一個與某個str.format()方法參數對應的整數來確定位置,或者是方法的某個關鍵字參數的名稱。看示例。
>>>#通過參數對應的整數來確定位置
>>>"{0}今年{1}歲了。".format("媽媽",76)
'媽媽今年76歲了。'
>>>#通過關鍵字參數名稱確定位置
>>>"{who}今年{age}歲了。".format(who="媽媽",age=76)
'媽媽今年76歲了。'
>>>#上面兩種方法混用
>>>"{who}今年{0}歲了。".format(76,who="媽媽")
'媽媽今年76歲了。
字段名還可以使用集合數據類型------比如,列表List、字典Dict。在這樣的情況下,我們可以包含一個索引(不是一個分片)來標識特定的數據項,看示例:
>>>#列表索引來確定數據項
>>> familylist = ["媽媽",76]
>>>"{0[0]}今年{0[1]}歲了。".format(familylist)
'媽媽今年76歲了。'
>>>#詞典關鍵字確定數據項
>>> familydict = dict(who="媽媽",age=76)
>>>"{0[who]}今年{0[age]}歲了。".format(familydict)
'媽媽今年76歲了。'
總而言之,通過字段名語法,可以引用傳遞給str.format()方法的位置參數與關鍵字參數。如果參數是集合數據類型,比如列表或字典,或參數還包含一些屬性,那么可以使用中括號“[]”或句點"."表示法存取所需的部分。看下圖
帶注釋的字段名實例
值得注意的是,從Python3.1開始,忽略字段名也被認為是合法的,Python會自動處理(使用從0開始的數值),比如:
>>> "{} {} {}".format("Python","can","count")
'Python can count'
二、轉換格式符
這里只有三個轉換符號,用"!"開頭。"!r"對應 repr(),也就是強制使用表象形式;"!s"對應 str(),也就是強制使用字符串形式; "!a"對應ascii(),用于強制使用表象形式,但僅限于ASCII字符。看示例:
表象形式輸出與打印輸出的區別
>>>#Python的表象形式輸出
>>> import decimal
>>>decimal.Decimal("3.14159265")
Decimal('3.14159265')
>>>#Python的打印形式輸出,更關注讀者感興趣的東西
>>>print(decimal.Decimal("3.14159265"))
3.14159265
四種準換格式符的對比示例
>>> import decimal
>>>"{0}-{0!s}-{0!r}-{0!a}".format(decimal.Decimal("3.14159265"))
"3.14159265-3.14159265-Decimal('3.14159265')-Decimal('3.14159265')"
三、格式化規約
整數、浮點數以及字符串的默認格式通常都足以滿足要求,但是如果需要實施更精確的控制,我們就可以通過格式規約很容易地實現。為了更加易于掌握詳細信息,我們分別講述格式化字符串、整數和浮點數,先看下圖的通用語法。
格式化規約的通常形式
字符串格式規約
對于字符串而言,我們可以控制的包括填充字符、字段內對齊以及字段寬度的最小值與最大值。
字符換格式規約是使用冒號(:)引入的,其后跟隨可選的字符對--------一個填充字符(可以沒有)與一個對齊字符(用于右對齊),之后跟隨的是可選的最小寬度(整數),如果需要指定最大寬度,就在其后使用句點,句點后跟隨一個整數值。注意:如果我們指定一個填充字符,就必須同時指定對齊字符。看示例。
>>> s = "字符串格式化"
>>>"{0}".format(s)#默認格式化
'字符串格式化'
>>>"{0:30}".format(s)#最小寬度30
'字符串格式化 '
>>>"{0:>30}".format(s)#最小寬度30,右對齊
' 字符串格式化'
>>>"{0:^30}".format(s)#最小寬度30,居中對齊
' 字符串格式化 '
>>>"{0:-^30}".format(s)#最小寬度30,居中對齊,'-'填充
'------------字符串格式化------------'
>>>"{0:.
'字符串格式化........................'
>>>"{0:.5}".format(s)#最大寬度5
'字符串格式'
>>> maxwidth = 4
>>>"{0}".format(s[:maxwidth])#采用字符串分片方式動態控制輸出格式
'字符串格'
>>>"{0:.{1}}".format(s,maxwidth)#采用內部替換字段方式動態控制輸出格式
'字符串格'
請大家注意以上最后兩個示例,我們可以通過使用標準的字符串分片和使用內部替換字段兩種方式動態控制輸出格式。
整數格式規約
對于整數,通過格式規約,可以控制填充字符、字段內對齊、符號、最小字段寬度、基數等。
整數格式規約以冒號開始,其后可以跟隨一個可選的字符對----------一個填充字符(可以沒有)與一個對齊字符(用于右對齊,=用于在符號與數字之間進行。填充),之后跟隨的是可選的符號字符,+表示必須輸出符號,-表示只輸出負數符號,空格表示為正數輸出空格、為負數輸出符號-。在之后跟隨的是可選的最小寬度整數值--------其前可以使用字符#引導,以便獲取某種基數進制為前綴的輸出(對二進制、八進制、十六進制數值),也可以以0引導,以便在對齊時使用0填充。如果希望輸出其他進制數據,而非十進制數,就必須添加一個類型字符--------b用于表示二進制,o用于表示八進制,x用于表示小寫十六進制,X用于表示大寫十六進制,為了完整性,也可以用d表示十進制整數。此外,還有兩個其他類型字符:c,表示輸出整數對應的Unicode字符;n,表示以場所敏感的方式輸出數字。
字很多,但是看懂了比較容易幫助理解,下面看代碼示例。
>>>#填充示例
>>>"{0:0=12}".format(1234567)#用0填充,最小寬度12
'000001234567'
>>>"{0:0=12}".format(-1234567)#用0填充,最小寬度12,數值為負數
'-00001234567'
>>>"{0:012}".format(1234567)#用0填充,最小寬度12
'000001234567'
>>>"{0:a=12}".format(1234567)#用a填充,最小寬度12
'aaaaa1234567'
>>>#對齊示例
>>>"{0:*
'1234567********'
>>>"{0:*>15}".format(1234567)#用*填充,最小寬度15,右對齊
'********1234567'
>>>"{0:*^15}".format(1234567)#用*填充,最小寬度15,居中對齊
'****1234567****'
>>>"{0:*^15}".format(-1234567)#用*填充,最小寬度15,居中對齊,數值為負
'***-1234567****'
>>>#符號字符示例
>>>"[{0:}][{1:}]".format(7654321,-1234567)#正號用空格,負號用-號
'[7654321][-1234567]'
>>> "[{0: }][{1: }]".format(7654321,-1234567)#正號用空格,負號用-號
'[ 7654321][-1234567]'
>>>"[{0:+}][{1:+}]".format(7654321,-1234567)#強制用符號,正號用+號,負號用-號
'[+7654321][-1234567]'
>>>"[{0:-}][{1:-}]".format(7654321,-1234567)#必須用符號才用符號,正號不用符號,負號用-號
'[7654321][-1234567]'
>>>#類型字符示例
>>>"[{0:b}][{0:o}][{0:x}][{0:X}]".format(12345678)#b是二進制,o是八進制
'[101111000110000101001110][57060516][bc614e][BC614E]'
>>> "[{0:#b}] [{0:#o}] [{0:#x}] [{0:#X}]".format(12345678)#x是小寫十六進制,X是大寫十六進制
'[0b101111000110000101001110] [0o57060516] [0xbc614e] [0XBC614E]'
>>>#,號分組示例
>>> "[{0:,}] [{0:*>13,}]".format(123456789)
'[123,456,789] [**123,456,789]'
浮點數格式規約
對于浮點數,通過格式規約,可以控制填充字符、字段對齊、符號、最小字段寬度、十進制小數點后的數字個數,以及是以標準形式、指數形式還是以百分數的形式輸出數字。
用于浮點數的格式規約與用于整數的格式規約是一樣的,只是在結尾處有兩個差別。在可選的最小寬度后面,通過寫一個句點并在其后跟隨一個整數,我們可以指定在小數點后跟隨的數字個數。我們也可以在結尾處添加一個類型字符:e表示使用小寫字母e的指數形式,E表示使用大寫字母E的指數形式,f表示標準的浮點形式,g表示“通常”格式——這與f的作用是相同的,除非數字特別大(在這種情況下與e的作用相同——以及幾乎與g等同的G,但總是使用f或E)。另一個可以使用的是%——這會導致數字擴大100倍,產生的數字結果使用f并附加了一個%字符的格式輸出。請看示例。
>>>#填充示例
>>>"{0:0=18}".format(1234567.76543)#用0填充,最小寬度18
'000001234567.76543'
>>>#對齊示例
>>>"{0:*^18}".format(1234567.76543)#用*填充,最小寬度18,居中對齊
'**1234567.76543***'
>>>#符號字符示例
>>>"[{0:+}][{1:+}]".format(1234567.76543,-1234567.76543)#強制用符號,正號用+號,負號用-號
'[+1234567.76543][-1234567.76543]'
>>>
>>>#,號分組示例
>>> "[{0:,}] [{0:*>18,}]".format(1234567.76543)
'[1,234,567.76543] [***1,234,567.76543]'
>>>#指數形式和標準形式示例
>>> "[{0:12.2e}] [{0:12.2f}]".format(1234567.76543)#最小寬度12,小數點后2位,第一個用指數e形式表示
'[ 1.23e+06] [ 1234567.77]'
>>> "[{0:*>12.2e}] [{0:*>12.2f}]".format(1234567.76543)#最小寬度12,小數點后2位,第一個用指數e形式表示,用*填充
'[****1.23e+06] [**1234567.77]'
>>> "[{0:*>+12.2e}] [{1:*>+12.2f}]".format(1234567.76543,-1234567.76543)#最小寬度12,小數點后2位,第一個用指數e形式表示,用*填充,強制使用符號
'[***+1.23e+06] [*-1234567.77]'
四、幾點細節
類內格式化重寫
類和類型可以定義一個__format__()方法來控制怎樣格式化自己。它會接受一個格式化指示符作為參數,根據format前的字符串格式來定制不同的顯示,如: ’{:xxxx}’ 此時xxxx會作為參數傳入__format__函數中:
class move(object):
def __format__(self, format):
if (format == 'jump'):
return "I'm afraid I can't do that."
return 'move'
'{:jump}'.format(move())
輸出結果:I'm afraid I can't do that.
還有一個內置的format()方法可以用來格式化一個值。它會調用類型的__format__()方法,并將格式化指示符作為參數傳進去。
>>> format(75.6564, '.2f')
'75.66'
時間日期的特例
>>> from datetime import datetime
>>> '{:%Y-%m-%d %H:%M}'.format(datetime(2018, 2, 3, 4, 5))
'2018-02-03 04:05'
中文字符無法對齊問題
中文字符在字符占用上相當于兩個英文字符,但是字體設計上,一般一個中文字符的寬度不會等于兩個英文字符的寬度,所以打印出來的效果有偏差。
c = [
'愛',
'愛愛',
'愛愛愛',
'愛愛愛愛',
'愛愛愛愛愛',
'愛愛愛愛愛愛',
'愛愛愛愛愛愛愛'
]
print('----正常字符串格式化:----')
for x in range(len(c)):
print('|%20s|' % c[x])
效果如下:
打印出的字符有偏差,無法對齊
但是等寬字符一個中文字體的寬度剛好等于兩個英文�...
總結
以上是生活随笔為你收集整理的python有强大吗_python有多强大的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql having是什么意思_sql之
- 下一篇: 放大缩小保证div对齐_GraphPad