我知道我可以通过以下两种方法创建元组:
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:
让我们把这里发生的事情分解一下。元组构造函数似乎需要一个列表,这一点没有错,但更确切地说,元组构造函数似乎需要一个类似列表的对象。(具体地说,任何可供参考的工程)
这是一种叫做Duck Typing的哲学。在
俗话说:
那么,一个清单就行了
但另一种iterable也是如此,比如set
^{pr2}$因此,tuple并不关心它接收到的对象是否是一个列表,只关心它应该能够迭代并从对象中获取值。在
现在,魔法的第二部分来自一个叫做列表理解/生成器表达式的东西。它们是您可以创建的iterable,这使得编写分别创建列表或生成器表达式的1行程序变得容易。稍后在生成器上进行更多的介绍,现在来看一下列表理解是如何工作的就足够了。在
list comprehension的一个简单示例
我们看到他们列出了名单。那么,我们可以把它们提供给元组构造函数吗?为什么不!在
现在,使用相同的表达式,但用弧形括号括起来怎么样?在
您刚刚创建了一个generator expression
它们本质上是内存高效的随需应变Iterable。(具体到行话来说,它们有一个yield和next,并且只在需要时提供值)。让我们看看它的行动。在
我们可以看到,我们收到的值与列表理解相同。 那么,元组是否接受生成器之类的东西?好吧,鸭子打字救命!当然!在
我需要多余的括号吗?不!在
现在,这会产生什么?
(x, x*x) for x in [1, 2, 3]
好吧,这是一个表达式,但是让我们来看看它在列表理解中的表现
啊,这是元组的列表?发电机也能做到吗?在
是的,看起来不错。所以它是一个生成器,但它是一个iterable。不管怎样,它的行为就像鸭子,不是吗?所以,元组构造函数应该可以正常工作!在
所以,一切都结束了。括号并不总是表示元组,()不是为元组保留的。我们在这里看到它们也可以用于生成器表达式!类似地,{}也不必总是与字典绑定,类似于列表理解的东西实际上也存在于字典中!(称为dict comprehension)
我强烈建议您浏览链接,以更全面地解释在这里一起工作的各个部分。希望这有帮助!在
相关问题 更多 >
编程相关推荐