python显示\ n而不是换行

Gra*_*ing 18 python string tuples newline repr

我编写了一个函数来创建VALUESSQL查询的一部分:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      ),
Run Code Online (Sandbox Code Playgroud)

当我调用此函数和print结果时,得到的是:

query_values:
('\n("801",\n"printer",\n"barcode printer")\n,\n\n("844",\n"laptop",\n"windows")\n,\n\n("997",\n"printer",\n"barcode printer")\n',)
Run Code Online (Sandbox Code Playgroud)

合而为一。而不是换行,\n而是显示。

本来我有一个\n,但是后来我插入了多个,只是看它们是否会显示出来。

第二个问题是整个内容中都有括号,这是我不想要的。

我对这两个问题感到困惑,我想出了第二个问题的解决方案:

函数结尾处有一个逗号。逗号导致函数返回一个元组,而不是单个字符串。

我删除了逗号:

def query_values(data_iterator):
    return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
                                     ) for data_row in data_iterator
                      )
Run Code Online (Sandbox Code Playgroud)

并且解决了两个问题。现在的输出是:

query_values:

("801",
"printer",
"barcode printer")
,

("844",
"laptop",
"windows")
,

("997",
"printer",
"barcode printer")
Run Code Online (Sandbox Code Playgroud)

我把逗号放回去,并且\n显示了。我删除了逗号,并且再次有多行。

我删除了无关的东西\n,所以现在我得到了想要的:

query_values:

("801","printer","barcode printer"),
("844","laptop","windows"),
("997","printer","barcode printer")
Run Code Online (Sandbox Code Playgroud)

因此,我的代码可以正常工作,但是我\n对旧版本代码中显示的字符完全感到困惑。为什么会这样呢?

更新:这个问题的几个答案集中在为什么我要一个元组上。那不是我的问题。为什么/n显示?

Gra*_*ing 19

看来这是元组的行为。当打印元组时,__repr()__在每个元素上进行打印调用。列表也是如此。

我尝试了这个:

tup = "xxx\nxx",
lst =["xxx\nxx"]
for t in tup,lst:
    print('t      :', t)
    for s in t:
        print('element:',s)
        print('   repr:',s.__repr__())
    print('---')
Run Code Online (Sandbox Code Playgroud)

输出为:

t      : ('xxx\nxx',)
element: xxx
xx
   repr: 'xxx\nxx'
---
t      : ['xxx\nxx']
element: xxx
xx
   repr: 'xxx\nxx'
---
Run Code Online (Sandbox Code Playgroud)

因此,元组和列表的行为相同。

当我们有一个字符串时,调用__repr__()不会扩展\n字符,并在其周围加上引号:

s = "xxx\nxx"
print('s           :', s)
print('s.__repr__():', s.__repr__())
Run Code Online (Sandbox Code Playgroud)

输出:

s           : xxx
xx
s.__repr__(): 'xxx\nxx'
Run Code Online (Sandbox Code Playgroud)

此元组的行为是在通过评论提到running.tinterjay丹尼尔·罗斯曼,但不是答案,这就是为什么我张贴这个答案。


int*_*jay 12

编写return something,return (something,):相同:它返回一个包含一个元素的元组。当您执行print此操作时,它将显示元组的外部括号,并且内部字符串将作为其源代码表示形式打印,即带有转义代码和内部引号。

但是,return something只需返回该值即可正常打印。

  • @GrannyAching:您在这里有问题的答案。之所以显示** \ n,是因为您打印的是字符串的元组而不是单个字符串**,并且在打印元组的情况下,这是默认的行为。 (7认同)
  • @GrannyAching打印一个元组会在里面的元素上调用`repr`。repr给出了对象的表示形式,通常与源代码中的表示形式相似,因此字符串将包含引号和转义代码。 (7认同)