2017-07-03 91 views
1

像print()这样的函数不返回值。但有时我需要对它们进行迭代。有没有什么方法可以用函数式编程方式进行编码,而不是使用“for”?func()不返回值时如何使用map(func,iterator)函数?

# changes some values of a list according to another pointer iterator. 
thelist = [1]*100 
slices = [(3,8),(9,15),(72,88)] 
for items in slices: 
    for i in range(items[0],items[1]): 
     thelist[i] = 8 

这里是例子,我想要的是改变“列表”中的值。如何使用理解或map()或其他方法进行重新编码,而不会损失代码的效率。

+0

“但是,当移动到python3时,必须生成占用大量空间的新列表。”我不明白你的意思。在Python 3中,'map'返回一个懒惰的迭代器,在Python 2中,'map'返回完全物化的'list'。究竟是什么,你可以在Python 2中做什么,你不能在Python 3中创建一个新的列表? –

+0

@ juanpa.arrivillaga对不起,我混乱的话。我重写了这个问题。现在对你有意义吗? – NuosiWu

+0

答案是你*不应该使用像'print' *这样的副作用的函数结构,或者像你的例子那样使用列表变异。 –

回答

0

你的代码大致相当于:

import itertools 
slices = set(itertools.chain(*itertools.starmap(range, ((3,8),(9,15),(72,88))))) 
thelist = map(lambda (x, y): y if x in slices else 8, enumerate(range(100))) 

所以有这样做的一个功能性的方式,但我不会在这种情况下建议,你不应该副作用计算使用功能

+0

你会更好地制作'切片'一套' –

+0

@ juanpa.arrivillaga,真的,谢谢。 – Netwave

+0

@DanielSanchez明白了。谢谢! – NuosiWu

0

而且,如果不itertools:

thelist2 = map(lambda ix: 8 if any((s[0] <= ix[0] < s[1] for s in slices)) else ix[1], enumerate(thelist2)) 

但远不如可读(IMHO)。另外,请参阅Daniel Sanchez关于副作用的评论。副作用不是功能编程方式...

相关问题