字符串格式化
字符串格式化是拼接字符串的一种手段
字符串的几种连接方式
- 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