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
posted @ 2020-05-28 22:41  此时  阅读(187)  评论(0编辑  收藏  举报