2017-07-08 2 views
0

Wie kann ich das folgende Programm in Python in einen funktionalen Stil ändern?for loop with print im funktionalen Programmierstil python

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

ich über Karte wissen, aber

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

nicht die erwartete Ausgabe.

Ich frage mich, ob es möglich ist, dies zu tun, ohne die for-Schleife neu zu definieren.

+4

Welchen Nutzen haben Sie davon? –

+3

https://Stackoverflow.com/a/20296780/2308683 (und andere Antworten dort) –

+0

Dies ist eine Übung in einem meiner Kurse, und für dort ist nicht erlaubt –

Antwort

1

map sollte nicht für Nebenwirkungen Funktionen verwendet werden. Die Funktion print gibt None zurück, sodass Sie eine Liste (oder einen Generator in python3) erstellen, die so viele Nones wie Elemente in der Sammlung enthält, die Sie durchlaufen, was völlig nutzlos ist. Sie können eine while Schleife verwenden:

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

Als funktionelle Stil, können Sie recursion verwenden:

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

Oder auch nur dieses:

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

Die Idee dieser letzten Lösungen dass Sie die tatsächliche letzte Zeichenfolge vor dem Drucken mit nur einem Aufruf erstellen.

+0

Darüber hinaus gibt 'map' in Python 3 eine faule zurück Iterator. Daher wird die Druckfunktion nicht ausgewertet, bis Sie tatsächlich die resultierende "Karte" durchlaufen haben. Dies kann mit 'str.join (map (...))' oder 'list (map (...))' erfolgen. –

+0

@ HåkenLid, sollten Sie 'print' nicht mit' map' in 'list (map (...))' aufrufen, werden Sie am Ende eine vollständige Liste erstellen. – Netwave

+0

Ja, aber das OP fragt, warum der Code keine Ergebnisse liefert. Es ist vielleicht nicht offensichtlich, warum nichts gedruckt wird, um zu drucken. Der Grund ist, dass "map" faul ist. Ich sage nicht, dass es eine gute Übung ist, Funktionen mit Nebeneffekten abzubilden. –