只能读取一次的对象-python

作者: 小郭me | 来源:发表于2021-01-10 23:02 被阅读0次

    在逛百度知道的时候被一个问题吸引了
    出于好奇,我跑了一下代码,代码和结果如下:

    >>> #代码1
    ... 
    >>> number_list = range(1,11);
    >>> c = filter(lambda b:b%2 == 0,number_list);
    >>> print(list(c))
    [2, 4, 6, 8, 10]
    >>> a = map(lambda b:b**3,c)
    >>> print(list(a))
    []
    >>> 
    
    >>> #代码2
    ...
    >>> number_list = range(1,11);
    >>>
    >>> c = filter(lambda b:b%2 == 0,number_list);
    >>> # print(list(c))
    ...
    >>> a = map(lambda b:b**3,c)
    >>> print(list(a))
    [8, 64, 216, 512, 1000]
    

    按道理来说,c的值并没有发生改变,为什么仅仅多了一个输出语句,结果差异会这么大呢?
    后来发现,filter()函数返回一个filter对象

    >>> number_list = range(1,11);
    >>> c = filter(lambda b:b%2 == 0,number_list);
    >>> print(type(c))
    <class 'filter'>
    

    查资料发现

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
    该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
    filter函数示例:

    >>> number_list = range(1,11);
    >>> print(list(number_list))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> c = filter(lambda b:b%2 == 0,number_list);
    >>> print(c)
    <filter object at 0x00000170B57D3C08>
    >>> print(list(c))
    [2, 4, 6, 8, 10]
    

    注意: Python2.7 返回列表,Python3.x 返回迭代器对象

    然后我又去查迭代器

    迭代器
    迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    迭代器是一个可以记住遍历的位置的对象。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    迭代器有两个基本的方法:iter() 和 next()。
    字符串,列表或元组对象都可用于创建迭代器

    迭代器只能向前,不能后退,所以说只能遍历一遍(不知是否准确,欢迎指正)
    所以代码1里面在print()函数运行之前已经通过list()函数把filter()函数返回的迭代器对象已经遍历转换成list对象了,所以c里的元素已经空了,或者说已经取不出来了。才会出现a变成空的情况。
    同理,下面的代码也可以用上面的原因来解释

    >>> #代码3
    ...
    >>> number_list = range(1,11);
    >>> c = filter(lambda b:b%2 == 0,number_list);
    >>> a = map(lambda b:b**3,c)
    >>> print(list(a))
    [8, 64, 216, 512, 1000]
    >>> print(list(c))
    []
    

    相关文章

      网友评论

        本文标题:只能读取一次的对象-python

        本文链接:https://www.haomeiwen.com/subject/ftfraktx.html