字符串格式化
一、字符串拼接
使用join拼接字符串,join接收的参数是一个可迭代的对象
>>> ' '.join(['i','love','python']) # 将一个列表的元素根据空格为分隔符,拼接成一个字符串
'i love python'
使用 "+" 号来拼接字符串
>>> 'i' + 'love' + 'python'
'ilovepython'
join和 ‘+’ 在拼接字符串的时候难以控制格式
二、字符串格式化
printf style方式格式化字符串,这种方法是从C语言继承过来的
>>> s = 'i love %s' 待格式化的字符串,当一个字符串存在占位符的时候,占位符:%加一个格式控制符
>>> s % ('python',) 传入参数顺序替换占位符,返回替换后的字符串,原串不变
'i love python'
>>> s 我们可以看到,字符串是没有变化的,在上一篇文章中介绍过,字符串是不可改变的
'i love %s'
复杂点的实例
>>> 'i love %s, i am %d' % ('python', 18) 有几个占位符就要有几个传递的参数,%s字符串,%d整数
'i love python, i am 18'
>>> 'i love %s, i am %d' % ('python') 当有两个占位符,但是只传递一个参数的时候,就会报错TypeError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> 'i love %s, i am %d' % ('python','18') 当传递的参数类型错误的时候,会报出TypeError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
但是也会有一些隐士转换的规则,例如当%s的时候是可以传递int类型的,这里就是将int隐士转换成了str。
三、format方法
使用方法
>>> s = 'i love {}' format 方法使用大括号作为占位符
>>> s.format('Python') 当调用format方法时,format传入的参数会替换大括号
'i love Python'
>>> s = 'i love {} i am {}' format方法接收的参数个数是可变的,同时也会自动识别数据类型
>>> s.format('Python', 18)
'i love Python i am 18'
>>> s = 'i love {1} i am {0}' 可以在占位符里加数字指定format参数的位置
>>> s.format(18,'Python')
'i love Python i am 18'
>>> '{0} {0}'.format('lanyulei') 参数可以通过指定位置方式多次使用
'lanyulei lanyulei'
>>> 'i love {lang} i am {age}'.format(lang='Python', age=18) 可以在占位符里面加标识符,来使用关键字参数
'i love Python i am 18'
>>> 'my name is {0} i love {lang} i am {age}'.format('lanyulei',lang='Python',age=18)
'my name is lanyulei i love Python i am 18'
从这里可以看出format可以同时使用位置参数和关键字参数
使用中的一些限制
>>> '{} {}'.format('Python') 占位符和参数个数不匹配的时候,会抛出异常IndexError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>> '{} {lang}'.format('Python') args = ['Python'] kwargs['lang'] 因为只传递了一个参数,因此{} 位置参数传递是的'Python', 但是没有给关键字参数lang传递值,因此kwargs这个字典参数,是没有lang这个key,所以抛出KeyError的异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'lang'
>>> '{1} {2}'.format(0,1,2) args = [0,1,2] 位置参数和参数值得关系可以对应上,因此没有抛出异常
'1 2'
>>> '{1}, {2}, {3}'.format(0,1,2) args = [0,1,2] 但是参数的对应关系是 args[2] args[3] 没有位置参数3对应的值,因此抛出了IndexError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
需要注意的一些事情
在format中,需要注意的是,在2.6版本中是不能省略大括号里面的数字或者关键字
通常使用2.6(包含2.6)后的版本可以使用format来格式化字符串,2.6之前就需要使用printf style
如果你想使用大括号的话,可是这样使用:
>>> '{{{}}}'.format(18)
'{18}'
最后我们再来结尾下,打印一下使用format来格式化字符串一次
>>> print('antony is {0}, i am love {1}'.format('code','python'))
antony is code, i am love python
占位符和参数不匹配的时候,会抛出异常
- {}按照顺序,使用位置参数
- {数字 i} 会把位置参数当成一个列表args,args[i], 当i不是args的索引的时候,抛出IndexError
- {关键字 k} 会把关键字参数当成一个字典kwargs, 使用kwargs[k]的key时,会抛出KeyError