小言_互联网的博客

map迭代实际过程区别于思维惯性(python版)

499人阅读  评论(0)

问题引入:

    同学在调试python代码的两个for循环遍历时发现输出有问题,因为遍历的有map()在,由于这个可迭代对象的出现,导致map()只能循环迭代一轮。

问题实质:

    python中,map()对象,只能遍历一次,即从头遍历到尾,之后再遍历,只能得到为空的结果。

实例说明:

def scanD(D,CK,minSupport):
    ssCnt = {}
    s=list(CK)
    pp = list(CK)
    for tid in D:
        print("###########")
        print(tid)
        print("##################")
        for can in pp:
            print("*******")
            print(can)
            print("*************")

D = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
#CK = [[1],[2],[3],[4],[5]]
#CK = [frozenset[1],frozenset[2],frozenset[3],frozenset[4],frozenset[5]]
temp = [[1],[2],[3],[4],[5]]
def scanD(D,CK,minSupport):
    ssCnt = {}
    for tid in D:
        print("###########")
        print(tid)
        print("##################")
        for can in CK:
            print("*******")
            print(can)
            print("*************")

D = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]]
CK = [[1],[2],[3],[4],[5]]
scanD(D,CK,1)

简单来说进行,我们使用下面这个更短的代码段说明问题

CK = map(frozenset,[[1],[2],[3],[4],[5]])
s=list(CK)
pp = list(CK)
print(pp)

从上面代码段,可以看出,我们把map()对象的CK转换为list的对象,可以进行输出,各操作都很正常,但是当我们第二次使用map()对象进行list之后,再进行输出就只能为空了,这儿就说明了问题,第一次使用了map对象后,第二次再使用就没有了。只能得到空集合了。(这儿与之前我们学到的数组等类型不一样,我们需要注意一下)

问题原因:

    map函数返回的是一个可迭代对象,这种对象在被访问的同时,也在修改自己的值。类似于a = a + 1,因此,对于map来说,就是每次访问,都把自己变为List中的下一个元素,循环取得对象中的值,实际上是会调用内部函数__next__,将值改变,或者指向下一个元素。当多次调用,代码认为到达终点了,返回结束,或者__next__指向空,此时可迭代对象(链表)就算到达终点了,不能用了。。

    类似于list(A_object)或者for num in A_object这样的语句,就是调用了迭代器,执行了__next__,消耗了迭代对象。所以,再次使用A_object后,会发现它已经空了。

eg: 

A = map(str,range(3))
num = A.__next__()
#num = A_object.__next__()
#print(A)
print(num)
print("*****")
B = A.__next__()
print(B)
C = A.__next__()
print(C)
print("&&&&")
D = A.__next__()
print(D)

我们运行,可以看到运行结果如下:原有的元素为0,1,2。我们依次进行了输出,并且也算是成功输出了,但是再进一步,输出下一个的时候,我们发现运行框中提示,停止迭代了。

总结

python中的map函数返回的是迭代器,python2中map函数返回的是list

(参考:https://www.cnblogs.com/stonenox/p/11171080.html)


转载:https://blog.csdn.net/yezonghui/article/details/101459869
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场