06-01字符串格式化.md

字符串格式化

字符串格式化是拼接字符串的一種手段

字符串的幾種連接方式

  • 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字符串格式化

  1. format方法使用大括號做爲佔位符:'i love {}'.format('python')
  2. 可以有多個大括號和對應的多個值。當傳入的值比大括號少時報錯IndexError,當傳入的值比大括號多時則忽略掉多餘的值
  3. 位置參數:s = 'i love {1}, i am {0}'
    • 參數可以通過指定位置方式多次使用:'{0} {0}'.format('hahahaha')
  4. 關鍵字參數:'i love {lang} i am {age}'.format(lang='python', age=18)
  5. 同時支持位置參數和關鍵字參數
    • 位置參數和關鍵字參數混用的時候, 位置參數必須在前面, 關鍵字參數在後面
  6. 佔位符和參數不匹配, 會拋出異常(上個是參數個數)
    • {} 按照順序,使用位置參數
    • {數字 i} 會把位置參數當成一個列表 args, args[i]; 當i不是args的索引的時候, 拋出IndexError
    • {關鍵字 k} 會把關鍵字參數當成一個字典kwargs, 使用kwargs[k]; 當k不是kwargs的key時,會拋出KeyError
  7. 轉義:'{{}}'.format()
  8. 使用建議
    • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章