2017-07-08 35 views
0

如何将Python中的以下程序更改为函数式样?for循环与函数式编程风格的打印python

from itertools import permutations 
for p in permutations(range(1, int(input()) + 1)): 
    print(*p, sep='') 

我知道地图,但

map(lambda p: print(*p, sep=''), permutations(range(1, int(input()) + 1))) 

不会产生预期的输出。

我想知道如果不重新定义for循环,是否可以这样做。

+4

你从中得到什么好处? –

+3

https://stackoverflow.com/a/20296780/2308683(和其他答案那里) –

+0

这是我的课程中的一个练习,并且不允许有 –

回答

1

map不应该用于副作用功能。 print函数返回None,因此您正在构建一个列表(或python3中的生成器),该列表将包含与您正在迭代的集合中的项目数量相当的Nones,完全无用。 您可以使用while循环:

def printFrom(col): 
    i = iter(col) 
    while True: 
     try: 
      print(next(i)) 
     except StopIteration: 
      break 

至于实用的风格,你可以使用recursion

def printFrom(col): 
    it = iter(col) 
    def printit(i): 
     try: 
      print(next(i)) 
      printit(i) 
     except StopIteration: 
      return 
    printit(it) 

或者也只是这一点:

print(" ".join(map(lambda x: " ".join(map(str, x)),permutations(range(1, 10))))) 

这最后的解决方案的想法是您只需打一个电话即可打印出实际的最终字符串。

+0

此外,在python 3中,'map'返回一个懒惰迭代器。所以直到你实际遍历结果'map',打印函数才会被评估。这可以使用'str.join(map(...))'或'list(map(...))'完成。 –

+0

@HåkenLid,你不应该在'list(map(...))'中调用print'whithing'map',你将最终建立一个完整的uselss列表。 – Netwave

+0

是的,但是OP询问为什么代码没有产生任何结果。为什么没有打印到stdout可能并不明显。原因是'map'是懒惰的。我并不是说,映射带有副作用的函数是一种很好的做法。 –