为了账号安全,请及时绑定邮箱和手机立即绑定

Python3.7 和 Python2.7 在使用 map 和 lambda 的问题

Python3.7 和 Python2.7 在使用 map 和 lambda 的问题

至尊宝的传说 2019-08-21 12:10:17
下面是一段使用split分割字符串的代码,分别使用Python2.7和Python3.7执行defmySplit(s,cut):data=[s]foriincut:t=[]map(lambdax:t.extend(x.split(i)),data)data=treturn[iforiindataifi]s='ab;cd|efg|hi,,jkl|mn\topq;rst,uvw\txyz'print(mySplit(s,',;|\t'))运行结果:Geek-Mac:Downloadszhangyi$python2.7Nice.py['ab','cd','efg','hi','jkl','mn','opq','rst','uvw','xyz']Geek-Mac:Downloadszhangyi$python3.7Nice.py[]Geek-Mac:Downloadszhangyi$由运行结果可知,Python2.7运行正常,但是换成Python3.7执行就出现了问题。如果换成循环就正常执行,我想知道是哪里出了问题,是map、lambda还是其他的的问题,望大神指点,不吝指教,多谢!defmySplit(s,cut):data=[s]foriincut:t=[]forxindata:t.extend(x.split(i))data=treturn[iforiindataifi]s='ab;cd|efg|hi,,jkl|mn\topq;rst,uvw\txyz'print(mySplit(s,',;|\t'))运行结果:Geek-Mac:Downloadszhangyi$python3.7Nice.py['ab','cd','efg','hi','jkl','mn','opq','rst','uvw','xyz']Geek-Mac:Downloadszhangyi$python2.7Nice.py['ab','cd','efg','hi','jkl','mn','opq','rst','uvw','xyz']Geek-Mac:Downloadszhangyi$
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

原因是Python3里面map函数的返回值不再是一个list,而是一个map对象,是一个迭代器。
迭代器是惰性计算的,因此除非调用迭代器,否则lambda函数根本没有执行。你可以这样,把:
map(lambdax:t.extend(x.split(i)),data)
改成:
list(map(lambdax:t.extend(x.split(i)),data))
转为list时要获得所有元素,强制让迭代器执行。
其实你的需求,可以用re.split来做,这里就不展开了,有需要可以看看。
                            
查看完整回答
反对 回复 2019-08-21
?
千巷猫影

TA贡献1829条经验 获得超7个赞

这得从python3里的map的改动说起,在python3里,map不再返回list,而是返回了一个迭代器。迭代器有个特点是,某个元素是在你进行迭代的时候计算的。所以,在你这种用法里,t.extend(x.split(i))根本没有执行,除非你改成
for_inmap(lambdax:t.extend(x.split(i)),data):pass
但这样使用map不又多此一举了么?
是的,在你的这个案例中,你不应该用map的,而应该用循环。
除此之外,还有一种比较便捷的方法,是使用re模块的split方法,但至于用法效率嘛,你可以自己探索一下
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号