【问题标题】:Can't Concatenate Int and Str Objects不能连接 Int 和 Str 对象
【发布时间】:2014-03-22 03:39:18
【问题描述】:

我有这段代码,它返回“TypeError: cannot concatenate 'str' and 'int' objects”。 'number' 整数是全局变量。

print (str("+---+---+---+"))
print (str("| ")) + (int(number1)) + (str(" | ")) + (int(number2)) + (str(" | ")) + (int(number3)) + (str("|"))
print (str("+---+---+---+"))
print (str("| ")) + (int(number4)) + (str(" | ")) + (int(number5)) + (str(" | ")) + (int(number6)) + (str("|"))
print (str("+---+---+---+"))
print (str("| ")) + (int(number7)) + (str(" | ")) + (int(number8)) + (str(" | ")) + (int(number9)) +(str("|"))
print (str("+---+---+---+"))

代码应该打印出类似这样的内容。

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

【问题讨论】:

  • 将数字转换为字符串:str(number1)
  • str("|") 是多余的,因为"|" 已经是一个字符串了。
  • 你可以使用.format,所以你不需要关心strint。见我的answer

标签: python python-3.x


【解决方案1】:

你的代码必须是这样的:

print (str("+---+---+---+"))
print (str("| ")) + (str(number1)) + (str(" | ")) + (str(number2)) + (str(" | ")) + (str(number3)) + (str("|"))
print (str("+---+---+---+"))
print (str("| ")) + (str(number4)) + (str(" | ")) + (str(number5)) + (str(" | ")) + (str(number6)) + (str("|"))
print (str("+---+---+---+"))
print (str("| ")) + (str(number7)) + (str(" | ")) + (str(number8)) + (str(" | ")) + (str(number9)) +(str("|"))
print (str("+---+---+---+"))

我建议你使用一些变量并删除一些括号,像这样:

line = "+---+---+---+"
pipe = "| "

print line
print pipe + str(number1) + pipe + str(number2) + pipe + str(number3) + pipe
print line
print pipe + str(number4) + pipe + str(number5) + pipe + str(number6) + pipe
print line
print pipe + str(number7) + pipe + str(number8) + pipe + str(number9) + pipe 
print line

【讨论】:

    【解决方案2】:

    您可以只转换为字符串,然后将它们与分隔符连接并打印出来,如下所示:

    nums = [1,2,3]
    print ' | '.join( map(str, nums) )
    

    事实上,当你有一个二维列表时:

    allNums = [[1,2,3], [4,5,6], [7,8,9]]
    numPrnt = ['| ' + ' | '.join( map(str, nums) ) + ' |' for nums in allNums]
    separator = '+---+---+---+\n'
    ends      = '+---+---+---+\n'
    
    print ends, separator.join( numPrint ), ends,
    

    应该可以为你打印东西……

    【讨论】:

      【解决方案3】:

      你可以.format:

      nums=[[1,2,3],[4,5,6],[7,8,9]]
      fmt="| {0} | {1} | {2} |"
      ln="+---+---+---+"
      for number in nums:
          print (ln)
          print (fmt.format(number[0],number[1],number[2]))
      
      print (ln)
      

      将返回::

      +---+---+---+
      | 1 | 2 | 3 |
      +---+---+---+
      | 4 | 5 | 6 |
      +---+---+---+
      | 7 | 8 | 9 |
      +---+---+---+
      

      【讨论】:

      • 字符串周围不需要( )'{0} {1}'.format(1, 2)
      • 您应该决定是使用 print 语句还是函数,先生。 OP 使用 Python 3,所以 print() 在这里会更好;)
      【解决方案4】:

      在 Python 中,类型之间没有隐式转换,因此语言要求您明确决定您要做什么。这有助于避免以后出现许多难以调试的错误,我认为这是 Python 的一大优势。

      您需要使用内置的str(your_number) 将数字转换为字符串。稍微清理一下你的代码也会很好......

      numbers = range(1,10)
      number1, number2, number3, \
          number4, number5, number6, \
          number7, number8, number9 = numbers
      
      print ("+---+---+---+")
      print ("| " + str(number1) + " | " + str(number2) + " | " + str(number3) + " |")
      print ("+---+---+---+")
      print ("| " + str(number4) + " | " + str(number5) + " | " + str(number6) + " |")
      print ("+---+---+---+")
      print ("| " + str(number7) + " | " + str(number8) + " | " + str(number9) + " |")
      print ("+---+---+---+")
      

      另外,为每个数字制作变量并不是一个好主意,最好使用容器之类的列表。您可以使用range(1,10) 制作从 1 到 10 的数字列表。以后可以像数组一样使用它。

      我们可以使用字符串替换使您的代码更加简单:

      numbers = range(1,10)
      horizontal_sep = "+---+---+---+"    
      
      print (horizontal_sep)
      print ("| {} | {} | {} |".format(*numbers[0:3]))
      print (horizontal_sep)
      print ("| {} | {} | {} |".format(*numbers[3:6]))
      print (horizontal_sep)
      print ("| {} | {} | {} |".format(*numbers[6:9]))
      print (horizontal_sep)
      

      这里我们用{} 标记我们插入变量的地方,我们在format() 中传递。我们将号码列表的 slices 放在那里。 Slice 也是一个列表,所以我们用* 操作符解包它,所以每个 3 元素的长列表被压缩为 3 个整数。

      最后,我们可以看到我们的切片在它们的索引中有一些共同的模式。我们可以使用 zip()range() 内置函数轻松生成它,并将其用于循环:

      numbers = range(1,10)
      horizontal_sep = "+---+---+---+"    
      
      # zip(...) generates pairs (0, 3) (3, 6) (6, 9)
      for start, end in zip(range(0, 10, 3), range(3, 10, 3)): 
          print (horizontal_sep)
          print ("| {} | {} | {} |".format(*numbers[start:end]))
      print (horizontal_sep)
      

      【讨论】:

        【解决方案5】:

        您似乎对intstr 的功能感到困惑。这实际上与您使用它们的方式相反:int 将字符串转换为整数,str 将数字(或其他任何内容)转换为字符串。

        所以,既然您希望所有内容都成为一个字符串来连接它们,那么您应该使用str(integer1) 等,并且只需" | " 就足够了(而不是str(" | ")),因为" | " 已经是一个字符串.

        此外,您不需要以 ``str(...) 开始每个打印参数,因为它们已经是字符串。所以第一行是:

        print("+---+---+---+")
        

        等等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 2011-10-23
          • 2019-11-30
          • 1970-01-01
          相关资源
          最近更新 更多