a = ('foo',)
具有多个元素的元组怎么办?似乎尾随逗号是否存在,它们都有效。这个对吗?在我看来,尾随逗号更易于编辑。那是不好的编码风格吗?
a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
#1 楼
在所有情况下,除了空的元组,逗号都是重要的事情。仅在出于其他语法原因而需要时才需要括号:将元组与一组函数参数,运算符优先级区分开或允许换行。元组,列表或函数参数的尾部逗号是个好风格,尤其是当您有一个长初始化且分为多行时。如果始终包含尾随逗号,则不会在末尾添加其他行,而希望添加其他元素,而只是创建一个有效的表达式:
a = [
"a",
"b"
"c"
]
从2元素列表开始,后来进行了扩展,但它以可能不是立即显而易见的方式出现了问题。始终添加结尾逗号,可以避免使用此陷阱。
评论
由于上述原因,使用逗号分隔可能是有利的。另一方面,如果您还在应用程序中的其他地方处理JavaScript或JSON,则养成这种习惯可能会导致头痛,因为某些浏览器在那里不喜欢它。
– Cito
2011年11月3日,12:07
是的,但是,您永远不应该手工构造JSON,这样就没关系了,对于Javascript,请始终使用jslint或类似方法在接近浏览器之前捕获此类错误。
–邓肯
2011年11月3日,12:15
#2 楼
对于单项元组,只需要将定义元组或用括号括起来的表达式消除歧义即可。(1) # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1
对于多个项,不再需要,因为很显然这是一个元组。但是,允许使用逗号逗号来简化使用多行定义它们的过程。您可以在不破坏语法的情况下添加到末尾或重新排列项目,因为您在偶然情况下省略了逗号。
,例如,
someBigTuple = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
#...
10000000000,
)
注意也适用于其他集合(例如列表和字典),而不仅仅是元组。
评论
+1指出这对除元组以外的其他内容也有效。这对于拥有一个键非常有用:值,每行,并且在添加新内容时不打逗号。
–乔尔
2011年11月3日,12:24
#3 楼
尾随逗号的另一个优点是,它使差异看起来更好。如果您以a = [
1,
2,
3
]
开头,然后将其更改为
a = [
1,
2,
3,
4
]
diff会像
a = [
1,
2,
- 3
+ 3,
+ 4
]
如果您以逗号开头,例如
a = [
1,
2,
3,
]
那么区别就是/>
a = [
1,
2,
3,
+ 4,
]
评论
这确实是对原始问题的回答,而不是对原始问题的答案,但我真的很喜欢添加的论点,以尾随逗号开头。
–疯狂物理学家
17年4月21日在20:02
#4 楼
它是可选的:请参阅Python Wiki。摘要:单元素元组需要结尾逗号,但对于多元素元组则是可选的。
#5 楼
另外,请考虑所需的情况:>>> (('x','y'))*4 # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))
所以在这种情况下,外部括号只不过是对括号进行分组。
要使它们成为元组添加结尾逗号。即
>>> (('x','y'),)*4
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))
评论
不要以为这个答案与问题有关,而不是对元组的滥用。如果我们期望重复元素为元组类型,则可以将此单元的类型显式声明为单元素元组。与列表相同,请尝试['x','y'] * 4,[['x','y']] * 4,(['x','y'],)* 4
–郭
8月14日11:55
#6 楼
仅尾元素元组才需要尾随逗号。对于较大的元组,请使用逗号作为结尾,这是样式问题,并非必需。它的最大优点是可以清除带有经常修改的多行大元组的文件的差异(例如配置元组)。#7 楼
这是一个简单的答案。a =(“ s”)是字符串
和
a =(“ s”,)是一个字符串具有一个元素的元组。
如果需要一个元素元组,Python需要附加逗号,以区分字符串和元组。
例如,在python控制台上尝试以下操作:
a =(“ s”)
a = a +(1,2,3)
跟踪(最近一次通话为最后一次通话):
模块中的文件stdin,第1行
TypeError:无法连接“ str”和“ tuple”对象
#8 楼
另一个原因是它使代码生成和__repr__
函数更易于编写。例如,如果您构建了某些对象,例如obj(arg1, arg2, ..., argn)
,则只需将obj.__repr__
编写为def __repr__(self):
l = ['obj(']
for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
l.append(repr(arg))
l.append(', ')
l.append(')')
return ''.join(l)
如果不允许尾部逗号,则可以在特殊情况下,最后一个参数。实际上,您可以使用列表理解将上述内容写在一行中(我将其写得更长一些,以便于阅读)。如果上学期不得不特殊情况,要做到这一点并非易事。
评论
不需要特殊使用最后一个参数,在这种情况下,可以只使用join:def __repr __(self):'obj('+','.join([repr(arg)for obj.args中的arg ])+')'。
– SuzanneDupéron
13年9月25日在21:19
它也有助于代码生成,甚至可以使用不是用Python编写的工具,也不能使用诸如join之类的漂亮功能。
– asmeurer
2013年9月26日上午1:03
#9 楼
PEP 8-Python代码样式指南-何时使用尾随逗号尾随逗号通常是可选的,除了在组成一个元素的元组时它们是强制性的(在Python 2中,它们对于打印声明)。为了清楚起见,建议将后者括在(技术上多余的)括号中。
是:
FILES = ('setup.cfg',)
好,但令人困惑:
FILES = 'setup.cfg',
如果尾部逗号是多余的,则在使用版本控制系统,期望将值,参数或导入项的列表扩展时,它们通常很有用。时间。模式是将每个值(等)单独放在一行上,始终添加尾随逗号,并在下一行上添加右括号/括号/花括号。但是,与结束定界符在同一行上没有尾随逗号是没有意义的(在上述单例元组的情况下除外)。
是:
FILES = [
'setup.cfg',
'tox.ini',
]
initialize(FILES,
error=True,
)
编号:
FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)
#10 楼
编码风格是您的喜好,如果您认为编码标准很重要,那么可以使用PEP-8进行指导。您如何看待以下表达式的结果?
x = (3)
x = (3+2)
x = 2*(3+2)
是的,x只是一个数字。
评论
那是解释你思路的糟糕方法。显式胜于隐式。
– Guilherme David da Costa
2014年9月22日在21:26
评论
这是语法规则:docs.python.org/reference/expressions.html#expression-lists