2017-07-08 11 views
0

次のプログラムをPythonで機能的なスタイルに変更するにはどうすればよいですか?関数型のPythonでのループprint for

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つのエクササイズであり、そこには許可されていません –

答えて

1

mapは、副作用の機能には使用しないでください。 print関数はNoneを返していますので、反復処理中のアイテムと同じ数のNoneを含むリスト(またはジェネレータ)をビルドしています。

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

として機能的なスタイル、あなたが使用することができrecursion:この最後の解決策のアイデアは

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

です

:また、ちょうどこれは

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

それとも あなたはwhileループを使用することができます1回の呼び出しで実際の最終文字列を作成することが前提です。

+0

さらに、python 3では、 'map'はレイジーを返しますイテレータ。したがって、print関数は実際に結果の 'map'をループするまで評価されません。これは 'str.join(map(...))'や 'list(map(...)) 'を使って行うことができます。 –

+0

@HåkenLid、 'list(map(...))'で 'print' whithing' map'を呼ぶべきではありません。あなたは完全なuselssリストを構築するでしょう。 – Netwave

+0

はい、しかしOPはコードが結果をもたらさなかった理由を尋ねます。 stdoutに何も印刷されないのは明らかではないかもしれません。その理由は、 'map'は怠惰だからです。副作用のある関数をマップするのがよい方法だとは言いません。 –