python显示“\n”而不是断行

python显示“\n”而不是断行,python,string,tuples,newline,repr,Python,String,Tuples,Newline,Repr,我编写了一个函数来创建SQL查询的值部分: 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 ), 当我调用此

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

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
                      ),
当我调用此函数并打印时,得到的结果是:

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',)
全部在一行中。将显示
\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
                      )
这解决了这两个问题。现在的产出是:

query_values:

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

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

("997",
"printer",
"barcode printer")
我把逗号放回原处,显示了
\n
。我删除了逗号,我又多行了

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

query_values:

("801","printer","barcode printer"),
("844","laptop","windows"),
("997","printer","barcode printer")
因此,我的代码工作正常,但我对旧版本代码中显示的
\n
字符完全感到困惑。为什么会这样

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

写入
返回某物,
返回(某物,)
相同:它返回一个包含一个元素的元组。当您
print
this时,它将显示元组的外圆括号,其中的字符串将被打印为其源代码表示形式,即带有转义码和内引号


但是,
return something
只是返回该值,然后可以正常打印。

这似乎是Python中元组的行为。 您可以使用以下更简单的案例来测试这一点:

>>> print ("xxx\n\nx",)
('xxx\n\nx',)
Python似乎可以帮助您进行调试,并在打印时转义字符串中的所有命令序列,从而使字符串的显示方式与定义的方式相同


但这确实让你困惑,有趣的是

元组可以用括号表示,也可以不用括号表示,其类型由逗号决定

>>> t = 1, 'a', 'abc'
>>> type(t)
<type 'tuple'>
>>> t
(1, 'a', 'abc')
>>> 
t=1,'a','abc' >>>类型(t) >>>t (1、‘a’、‘abc’) >>>
在上面的例子中,您在字符串后面添加了一个尾随逗号,python将其解释为元组

看看这个

t='a', >>>类型(t) >>>t (‘a’,) >>>t='a' >>>类型(t) >>>t “a”
这似乎就是元组的行为。打印元组时,print会对每个元素调用
\uuuu repr()\uuuu
。列表也是如此

我试过这个:

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('---')
输出为:

t      : ('xxx\nxx',)
element: xxx
xx
   repr: 'xxx\nxx'
---
t      : ['xxx\nxx']
element: xxx
xx
   repr: 'xxx\nxx'
---
因此,元组和列表的行为相同

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

s = "xxx\nxx"
print('s           :', s)
print('s.__repr__():', s.__repr__())
产出:

s           : xxx
xx
s.__repr__(): 'xxx\nxx'

这个元组行为是在和的评论中提到的,但不是在答案中提到的,这就是我发布这个答案的原因。

我知道为什么我会得到一个元组。我的问题是为什么要显示
\n
。@GrannyAching:您的问题在这里有答案\显示n是因为您打印字符串的元组而不是单个字符串,如果打印元组,这是默认行为。@GrannyAching打印元组调用内部元素的
repr
repr
提供了对象的表示形式,该表示形式通常与源代码中的显示方式相似,因此for字符串将包含引号和转义码。我知道为什么会得到元组。我的问题是为什么要显示
\n
。因为打印元组会调用其元素上的
repr
。更准确地说,
元组的
\uuuu repr\uuuu
()。你是说元组没有定义
\uu str\uuuuu
?对于元组
t
,我尝试了
t.\uuu str\uuu()
,得到的结果与
t.\uu repr\uu()
相同。我不知道如何检查
\uu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
是未定义的,还是定义为与
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>相同,但是,我认为这种差异在外部是不可见的。@SolomonUcko对于C类型没有明显的差异,因为您。对于Python类型,有一个明显的区别。@wizzwizz4是的。至少在CPython中,C类型上的神奇方法显示为
slot wrapper
s。
s           : xxx
xx
s.__repr__(): 'xxx\nxx'