|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
浏览论坛看到的一篇小甲鱼发布的问题,还是有点不理解。原链接 https://fishc.com.cn/thread-140340-1-1.html
首先是拆解开的答案:
>>> x = iter([1,2,3,4,5,6,7,8,9])
>>> list(zip(x, x, x))
第2行的zip(x,x,x)不太理解。是指第一个x为iter([1,2,3,4,5,6,7,8,9]),取出了"1";第二个x为iter([2,3,4,5,6,7,8,9]),取出了"2",一直到最后吗?
然后是最后的答案:
>>> list(zip(*[iter([1, 2, 3, 4, 5, 6, 7, 8, 9])] * 3))
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
第一个"*"是什么意思,如果可以的话再告诉我是具体哪节课的知识点。然后第一个"*"的的运算是晚于"*3"的,对吧?
第一次发帖,希望来个好人帮帮忙,谢谢了。
第一个x为iter([1,2,3,4,5,6,7,8,9]),取出了"1";第二个x为iter([2,3,4,5,6,7,8,9]),取出了"2",一直到最后吗?
答案是肯定的,确实如你所理解的那样。具体过程还是分步骤拆解来理解吧。
首先看最里层的iter([1, 2, 3, ...9]),这是在调用iter把列表转为迭代器;
然后是[iter([1, 2, 3, ...9])]*3,首先把上一步生成的迭代器组成一个列表,然后*3就是把列表中的元素拷贝为3份,此时列表中的元素是三个 相同的迭代器,类似这样:[iter([1, 2, 3, ...9]), iter([1, 2, 3, ...9]), iter([1, 2, 3, ...9])]。切记,这个列表中的三个迭代器是完全相同的;
接下来是*[iter([1, 2, 3, ...9]), iter([1, 2, 3, ...9]), iter([1, 2, 3, ...9])]。正如你预期的那样,列表前面的这个星号运算优先级确实低于乘号,作用是解包。解包之前列表中的所有元素构成了 一个整体,解包后成为一个个独立的元素。此处之所以要解包是为了把上个步骤中列表的三个迭代器都传给zip。来看看加不加这个解包用的星号的区别吧:
>>> x = iter([1, 2, 3, ...9])
>>> y = [x, x, x]
>>> zip(*y) # 等价于zip(x, x, x)
>>> zip(y) # 等价于zip([x, x, x])
最后list从zip(x, x, x)中取值并组成一个列表,zip每次返回的都是一个元组,所以你可以看到列表中的每个元素都是包含三个数字的元组。
之所以每个元组都有三个数字,是因为zip把传入的三个迭代器iter([1, 2, 3, ...9])进行对齐处理,每次都从这三个迭代器中各取一个数字组成一个元组,并且把这个元组给到list。
为什么1,2,3是一个元组,4,5,6又是另外一个元组呢?前面解释列表拷贝操作的时候说过了,列表中的三个迭代器其实是同一个对象的三个副本,它们完全相同!所以表面上看zip每次从三个迭代器中取出一个值,可实际效果却是从同一个迭代器中一次取三个值,如此一来列表[1, 2, 3, ...9]就恰好被分成了三份了。这是背后的原理
|
|