2017-07-08 70 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'是懶惰的。我並不是說,映射帶有副作用的函數是一種很好的做法。 –