字符串格式化
字符串格式化是拼接字符串的一種手段
字符串的幾種連接方式
- join和 + 拼接字符串難以控制格式
str.join連接,將可迭代對象轉換爲字符串
str.join連接,將可迭代對象轉換爲字符串
注意:此操作會返回一個新的字符串對象,但不會操作原有可迭代對象
In [73]: lst = ['i', 'am', 'comyn']
In [74]: ' '.join(lst) # join是字符串的方法,參數是可迭代對象,接收者是分隔符
Out[74]: 'i am comyn'
In [76]: ','.join(lst)
Out[76]: 'i,am,comyn'
In [77]: ''.join(lst)
Out[77]: 'iamcomyn'
+號連接,返回一個新的字符串
In [1]: 'i' + 'love' + 'python'
Out[1]: 'ilovepython'
printf style字符串格式化
- printf style字符串格式化:從C語言繼承過來的。
- printf style格式化對從其他語言, 尤其是C語言轉過來的, 非常容易接受, 但是並不是
Python所推薦的方法
。
s = 'i love %s' # 待格式化的字符串, 當一個字符串存在佔位符的時候, 佔位符:%加一個格式控制符
In [6]: s = 'i love %s'
In [7]: s % ('python', ) # 傳入參數順序的替換佔位符, 返回替換後的字符串。原串不變的
Out[7]: 'i love python'
In [10]: 'i love %s, i am %d' % ('python', 18) # 多少個佔位符需要傳入多少個值
Out[10]: 'i love python, i am 18'
IIn [11]: 'i love %s, i am %d' % ('python', ) # 如果少傳會拋出TypeError
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-6aabfc9d03a3> in <module>()
----> 1 'i love %s, i am %d' % ('python', )
TypeError: not enough arguments for format string
格式說明符:
d:int類型, 數字
i:int類型, 數字
o:有符號的八進制數
u:int類型
x:小寫16進制
X:大寫16進制
e:小寫的科學計數法
E:大寫的科學計數法
f:浮點數
F:浮點數
G:指數或浮點數(根據顯示長度)
g:指數和浮點數(根據顯示長度)
r:
s:
%:代表佔位符的開始
In [15]: s = 'i love %s, i am %d'
In [16]: s % ('python', 18)
Out[16]: 'i love python, i am 18'
In [17]: s % ('python', '18') # 如果類型不匹配就會拋出TypeError
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-d1dde78cf999> in <module>()
----> 1 s % ('python', '18')
TypeError: %d format: a number is required, not str
In [18]: s % (18, 18) # 當佔位符是%s, 其實隱式的調用了str()
Out[18]: 'i love 18, i am 18'
In [19]: '%r' % 18 # %r隱式調用了repr()
Out[19]: '18'
In [21]: print('%s')
%s
In [22]: print('%s %d')
%s %d
format字符串格式化
- format方法使用大括號做爲佔位符:'i love {}'.format('python')
- 可以有多個大括號和對應的多個值。當傳入的值比大括號少時報錯IndexError,當傳入的值比大括號多時則忽略掉多餘的值
- 位置參數:s = 'i love {1}, i am {0}'
- 參數可以通過指定位置方式多次使用:'{0} {0}'.format('hahahaha')
- 關鍵字參數:'i love {lang} i am {age}'.format(lang='python', age=18)
- 同時支持位置參數和關鍵字參數
- 位置參數和關鍵字參數混用的時候, 位置參數必須在前面, 關鍵字參數在後面
- 佔位符和參數不匹配, 會拋出異常(上個是參數個數)
- {} 按照順序,使用位置參數
- {數字 i} 會把位置參數當成一個列表 args, args[i]; 當i不是args的索引的時候, 拋出IndexError
- {關鍵字 k} 會把關鍵字參數當成一個字典kwargs, 使用kwargs[k]; 當k不是kwargs的key時,會拋出KeyError
- 轉義:'{{}}'.format()
- 使用建議
- python 2.6版本, 不能省略大括號裏的數字或者關鍵字
- 通常使用2.6(含)之後的版本用Format方法, 2.6之前使用printf style
In [24]: s = 'i love {}' # format方法使用大括號做爲佔位符
In [25]: s.format('python') # 當調用format方法時,format傳入的參數會替代大括號
Out[25]: 'i love python'
In [26]: s = 'i love {} i am {}'
In [28]: s.format('python', 18 ) # format方法的參數個數是可變的
Out[28]: 'i love python i am 18'
In [29]: s = 'i love {1}, i am {0}' # 可以在佔位符加數字指定format參數的位置
In [30]: s.format(18, 'python')
Out[30]: 'i love python, i am 18'
In [31]: '{0} {0}'.format('hahahaha') # 參數可以通過指定位置方式多次使用
Out[31]: 'hahahaha hahahaha'
In [32]: 'i love {lang} i am {age}'.format(lang='python', age=18) # 可以在佔位符里加標示符,來使用關鍵字參數
Out[32]: 'i love python i am 18'
In [33]: 'my name is {0} i love {lang} i am {age}'.format('comyn', lang='python', age=18) # 同時支持位置參數和關鍵字參數
Out[33]: 'my name is comyn i love python i am 18'
位置參數和關鍵字參數混用的時候, 位置參數必須在前面, 關鍵字參數在後面
In [34]: '{} {}'.format(18) # 佔位符和參數個數不匹配,會拋出異常
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-34-21db8d47c754> in <module>()
----> 1 '{} {}'.format(18)
IndexError: tuple index out of range
In [35]: '{} {lang}'.format(18)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-35-afb26cfd80bf> in <module>()
----> 1 '{} {lang}'.format(18)
KeyError: 'lang'
In [36]: '{1} {2}'.format(0, 1, 2) # 佔位符和參數個數不匹配, 不拋出異常的場景
Out[36]: '1 2'
In [108]: '{1}, {2}, {3}'.format(0, 1, 2) # 佔位符個數匹配了, 依然會拋出異常
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-108-8745c3f7069b> in <module>()
----> 1 '{1}, {2}, {3}'.format(0, 1, 2)
IndexError: tuple index out of range
佔位符和參數不匹配, 會拋出異常(上個是參數個數)
{} 按照順序,使用位置參數
{數字 i} 會把位置參數當成一個列表 args, args[i]; 當i不是args的索引的時候, 拋出IndexError
{關鍵字 k} 會把關鍵字參數當成一個字典kwargs, 使用kwargs[k]; 當k不是kwargs的key時,會拋出KeyError
In [39]: '{{}}'.format() # 轉義出{}
Out[39]: '{}'
In [42]: '{{}} {}'.format(18)
Out[42]: '{} 18'
In [44]: '{{{}}}'.format(18) # 一層轉義
Out[44]: '{18}'
In [45]: '{{{{{}}}}}'.format(18) # 兩層轉義
Out[45]: '{{18}}'
format還有更多用法, 其他用法請參考官方文檔
python 2.6版本, 不能省略大括號裏的數字或者關鍵字
通常使用2.6(含)之後的版本用Format方法, 2.6之前使用printf style