Tuple()vs()用于元组理解和元组创建

2024-04-25 20:35:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以通过以下两种方法创建元组:

tuple([1, 2, 3])
(1, 2, 3)

我想弄清楚这里到底发生了什么:

^{pr2}$

tuple构造函数似乎需要一个列表,但下面的语句似乎不会生成列表

(x, x*x) for x in [1, 2, 3]

我也在想为什么这不起作用:

( (x, x*x) for x in [1, 2, 3] )

对于字典,我似乎可以使用:

my_dict = dict()
my_dict = {}

但现在我在想,像元组一样,有没有区别。():tuple(){}:dict()是不同的::关系吗?在


Tags: 方法in列表for字典关系my语句
1条回答
网友
1楼 · 发布于 2024-04-25 20:35:45

让我们把这里发生的事情分解一下。元组构造函数似乎需要一个列表,这一点没有错,但更确切地说,元组构造函数似乎需要一个类似列表的对象。(具体地说,任何可供参考的工程)

这是一种叫做Duck Typing的哲学。在

俗话说:

If it walks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.

那么,一个清单就行了

a = [1, 2, 3, 2]
tuple(a) #Output: (1, 2, 3, 2)

但另一种iterable也是如此,比如set

^{pr2}$

因此,tuple并不关心它接收到的对象是否是一个列表,只关心它应该能够迭代并从对象中获取值。在

现在,魔法的第二部分来自一个叫做列表理解/生成器表达式的东西。它们是您可以创建的iterable,这使得编写分别创建列表或生成器表达式的1行程序变得容易。稍后在生成器上进行更多的介绍,现在来看一下列表理解是如何工作的就足够了。在

list comprehension的一个简单示例

[a for a in range(4)] #Output: [0, 1, 2, 3]
[a*a for a in range(4)] #output: [0, 1, 4, 9]

我们看到他们列出了名单。那么,我们可以把它们提供给元组构造函数吗?为什么不!在

tuple([a for a in range(4)]) #Output: (0, 1, 2, 3)
tuple([a*a for a in range(4)]) #output: (0, 1, 4, 9)

现在,使用相同的表达式,但用弧形括号括起来怎么样?在

(a for a in range(4)) #Output: <generator object <genexpr> at 0x000000FA4FDBE728>

您刚刚创建了一个generator expression

它们本质上是内存高效的随需应变Iterable。(具体到行话来说,它们有一个yield和next,并且只在需要时提供值)。让我们看看它的行动。在

my_generator = (a for a in range(4)) #generator created. 
next(my_generator) #Outputs 0
next(my_generator) #Outputs 1
next(my_generator) #outputs 2
next(my_generator) #outputs 3
next(my_generator) #Raises StopIteration Error. The generator is exhausted.

我们可以看到,我们收到的值与列表理解相同。 那么,元组是否接受生成器之类的东西?好吧,鸭子打字救命!当然!在

tuple((a for a in range(4))) #Output: (0, 1, 2, 3)

我需要多余的括号吗?不!在

tuple(a for a in range(4)) #Output: (0, 1, 2, 3)
tuple(a*a for a in range(4)) #Output: (0, 1, 4, 9)

现在,这会产生什么?(x, x*x) for x in [1, 2, 3]

好吧,这是一个表达式,但是让我们来看看它在列表理解中的表现

[(x, x*x) for x in [1, 2, 3]] #Output: [(1, 1), (2, 4), (3, 9)]

啊,这是元组的列表?发电机也能做到吗?在

my_generator = ((x, x*x) for x in [1, 2, 3]) #<generator object <genexpr> at 0x000000FA4FD2DCA8>
next(my_generator) #Output: (1, 1)
next(my_generator) #Output: (2, 4)
next(my_generator) #Output: (3, 9)
next(my_generator) #Raises StopIteration

是的,看起来不错。所以它是一个生成器,但它是一个iterable。不管怎样,它的行为就像鸭子,不是吗?所以,元组构造函数应该可以正常工作!在

tuple((x, x*x) for x in [1, 2, 3]) #Output: ((1, 1), (2, 4), (3, 9))

所以,一切都结束了。括号并不总是表示元组,()不是为元组保留的。我们在这里看到它们也可以用于生成器表达式!类似地,{}也不必总是与字典绑定,类似于列表理解的东西实际上也存在于字典中!(称为dict comprehension

我强烈建议您浏览链接,以更全面地解释在这里一起工作的各个部分。希望这有帮助!在

相关问题 更多 >

    热门问题