猿问

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

下面是一段使用split分割字符串的代码,分别使用Python2.7和Python3.7执行
defmySplit(s,cut):
data=[s]
foriincut:
t=[]
map(lambdax:t.extend(x.split(i)),data)
data=t
return[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=t
return[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$
至尊宝的传说
浏览 259回答 2
2回答

慕桂英4014372

原因是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来做,这里就不展开了,有需要可以看看。

千巷猫影

这得从python3里的map的改动说起,在python3里,map不再返回list,而是返回了一个迭代器。迭代器有个特点是,某个元素是在你进行迭代的时候计算的。所以,在你这种用法里,t.extend(x.split(i))根本没有执行,除非你改成for_inmap(lambdax:t.extend(x.split(i)),data):pass但这样使用map不又多此一举了么?是的,在你的这个案例中,你不应该用map的,而应该用循环。除此之外,还有一种比较便捷的方法,是使用re模块的split方法,但至于用法效率嘛,你可以自己探索一下
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答