Pythonマップとその他の関数ツールの使用 質問する

Pythonマップとその他の関数ツールの使用 質問する

これはかなり初心者ですが、Python で関数型プログラミングを学習/理解しようとしています。次のコード:

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3]

def maptest(foo, bar):
    print foo, bar

map(maptest, foos, bars)

生成:

1.0 1
2.0 2
3.0 3
4.0 None
5.0 None

Q. Python の map またはその他の関数ツールを使用して、ループなどを使用せずに次のものを生成する方法はありますか。

1.0 [1,2,3]
2.0 [1,2,3]
3.0 [1,2,3]
4.0 [1,2,3]
5.0 [1,2,3]

補足として、fooとbarの間に依存関係がある場合、実装はどのように変化するでしょうか。例:

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3,4,5]

そして印刷します:

1.0 [2,3,4,5]
2.0 [1,3,4,5]
3.0 [1,2,4,5]
...

PS: if、ループ、ジェネレーターを使用して単純にこれを行う方法はわかっていますが、関数ツールを使用して同じことを実現する方法を学びたいと思います。 maptest に if ステートメントを追加するか、maptest 内で内部的に別のフィルター マップをバーに適用するだけですか?

ベストアンサー1

他の関数型言語に精通していますか? つまり、Python で関数型プログラミングを行う方法を学習しようとしているのか、それとも関数型プログラミングについて学習し、Python を手段として使用しようとしているのか?

また、リストの内包表記を理解していますか?

map(f, sequence)

は、次の式と直接同等です(*)。

[f(x) for x in sequence]

実際、map()Python 3.0 では冗長であるとして削除される予定だったと思います (削除されませんでした)。

map(f, sequence1, sequence2)

は、ほとんど次のものと同等です。

[f(x1, x2) for x1, x2 in zip(sequence1, sequence2)]

(シーケンスの長さが異なる場合の処理​​方法には違いがあります。ご覧のとおり、map()シーケンスの 1 つがなくなると None が入力され、zip()最短のシーケンスが停止すると停止します)

したがって、特定の質問に答えるために、次のような結果を生み出そうとしています。

foos[0], bars
foos[1], bars
foos[2], bars
# etc.

これを実現するには、引数を 1 つ受け取り、それに続いてバーを出力する関数を作成します。

def maptest(x):
     print x, bars
map(maptest, foos)

あるいは、次のようなリストを作成することもできます。

[bars, bars, bars, ] # etc.

オリジナルのマップテストを使用します:

def maptest(x, y):
    print x, y

これを行う 1 つの方法は、事前にリストを明示的に構築することです。

barses = [bars] * len(foos)
map(maptest, foos, barses)

あるいは、itertoolsモジュールをプルすることもできます。itertoolsには、Python で関数型の遅延評価プログラミングを行うのに役立つ多くの巧妙な関数が含まれています。 この場合、itertools.repeat反復処理するたびに引数を無期限に出力する が必要です。 この最後の事実は、次のようにすると次のことを意味します。

map(maptest, foos, itertools.repeat(bars))

map()引数の 1 つがまだ出力を生成している限り は継続するため、出力は無限に続きます。ただし、itertools.imapは とまったく同じですmap()が、最短の反復可能オブジェクトが停止するとすぐに停止します。

itertools.imap(maptest, foos, itertools.repeat(bars))

(*) Python 3.0 では少し異なります。そこでは、map() は基本的にジェネレータ式を返します。

おすすめ記事