【问题标题】:Python string formatting [duplicate]Python字符串格式化[重复]
【发布时间】:2015-01-07 19:57:44
【问题描述】:

我正在研究一个开源项目的代码。它的代码是用 python 编写的,不幸的是我对它不是很有经验。 我在代码中发现了很多这样的语句:

print "the string is %s" % (name_of_variable, )

我知道,类似于c语言,这是一种正确格式化输出的方法,但我真的不明白括号内“name_of_variable”后面的逗号是什么意思。

我搜索了 python 文档,但没有找到关于那种声明的任何内容。有谁知道它的含义是什么?

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:

    尾随逗号是一种创建单元素元组的方法。通常,您通过在括号中列出一组值或变量来创建一个元组,用逗号分隔:

    my_tuple = (1, 2, 3)
    

    但是,括号实际上并不是必需的。你可以像这样创建一个元组:

    my_tuple = 1, 2, 3
    

    当然,这会引发单元素元组的问题。如果省略括号,则只是将变量分配给单个变量:

    my_tuple = 1    # my_tuple is the integer 1, not a one-element tuple!
    

    但是使用括号是模棱两可的,因为括号中的值是完全合法的:

    my_tuple = (1)    # my_tuple is still the integer 1, not a one-element tuple
    

    所以你通过添加一个尾随逗号来表示一个单元素元组:

    my_tuple = 1,
    # or, with parentheses
    my_tuple = (1,)
    

    字符串格式将元组作为参数,因此如果您使用单元素元组,则应使用尾随逗号。 (当然,字符串格式化对只传递一个要格式化的变量的情况有特殊处理——在这些情况下你可以只使用一个值,而不是元组。)

    【讨论】:

      【解决方案2】:

      如果name_of_variable是一个元组,那么

      print "the string is %s" % (name_of_variable)
      

      将抛出一个TypeError

      因此,您必须使用print "the string is %s" % (name_of_variable, ) 来打印它。

      【讨论】:

      • 它没有出现任何错误。
      • In [21]: tup = (1,2) In [22]: print "the string is %s" % (tup) TypeError Traceback (most recent call last) in () 1 print "the string is %s" % (tup) TypeError: not all arguments convert during string formatting
      • 这是元组的情况。在任何其他情况下它都有效
      • 我已经提到,如果他试图打印的变量是一个元组,那么只会抛出一个错误,否则它会正常工作。
      【解决方案3】:

      当您有多个变量时使用逗号。例如

      print "the string is %s %s" % (name_of_variable1, name_of_variable2)
      

      更多详情在这里https://stackoverflow.com/a/5082482/2382792

      【讨论】:

        【解决方案4】:

        当你只使用一个变量时,不管你有没有逗号,你也不需要只有一个变量的括号。

        这里使用元组(括号和逗号)只是为了与多变量情况保持一致。

        而且,如果单元素元组中没有逗号,则它不再是元组。

        例如, a = (1) type(a) # <type 'int'>

        人们还喜欢在元组的最后一个元素之后附加一个逗号,即使他们有多个元素以保持一致性。

        【讨论】:

          【解决方案5】:

          这是创建单元素元组的语法。例如,请参阅this link。这不是必需的,因为print 也将接受一个变量,但通常(x) 等效于x,因此强制将其解释为tuple 语法的唯一方法是这种看起来很奇怪的形式.注意区别:

          >>> x = 0
          >>> (x)
          0
          >>> (x,)
          (0,)
          >>> type((x))
          <type 'int'>
          >>> type((x,))
          <type 'tuple'>
          >>>
          

          另外,括号也不需要:

          >>>x,
          >>>(0,)
          

          您可能还想了解%-formatting syntax

          【讨论】:

            【解决方案6】:

            (x,) 中的逗号是告诉 Python 括号括起一个 tuple,而不是单个值子表达式的 parenthesized form(最常用于更改运算符优先级,例如 (a+b) * 2a + b*2)。字符串格式化运算符非常擅长猜测单个值何时不应该是序列,但如果您要传递元组而不是字符串,它将被解包:

            >>> mytup=("Hello world!",)
            >>> print "%s"%(mytup)
            Hello world!
            >>> print "%s"%(mytup,)
            ('Hello world!',)
            >>> mytup=("Hello world!","Yoo-hoo, big summer blow-out!")
            >>> print "%s"%(mytup)
            Traceback (most recent call last):
              File "<stdin>", line 1, in <module>
            TypeError: not all arguments converted during string formatting
            

            操作符尝试类似于函数调用,其中参数列表始终作为元组传递(并且可能是命名参数的字典)。当被称为str.format 时,这种差异就会消失,因为元组形成括号是方法调用语法的一部分。

            【讨论】:

              【解决方案7】:

              这里, 并不具体,因为您只使用单个变量。

              In [96]: print "the string is %s" % (name_of_variable, )
              the string is assdf
              
              In [97]: print "the string is %s" % name_of_variable
              the string is assdf
              

              输出相同。

              但如果name_of_variabletuple,则有必要在打印语句中使用,

              In [4]: tup = (1,2,)
              In [6]:  print ("the string is %s" % (tup))
              ---------------------------------------------------------------------------
              TypeError                                 Traceback (most recent call last)
              <ipython-input-6-fb9ef4de3ac3> in <module>()
              ----> 1 print ("the string is %s" % (tup))
              
              TypeError: not all arguments converted during string formatting
              
              In [7]:  print ("the string is %s" % (tup,))
              the string is (1, 2)
              

              【讨论】:

              • 你也不需要括号。
              • 那么,为什么您认为编写代码的人使用了逗号?我在很多语句中都发现了它,所以这是一个错字似乎很奇怪
              • @user3098549 这只是一种pythonic的编写方式。 , 制作单个项目的元组时的部分。 t = 1, 是一个元组,而 t = 1 只是一个整数。
              • 由于>1个参数需要一个元组,因此也有一个强烈的趋势是将元组用于单个参数;如果将来有其他参数,extebd 会更容易。
              • @guidot 是的,我知道但感谢在这里让我更正,但有问题的用户没有指定输入是一个元组,我只是想说明一下。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-17
              • 2014-09-24
              • 2013-12-10
              • 2012-01-07
              • 1970-01-01
              相关资源
              最近更新 更多