刚开始学。在做一道练习题 题目是:
已知一个列表[1,2,3,4,5],将列表中每个元素都加1,并筛选出不能被2整除的数。
我的做法是:
因为查阅了相关资料。得知map函数返回的是一个object类型,所以在filter对上一个map的结果时采用了list()来转换。
a_list = [1, 2, 3, 4, 5]
b_list = map(lambda x: x + 1, a_list)
print(list(b_list))
c_list = filter(lambda x: x % 2, list(b_list))
print(list(c_list))
可是控制台的输出是:
[2, 3, 4, 5, 6]
[]
经过多次尝试发现只有这样才能成功输出:
a_list = [1, 2, 3, 4, 5]
b_list = map(lambda x: x + 1, a_list)
print(list(b_list))
c_list = filter(lambda x: x % 2, map(lambda x: x + 1, a_list))
print(list(c_list))
这样控制台的输出是:
[2, 3, 4, 5, 6]
[3, 5]
是正确的。
我单独对b_list做遍历输出也好,用list()转换后输出也好,输出的内容都是空。
只有第一句
print(list(b_list))
才能输出值
这是为什么呢。为什么第二次print(list(b_list))为空?
怎样才能让b_list的值一直存在?
这样做就好了:
在 Python 3+, 很多迭代过程在迭代时,会返回迭代对象自身, 这样不用保存完整的列表,多数情况下可以节省内存的提高速度.
map返回的是迭代对象, 这个迭代器只能迭代一次(
list(b_list)
),迭代完成就完了. 第二次list(b_list)
执行返回的是空. 但如果你把结果做为list放到内存里, 就没有这个问题了,只是如果list很大的话,内存占用多,效率会下降,好的做是把这些操作串在一起, 一次完成.