python 中使用元组关键字与括号进行初始化 [已关闭]

Initialization with tuple keyword vs parenthesis in python [closed]

提问人:Zach Joseph 提问时间:2/22/2023 最后编辑:Zach Joseph 更新时间:2/22/2023 访问量:216

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

9个月前关闭。

这个问题是关于设计和可读性的,而不是性能的:

使用元组关键字初始化元组还是仅使用括号初始化元组更像 python?两者都做同样的事情,但显式键入更冗长。tuple

下面是元组初始化的两种不同情况。

  1. 从现有的可迭代
def myfunc(myarg: Iterable):
    # "tuple" is explicitly typed out
    mytuple = tuple(myarg)
def myfunc(myarg: Iterable):
    # "tuple" is not explicitly typed out; only parenthesis are used
    mytuple = ([myarg])
  1. 从文本创建新元组
# "tuple" is explicitly typed out
mytuple = tuple([1, 2, 3, 4])
# "tuple" is not explicitly typed out; only parenthesis are used
mytuple = (1, 2, 3, 4)

矛盾的是,我知道在没有显式的情况下初始化列表更为常见;y 类型:list

mylist = [1, 2, 3, 4] # "list" is not explicitly typed out; only brackets are used

# Rather than:
mylist = list([1, 2, 3, 4]) # "list" is explicitly typed out

就我个人而言,我总是显式键入元组,以便更容易看到元组正在初始化。但是,这与我初始化列表的风格(这是更流行的风格)相矛盾(没有显式键入列表。

总之,我想知道哪种初始化元组的方式更像pythonic。

Python 语法 元组 标准 可读性

评论

2赞 Woodford 2/22/2023
list[1, 2, 3, 4]Python 语法无效
3赞 user2357112 2/22/2023
另外,不会做你认为的那样。你需要。这不是风格问题;关键在于实际拥有有效的代码。tuple(1, 2, 3, 4)(1, 2, 3, 4)
2赞 chepner 2/22/2023
(myarg)根本没有定义元组;它只是一个带括号的表达式,因此首先会分配传递给的任何值:可以是列表、元组、字典、生成器,以及任何被认为是可迭代的。mytuplemyfunc
2赞 chepner 2/22/2023
对自己重复一遍:括号不定义元组。元组由表达式列表定义,表达式列表只是用逗号分隔的一系列表达式。只有将逗号的这种用法与逗号的其他用法区分开来,才需要 Parantheses。唯一的例外是空元组,因为空括号没有既定的含义。()
2赞 wim 2/22/2023
@Woodford我不确定是哪两个人投了赞成票,但这是有效的 Python 语法。list[1, 2, 3, 4]

答:

2赞 nickie 2/22/2023 #1

除了人们可能对你的问题给出的主观答案之外,你提供的代码中还有一些错误(见本答案的末尾)。

IMO,并且不用于通过枚举元组和列表的元素来构造元组和列表。为此,请分别使用括号和括号:tuplelist

t = (1, 2, 3)
l = [1, 2, 3]

事实上,在定义元组时,括号不是必需的:

t = 1, 2, 3

但我认为如果你使用括号,它会更清楚。

特别要注意的是带有一个元素的元组的情况,其中必须使用尾随逗号(在右括号之前)。

t = (42,)
l = [42]

对列表做同样的事情并没有什么坏处,一般来说,在列表和元组中都有尾随逗号也没有什么坏处;但是对于一个元素的元组,逗号是必需的。

and 的用处是用于从其他可迭代对象(生成器、元组、列表等)构造元组和列表,例如tuplelist

t = tuple(i**2 for i in range(10))
l = list(range(100))

对于列表,在可能的情况下,列表推导式可以说是可取的:

l1 = list(i**2 for i in range(10))
l2 = [i**2 for i in range(10)]       # this is preferable

另请注意,代码中有三行是错误的:

  1. mytuple = (myarg)除非已经是元组,否则不构造元组;这些只是括号。myarg
  2. mytuple = tuple(1, 2, 3, 4)引发一个 .TypeError
  3. list[1, 2, 3, 4]不是一个列表,只需使用括号(有趣的是,这是合法的语法,如上面的评论中所述,但这是题外话)。

如果您坚持使用单词并在枚举元素时,这里(一个版本)是正确的语法:tuplelist

t = tuple([1, 2, 3])
l = list([1, 2, 3])