Python - 浅谈Python3中map返回的迭代器对象

什么是迭代器

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退。
  • 两个基本方法iter()next()
ls = [1, 2, 3]
it = iter(ls)    # 创建迭代器对象
print(next(it))  # 输出迭代器的下一个元素  1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # 直至结束,报错提示:StopIteration

什么是可迭代对象

  • 通过查看对象的方法中是否有__iter__特殊方法判断该对象是否为可迭代对象。
  • 可以通过dir()函数查看对象所有的方法;或者通过hasattr()查看是否有该特殊方法。
  • 常见可迭代对象有哪些:str list tuple dic set 等等
ls = [1, 2, 3]
print(hasattr(ls, '__iter__'))     # True

map函数

  • map() 会根据提供的函数对指定可迭代对象做映射。
  • 语法:map(function, iterable, ...)
  • 返回值:python2 返回列表;python3 返回迭代器(本文讨论的是python3)
ls = [1, 2, 3]
it = map(lambda x: x+1, ls)
print(it)   # 返回map对象地址,<map object at 0x0000024D4A0D39A0>
print(hasattr(it, '__iter__'))   # True,是个可迭代对象

实验

我们换个写法,不用匿名函数。

def func(x):
	return x + 1
	
ls = [1, 2, 3]
it = map(func, ls)
print(it)
print(next(it))   # 2  因为有返回值,next(it)返回2
print(next(it))   # 3
print(next(it))   # 4

我们来看一个情况:

def func(x):
	return x + 1
	
ls = [1, 2, 3]
it = map(func, ls)
print(it)
print(next(it))   # 2  因为有返回值,next(it)返回2
print(list(it))   # [3, 4] 因为1已经遍历过了,从2开始遍历,剩下的元素被转换成列表

通常我们使用map都会再将map对象转换成列表或者其他可迭代对象。
由上一片代码可知,在转换的过程中,其实相当于对该对象进行next遍历,将返回结果转换成列表。


上面都是有返回值的函数,在没有返回值的情况下,是无法通过next()获取值的,只是一个处理动作。
遇到问题的简化版
例如,我想用map对二维列表进行批量处理,即将每个第二层列表的第0个元素改为7,这里是没有返回值的。

def fu(a):
    a[0] = 7

ls = [[1, 2], [2, 3], [5, 6]]
x = map(fu, ls)
print(next(x))  # None
print(ls)       # 查看当前的ls列表,[[7, 2], [2, 3], [5, 6]]
next(x)
print(ls)       # 查看当前的ls列表,[[7, 2], [7, 3], [5, 6]]
next(x)
print(ls)       # 查看当前的ls列表,[[7, 2], [7, 3], [7, 6]]

可以看出,也就是不next,就不会进行操作。所以,map只是创建一个迭代器对象,并不是map了就进行处理。

def fu(a):
    a[0] = 7

ls = [[1, 2], [2, 3], [5, 6]]
x = map(fu, ls)
print(ls)       # [[1, 2], [2, 3], [5, 6]]  应证只创建了迭代器对象
list(x)
print(ls)       # [[7, 2], [7, 3], [7, 6]]

我们对迭代器进行list,得到了最终结果。所以,list是对迭代器全部进行了遍历。
打印list(x),结果是[None, None, None],它竟然只是一个帮助我们对ls操作的工具人。
因为在遇到的问题中,如果我不对map进行可迭代对象的转换或者遍历,ls就永远不变。

*只是浅谈,所以只是从实验现象中分析总结,若有不正确的地方,欢迎指正!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值