【问题标题】:Using variables in the format() function in Python在 Python 中的 format() 函数中使用变量
【发布时间】:2015-09-05 12:35:03
【问题描述】:

是否可以在 Python 的 format() 函数中使用格式说明符中的变量?我有以下代码,我需要 VAR 等于 field_size:

def pretty_printer(*numbers):
  str_list = [str(num).lstrip('0') for num in numbers]

  field_size = max([len(string) for string in str_list])

  i = 1
  for num in numbers:
    print("Number", i, ":", format(num, 'VAR.2f')) # VAR needs to equal field_size

【问题讨论】:

    标签: python python-3.x formatting


    【解决方案1】:

    您可以使用str.format() method,它可以让您插入其他变量,例如宽度:

    'Number {i}: {num:{field_size}.2f}'.format(i=i, num=num, field_size=field_size)
    

    每个{} 都是一个占位符,从关键字参数中填充命名值(您也可以使用编号的位置参数)。可选的: 后面的部分给出了格式(基本上是format() 函数的第二个参数),您可以在那里使用更多的{} 占位符来填充参数。

    使用编号的位置如下所示:

    'Number {0}: {1:{2}.2f}'.format(i, num, field_size)
    

    但您也可以将两者混合使用或选择不同的名称:

    'Number {0}: {1:{width}.2f}'.format(i, num, width=field_size)
    

    如果省略数字和名称,字段会自动编号,所以下面的格式等价于前面的格式:

    'Number {}: {:{width}.2f}'.format(i, num, width=field_size)
    

    请注意,整个字符串是一个模板,因此Number 字符串和冒号之类的内容是此处模板的一部分。

    但是,您需要考虑到字段大小包括小数点;您可能需要调整大小以添加这 3 个额外字符。

    演示:

    >>> i = 3
    >>> num = 25
    >>> field_size = 7
    >>> 'Number {i}: {num:{field_size}.2f}'.format(i=i, num=num, field_size=field_size)
    'Number 3:   25.00'
    

    最后但并非最不重要的一点是,在 Python 3.6 及更高版本中,您可以使用 formatted string literal 将变量直接放入字符串文字中:

    f'Number {i}: {num:{field_size}.2f}'
    

    使用常规字符串模板和str.format() 的优点是您可以换出模板,f-strings 的优点是可以在字符串值语法本身中内嵌非常易读和紧凑的字符串格式。

    【讨论】:

    • @MartijnP:python 不能这样做吗? fmt='10.5f'; print(f'variance = {variance:fmt}')
    • @JoonhoPark 是的,Python 可以做到这一点,只要您使用嵌套替换部件:print(f'variance = {variance:{fmt}}')。演示:repl.it/repls/CommonBlaringLegacysystem#main.py
    【解决方案2】:

    我更喜欢这种(新 3.6)风格:

    name = 'Eugene'
    f'Hello, {name}!'
    

    或多行字符串:

    f'''
    Hello,
    {name}!!!
    {a_number_to_format:.1f}
    '''
    

    真的很方便。

    我发现旧式格式有时难以阅读。甚至连接可能更具可读性。看一个例子:

    '{} {} {} {} which one is which??? {} {} {}'.format('1', '2', '3', '4', '5', '6', '7')
    

    【讨论】:

    • 这没有回答问题,这就是您将如何在:.1f 部分中使用变量
    【解决方案3】:

    我使用刚刚将 VAR 值分配给 field_size 并更改打印语句。它有效。

    def pretty_printer(*numbers):
      str_list = [str(num).lstrip('0') for num in numbers]
    
      field_size = max([len(string) for string in str_list])
    
      VAR=field_size
    
      i = 1
      for num in numbers:
          print("Number", i, ":", format(num, f'{VAR}.2f'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多