1. 主页
  2. Python基础到高级
  3. 字符串
  4. 字符串的格式化

字符串的格式化

字符串格式化

一、字符串拼接

使用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

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注