python学习笔记之--字符串格式化的几种方法

占位符

python语言提供了print内建函数,可以用来打印运行过程中的一些信息,是比较简单原始的调试方法,也是常用的一种

注意,print不带f,从c语言转过来的要注意

类似其他语言,python对字符串也提供了占位符的特性,以方便字符串的格式输出
python中点位符如下


image.png

字符串格式化

在python中字符串格式化有以下几种方式可以实现

使用点位符

这是一种引入最早的一种,也是比较容易理解的一种方式
使用方式为:

  1. 格式化字符串中变化的部分使用占位符
  2. 变量以元组形式提供
  3. 变量与格式化字符串之间以%连接

例如:

>>> a = 'test'
>>> print('this is %s' % a)
this is test
>>> b = 1
>>> print('a = %s, b = %d' % (a, b))
a = test, b = 1
>>>

内建函数format

format是string模块的一个内建函数,使用方法为str.format(args)
这种方式下,格式化字符串中变量部分通过{}来占位,具体的值通过format函数的参数args提供,有以下几种方式

  • 根据参数位置顺序对应
    >>> print('a = {}, b = {}'.format(a, b))
    a = test, b = 1
    >>>
    
  • 通过参数位置标号来对应
    >>> print('b = {1}, a = {0}'.format(a, b))
    b = 1, a = test
    >>>
    
  • 通过参数名字对应
    >>> print('b = {1}, a = {0}, server = {server}'.format(a, b, server='www.jianshu.com'))
    b = 1, a = test, server = www.jianshu.com
    >>>
    
  • 根据元组元素对应
    >>> print('b = {0[1]}, a = {0[0]}, c = {1[0]}, d = {1[1]}'.format((a, b),(3, 4)))
    b = 1, a = test, c = 3, d = 4
    >>> 
    

说明: []内为元组元素下标,[]前面的数字为元组做为参数的位置

如果需要将结果进行对齐等操作,可以在{}中使用:,前面的是位置等参数,后面的对齐等符号,
先看几个例子

>>> print('a = {:.2f}'.format(1.324))
a = 1.32
>>> print('a = {:.10f}'.format(1.324))
a = 1.3240000000
>>> print('a = {:*^10}'.format(1.324))
a = **1.324***
>>> print('a = {:*^10}'.format('test'))
a = ***test***
>>> print('a = {:*^4}'.format('test'))
a = test
>>>

说明:{:1234}

  1. 填充符/精度符,如上面例子中的*当变量结果不够显示时,就使用填充符进行填充剩余位置;例子中的.表示数字的精度符,位数不够显示时会用0填充
  2. 对齐符,^<>分别是居中、左对齐、右对齐
  3. 是一个数字,表示显示的结果中的字符个数,包含分隔符;如果前面是一个.,此数字表示保留几位小数
  4. 当变量是数字是,表示数字的类型

string模块的Template

这是string模块提供的一个模板类,默认使用$或者${}(建议使用这个)来占位,而不是%
具体用法如下:

>>> from string import Template
>>> s='hi ${name}'
>>> t = Template(s)
>>> t.substitute(name='alex')
'hi alex'
>>> 

Template还有一个safe_substitute函数,当格式化字符串中有变量未给出值时,此函数将占位符当成字符串输出,而substitute会报错

>>> s1 = 'hi ${name}, ${age}'
>>> t = Template(s1)
>>> t.substitute(name='alex')
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/lib/python3.8/string.py", line 126, in substitute
    return self.pattern.sub(convert, self.template)
  File "/usr/local/lib/python3.8/string.py", line 119, in convert
    return str(mapping[named])
KeyError: 'age'
>>> t.safe_substitute(name='alex')
'hi alex, ${age}'
>>>

当需要输出一个$符号时,可以使用$$

>>> s1 = 'hi ${name}, have $$100'
>>> t = Template(s1)
>>> t.substitute(name='alex')
'hi alex, have $100'
>>> 

用户自定义Template

Template是一个类,用户可以从此类中派生子类,来实现更为自定义的功能,例如将占位符$改为%

>>> class MyTemplate(Template):
...     delimiter = '%'
... 
>>> s = 'hi %{name}, have $100'
>>> t = MyTemplate(s)
>>> t.substitute(name='alex')
'hi alex, have $100'
>>> 

同理,这个时候想输出一个%,就需要使用%%来转义

>>> s = 'hi %{name}, have $100 100%%'
>>> t = MyTemplate(s)
>>> t.substitute(name='alex')
'hi alex, have $100 100%'
>>>

f-string

由python3.6版本引入的一个特性,称之为字面量格式化字符串,f-string 格式化字符串以f或者F开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去。

先看一个例子

>>> name = 'lucy'
>>> print(f'my name is {name}')
my name is lucy
>>> 

f-string不同于前几种方式,这种方式有很多好用的特性,如下

  • {}中可以做表达求值
    >>> a = 1
    >>> b = 2
    >>> print(f'a + b = {a+b}')
    a + b = 3
    >>> 
    
  • {}中可以调用函数
    >>> name = 'lucy'
    >>> print(f'my name is {name.upper()}')
    my name is LUCY
    >>> 
    
  • {}中使用或者
    保证{}内外使用的不一样即可,如下
    >>> print(f'test {"str"}')
    test str
    >>> print(f"test {'str'}")
    test str
    >>> 
    
  • {}中需要同时使用,则需要外部字符串使用文档字符串符号’‘’或者”“”
    >>> print(f'''{"it's name"} is dododo''')
    it's name is dododo
    >>> 
    
  • {}想作为字符输出,有两种方式:使用{{}}进行转换;将{}放到字符串中,如下
    >>> print(f'{{}}')
    {}
    >>> print(f'{"{}"}')
    {}
    >>> 
    
  • {}中不允许出现\即使作为函数参数;必须使用的话,可以将包含\的内容放到一个变量里,如下
    >>> f'print the {"\n"}'
      File "", line 1
    SyntaxError: f-string expression part cannot include a backslash
    >>> newline='\n'
    >>> f'print the {newline}'
    'print the \n'
    >>> 
    
    >>>f'newline is: {ord('\n')}'
      File "", line 1
        f'newline is: {ord('\n')}'
                                 ^
    SyntaxError: unexpected character after line continuation character
    >>> newline = ord('\n')
    >>> f'newline is: {newline}'
    'newline is: 10'
    >>> 
    
  • f-string可以用于多行字符串,有两种方式:使用连接符\; 使用doc字符串,如下
    >>> f'My name is {name}, ' \
    ... f'I\'m {age}'
    "My name is alex, I'm 27"
    >>> 
    >>> f'''My name is {name}, 
    ... I'm {age}'''
    "My name is alex, \nI'm 27"
    >>> 
    
  • 格式描述符
    与format内置函数类似,使用格式{content:format};其中格式如果使用默认的可以省略:format
    具体可以参考文章中自定义格式一节

你可能感兴趣的:(python学习笔记之--字符串格式化的几种方法)