2017-07-03 5 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 

ここでは、私が望むのは "thelist"の値を変更することです。どのようにコードの効率を失うことなく、comprehensionやmap()などを使用して再コード化するか。

+0

"しかし、python3に移行すると、多くのスペースを占有する新しいリストを生成する必要があります。私はあなたが意味することを理解していません。 Python 3では、 'map'は遅延イテレータを返し、Python 2では' map'は完全にマテリアライズされた 'list'を返します。新しいリストを作成せずにPython 3で行うことができないPython 2で行うことができるのは正確です。 –

+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)) 

しかし、それははるかに少ない読み取り可能である(私見)。また、Daniel Sanchezの副作用についてのコメントを参照してください。副作用は関数型プログラミングではありません...

関連する問題