python总结 三 格式化字符串占位符的三种方法

                       

相比与其他动态语言,如scala、javascript(es6版本以上)、groovy等,python处理字符串插值显得较为笨拙,没有在语言中就内置了支持,总结起来,大概有三种方法。

1. 字符串format方法

这是字符串自身携带的方法,非常高效,并且容易理解,建议作为首选,实现方式如下:

#   将函数参数转换为字典def format(**args):    tmpl = 'My name is {username}, age is {age}!'    #  将字典转换为函数参数格式    return tmpl.format(**args)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

上述代码定义了字符串格式化函数,调用的方法如下:

# 测试yiifaa = {'username' : 'yiifaa', 'age' : 32}# 注意调用方式,将字典转换为函数参数print(format(**yiifaa))# 等价的参数调用方式print(format(username='yiifaa', age=32))
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

更多示例:

#   格式化字典,0代表参数顺序'My name is {0[username]}, age is {0[age]}!'.format({'username':'yiifaa', 'age' : 32})# 注意!r的用法,会直接输出字符串格式,携带单引号'My name is {0[username]!r}, age is {0[age]}!'.format({'username':'yiifaa', 'age' : 32})# 按参数顺序进行格式化'My name is {0}, age is {1}!'.format('yiifaa', 32)#  格式化元组'My name is {0}, age is {1}!'.format(*['yiifaa', 32])
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在上面的例子中,请密切注意“!r“的用法,输出的内容会携带字符串类型,如果携带单引号的话,还会自动进行转义,如下:

'My name is {0!r}, age is {1}!'.format(*["'yiifaa", 32])# 输出结果为# 'My name is "\'yiifaa", age is 32!'
   
   
  • 1
  • 2
  • 3

2. %格式化方法

这类似于打印输出,结合str方法,也可以将输出转换为字符串,如下:

def format(**args):    tmpl = 'My name is %(username)s, age is %(age)d!'    # tmpl = 'My name is %(username), age is %(age)!'         return str(tmpl % args)
   
   
  • 1
  • 2
  • 3
  • 4

调用方式与第一种方式类似。

3. string.Template方法

严格来说,string都是要被废弃的模块,里面提供的方法几乎没有利用价值,但是Template又让string模块成为了鸡肋,使用方式如下:

def format(**args):    tmpl = 'My name is ${username}, age is ${age}!'     # 强烈建议使用    return Template(tmpl).safe_substitute(args)     #return Template(tmpl).substitute(args)
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

Template一共提供了两种方法实现插值替换,其中substitute方法与前两种方法一样,如果缺少键值内容的话,都会报错,但是safe_substitute能自动处理键值缺少情况,如传递的参数为(username=’yiifaa’),忽略age键值,那么substitute方法会直接报错,但safe_substitute会自动忽略age键值。

结论

在字符串的处理上,python没有内置语言支持,尤其是类似于ES6那样的变量编译方式,所以功能大打折扣,但是依旧有多种替换方法实现,最后在方法的参数传递上,用**结合变长参数可以统一函数的签名,大幅简化了函数的调用方式。

           

猜你喜欢

转载自blog.csdn.net/qq_44884577/article/details/89279596