Python 格式化字符串字面值

上一篇 / 下一篇  2021-06-09 11:25:56

  本文参考输入输出 — Python 3.7.10 文档[1]。首先声明咱的实验环境。
  > python --version 
  Python 3.7.0 
  引例:场景带来的需求
  我们要在控制台上给用户反馈计算结果(比如AOE值为 0.82),于是就要写 print 逻辑。描述计算结果的语句是死的(AOE值为),但数字是活的(0.82)。我们希望把计算结果拼接到描述结构的语句上。新手可能会用字符串的拼接(字符串的「加法运算」+)。
  val_dict = { 
      'AOE': 0.8200001, 
      'wcb': 13423431, 
      'p': 0.0314 
  } 
   
  print("AOE值为 " + str(val_dict['AOE']) + " ,wcb值为 " + str(val_dict['wcb'])) 
  if val_dict['p'] < 0.05: print('拒绝原假设') 
  else: print('接收原假设') 
  输出:
  AOE值为 0.8200001 ,wcb值为 13423431 
  拒绝原假设 
  我们将介绍一种格式化方法,无论是书写还是易读,都比上述方法要优雅。
  并且,我们将解决字符串拼接不能自动解决的小数位、科学计数法等问题。
  格式化字符串字面值
  官方文档:要使用格式化字符串字面值,请在字符串的开始引号或三引号之前加上一个 f 或 F 。在此字符串中,你可以在 { 和 } 字符之间写可以引用的变量或字面值的 Python 表达式。
  有点费解,还是看实例最清晰。
  咱们把上面的代码改一下。
  print(f"AOE值为 {val_dict['AOE']} ,wcb值为 {val_dict['wcb']}") 
  print(f"{'拒绝原假设' if val_dict['p'] < 0.05 else '接收原假设'}") 
  输出:
  AOE值为 0.8200001 ,wcb值为 13423431 
  拒绝原假设 
  没毛病,和之前的写法效果一模一样。但是咱们这回直接把「活的」变量『嵌入』到「死的」句子里面去了。
  而且咱还把逻辑写进了字符串,说明在 f"{}" 的 {} 大括号里面,放变量和表达式都行。
  再把上面的例子变个形,来看看更多用法:比如在 {} 大括号里做简单的运算,或者使用一些特殊格式化语法保留小数、转化为科学计数法。
  print(f"AOE值为 {val_dict['AOE'] * 100}% ,wcb值为 {val_dict['wcb'] :E}") 
  print(f"{'拒绝原假设' if val_dict['p'] < 0.05 else '接收原假设'}") 
  输出:
  AOE值为 82.00001% ,wcb值为 1.342343E+07 
  拒绝原假设 
  注意到上面我们用了 {val_dict['wcb'] :E} 这样的特殊语法,:E 表示把数字 val_dict['wcb'] 转换为科学计数法。
  类似:E,我们还有更多用法。在 Python 中,其名称为格式规格迷你语言(format specification mini language)[2]。
  我们可以直接应用 :.2% 来表示「让数字变成百分数%,并且保留两位小数(.2)」。
  print(f"AOE值为 {val_dict['AOE'] :.2%}% ,wcb值为 {val_dict['wcb'] :E}") 
  print(f"{'拒绝原假设' if val_dict['p'] < 0.05 else '接收原假设'}") 
  输出:
  AOE值为 82.00%% ,wcb值为 1.342343E+07 
  拒绝原假设 
  岂不是要比 {val_dict['AOE'] * 100}% 的写法优雅很多。
  更多示例
  其他用法可以参考Python 的字符串格式示例(format examples)[3]。咱们这里自己造个场景:打印表格。
  table = { 
      'Tom': [31, 32.314, 31, .423], 
      'Jerry': [1, .41, 313, 123], 
      'Paul': [7, .4, 53, .45754] 
  } 
   
  def print_table(t): 
      print('|  name  |  attr  |  feat  |  gest  |  dest  |') 
      print('|--------|--------|--------|--------|--------|') 
      for name, vals in table.items(): 
          print(f'|{name :_^8}|{vals[0] :^8}|{vals[1] :>6.2f}  |{vals[2] :^8}|{vals[3] :>8.3f}|') 
   
  print_table(table) 
  输出:
  |  name  |  attr  |  feat  |  gest  |  dest  | 
  |--------|--------|--------|--------|--------| 
  |__Tom___|   31   | 32.31  |   31   |   0.423| 
  |_Jerry__|   1    |  0.41  |  313   | 123.000| 
  |__Paul__|   7    |  0.40  |   53   |   0.458| 
  如上:
  我们的数据在 table 里存储了数据
  在 print_table 保存了打印数据的逻辑
  f{name :_^8} 中,^表示居中,8表示长度为 8,_表示填充_(默认填充空格)
  f{vals[1] :>6.2f} 中,>6表示长度为 6 且靠右,.2f表示作为小数,且保留 2 位
  更多的内容除了参考官方文档,菜鸟教程的 Python 格式化函数[4]也是不错的中文资料。
  以后随用随查,在搜索引擎中输入关键字python + 格式化输出即可。

TAG: 软件开发 Python

 

评分:0

我来说两句

Open Toolbar