天天看點

Python字元串格式化

字元串的格式化

這是這本書到此為止看起來最複雜的内容。不過如果記不住,或不想那麼耐煩,完全可以全部用%s代替,或者用多個"+"來構造類似的輸出字元串。這裡的%真有點除法的味道,怪不得設計者會選擇用%這個除号。

象C 中的sprintf函數一樣,可以用“%”來格式化字元串。

Table 3.1. 字元串格式化代碼

<col>

格式

描述

%%

百分号标記

%c

字元及其ASCII碼

%s

字元串

%d

有符号整數(十進制)

%u

無符号整數(十進制)

%o

無符号整數(八進制)

%x

無符号整數(十六進制)

%X

無符号整數(十六進制大寫字元)

%e

浮點數字(科學計數法)

%E

浮點數字(科學計數法,用E代替e)

%f

浮點數字(用小數點符号)

%g

浮點數字(根據值的大小采用%e或%f)

%G

浮點數字(類似于%g)

%p

指針(用十六進制列印值的記憶體位址)

%n

存儲輸出字元的數量放進參數清單的下一個變量中

在python中也有類似于c中的printf()的格式輸出标記。在python中格式化輸出字元串使用的是%運算符,通用的形式為

格式标記字元串 % 要輸出的值組

其中,左邊部分的”格式标記字元串“可以完全和c中的一緻。右邊的'值組'如果有兩個及以上的值則需要用小括号括起來,中間用短号隔開。重點來看左邊的部分。左邊部分的最簡單形式為:

%cdoe

其中的code有多種,不過由于在python中,所有東西都可以轉換成string類型,是以,如果沒有什麼特殊需求完全可以全部使用’%s‘來标記。比如:

'%s %s %s' % (1, 2.3, ['one', 'two', 'three'])

它的輸出為'1 2.3 ['one', 'two', 'three']',就是按照%左邊的标記輸出的。雖然第一個和第二值不是string類型,一樣沒有問題。在這個過程中,當電腦發現第一個值不是%s時,會先調用整型數的函數,把第一個值也就是1轉成string類型,然後再調用str()函數來輸出。前面說過還有一個repr()函數,如果要用這個函數,可以用%r來标記。除了%s外,還有很多類似的code:

整型數:%d

無符号整型數:%u

八進制:%o

十六進制:%x   %X

浮點數:%f

科學記數法: %e   %E

根據數值的不同自動選擇%e或%f: %g

根據數值的不同自動選擇%E或%f: %G

就跟前面說用\進行轉義一樣,這裡用%作為格式标記的辨別,也有一個%本身應該如何輸出的問題。如果要在”格式标記字元串“中輸出%本身,可以用%%來表示。

上面說的隻是格式标記的最簡間的形式,來看複雜一點的:

‘%6.2f’ % 1.235

在這種形式中,在f的前面出現了一個類似小數的6.2它表示的意思是,總共輸出的長度為6個字元,其中小數2位。還有更複雜的:

‘%06.2f’ % 1.235

在6的前面多了一個0,表示如果輸出的位數不足6位就用0補足6位。這一行的輸出為‘001.24’,可以看到小數也占用一位。類似于這裡0這樣的标記還有-、+。其中,-表示左對齊,+表示在正數前面也标上+号,預設是不加的。最後來看最複雜的形式:

‘%(name)s:%(score)06.1f’ %{'score':9.5, 'name':'newsim'}

這種形式隻用在要輸出的内容為dictionary(一種python的資料類型)時,小括号中的(name)和(score)對應于後面的鍵值對中的鍵。前面的例子可以看到,”格式标記字元串“中标記的順序和"要輸出的值組"中的值是一一對應的,有順序,一對一,二對二。而在這種形式中,則不是,每個格式标記對應哪個值由小括号中的鍵來指定。這行代碼的輸出為:'newsim:0009.5'。

有時候在%6.2f這種形式中,6和2也不能事先指定,會在程式運作過程中再産生,那怎麼輸入呢,當然不能用%%d.%df或%d.%d%f。可以用%*.*f的形式,當然在後面的”要輸出的值組“中包含那兩個*的值。比如:'%*.*f' % (6, 2, 2.345)就相當于'%6.2f' % 2.345。