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

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

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

吃鸡游戏 2019-03-13 14:52:51
下面是一段使用 split 分割字符串的代码,分别使用 Python2.7 和 Python3.7 执行def mySplit(s, cut):    data = [s]      for i in cut:                      t = []         map(lambda x: t.extend(x.split(i)), data)        data = t      return [i for i in data if i] s = 'ab;cd|efg|hi,,jkl|mn\topq;rst,uvw\txyz'print(mySplit(s, ',;|\t'))运行结果:Geek-Mac:Downloads zhangyi$ python2.7 Nice.py  ['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz'] Geek-Mac:Downloads zhangyi$ python3.7 Nice.py  [] Geek-Mac:Downloads zhangyi$由运行结果可知, Python2.7 运行正常,但是换成 Python3.7 执行就出现了问题。如果换成循环就正常执行,我想知道是哪里出了问题,是 map、lambda 还是其他的的问题,望大神指点,不吝指教,多谢!def mySplit(s, cut):    data = [s]      for i in cut:                      t = []                     for x in data:             t.extend(x.split(i))        data = t      return [i for i in data if i] s = 'ab;cd|efg|hi,,jkl|mn\topq;rst,uvw\txyz'print(mySplit(s, ',;|\t'))运行结果:Geek-Mac:Downloads zhangyi$ python3.7 Nice.py  ['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz'] Geek-Mac:Downloads zhangyi$ python2.7 Nice.py  ['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz'] Geek-Mac:Downloads zhangyi$
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

原因是 Python3 里面 map 函数的返回值不再是一个 list,而是一个 map 对象,是一个迭代器。

迭代器是惰性计算的,因此除非调用迭代器,否则 lambda 函数根本没有执行。你可以这样,把:

map(lambda x: t.extend(x.split(i)), data)

改成:

list(map(lambda x: t.extend(x.split(i)), data))

转为list时要获得所有元素,强制让迭代器执行。


其实你的需求,可以用 re.split 来做,这里就不展开了,有需要可以看看。


查看完整回答
反对 回复 2019-03-13
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

这得从 python3 里的 map 的改动说起,在 python3 里,map 不再返回 list,而是返回了一个迭代器。迭代器有个特点是,某个元素是在你进行迭代的时候计算的。所以,在你这种用法里,t.extend(x.split(i)) 根本没有执行,除非你改成

for _ in map(lambda x: t.extend(x.split(i)), data): pass

但这样使用 map 不又多此一举了么?

是的,在你的这个案例中,你不应该用 map 的,而应该用循环。


除此之外,还有一种比较便捷的方法,是使用 re 模块的 split 方法,但至于用法效率嘛,你可以自己探索一下


查看完整回答
反对 回复 2019-03-13
  • 2 回答
  • 0 关注
  • 1283 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信