首先抛出一个困扰本人许久的问题:
nums = [1,2,3,4,5,6] numsIter = iter(nums) for _ in zip(*[numsIter]*2): print(_) print(list(numsIter))
则控制台输出如何?
nums = [1,2,3,4,5,6] numsIter = iter(nums) print(nums) print(list(nums)) print(nums) print(list(nums))
输出为:
<list_iterator object at 0x00000205944619D0> [1,2,3,4,5,6] <list_iterator object at 0x00000205944619D0> []
第二次键入 print(list(nums)) 时输出为空,因为迭代器对象已经找不到地址了。
nums = [1,2,3,4,5,6] numsIter = iter(nums) numsIter_list = [numsIter] * 2 print(numsIter) print(numsIter_list) for _ in numsIter_list: print(next(_))
输出为:
<list_iterator object at 0x0000020594445A00> [<list_iterator object at 0x0000020594445A00>, <list_iterator object at 0x0000020594445A00>] 1 2
P = [1,2,3] Q = [4,5,6] PQ_zip = zip(P,Q) print(PQ_zip) print(list(PQ_zip)) print(list(PQ_zip))
输出为:
<zip object at 0x0000020594520140> [(1, 4), (2, 5), (3, 6)] []
zip之所以能work,就是利用了迭代器储存的遍历位置,逐一地获取数据,直到其中一个迭代器被消耗掉。文首的问题就是最好的例子 。
nums = [1,2,3,4,5,6] numsIter = iter(nums) for _ in zip(*[numsIter]*3): print(_) print(list(numsIter))
输出为:
(1, 2, 3) (4, 5, 6) []
可以看见,实现的功能是把单行数据变成了3列2行。这是怎么做到的呢?执行zip时,依次访问三个同样的迭代器,每次访问,迭代器的遍历位置都会加1,于是第一轮结束后zip获取了(1,2,3),同理第二轮则获取了(4,5,6),随后迭代器被消耗。第三轮zip对象已经没有迭代器可用,于是结束执行。最后 print(list(numsIter)) 发现迭代器确实已经被消耗。
nums = [1,2,3] numsIter = iter(nums) print(numsIter) for _ in zip(list(numsIter)*3): print(_) print(list(numsIter))
输出为:
<list_iterator object at 0x0000020594445B80> (1,) (2,) (3,) (1,) (2,) (3,) (1,) (2,) (3,) []
在熟悉迭代器和zip()函数的同时,掌握了一个将一维数据变为二维数据的方法。