質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

3回答

817閲覧

PythonのMap関数に関して

kokotao

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2021/04/23 11:13

編集2021/04/23 11:42

基本的で済みませんが、PythonのMap関数の使い方について確認させてください。

例えば、

python

1def sample(num): 2 return num*2 3 4for answer in map(sample, range(5)): 5 print(answer)

のような例をよく見かけますが、これを以下のようにした場合には何も出力されませんでした。

python

1def sample2(num): 2 print(num*2) 3 4map(sample2, range(5))

Map関数はリスト等のすべての要素を指定関数に適用できるものと認識しているのですが、その関数でできること、できないことがあるのでしょうか。

*申し訳ありません。2つ目の例に誤りがありました。先ほど修正しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2021/04/23 11:29 編集

何も出力されないということはないと思います。 最初の例のとおり、0, 1, 4, 9, 16 が順に表示されますよね? 次の map(sample2, range(5)) の部分で何も表示されないと言っていますか? また、この sample2 というのはどのような関数ですか?
kokotao

2021/04/23 11:42

申し訳ありません、またご指摘どうもありがとうございます。後半のコード抜粋部に誤りがありました。printを関数内に移動すると処理されないということを伝えたい例でした。修正致しました。
meg_

2021/04/23 11:54

map(sample, range(5))とmap(sample2, range(5))とは同じような結果になりますが、自作関数の違いについての質問なのかmapの使い方なのか質問の主旨がよく分かりませんでした。
kokotao

2021/04/24 14:23

mapの質問になります。同じ結果にならないための質問でした。
meg_

2021/04/25 02:56

> mapの質問になります。同じ結果にならないための質問でした。 そうでしたか。変化点が多い(mapに使用する関数の違い、map関数の使用方法の違い)と理解が難しくなるかと思います。ですが解決されたようで良かったです。
guest

回答3

0

map関数はたしかに、与えられたリストの要素を引数に与えた関数を適用する関数なのですが、mapが返すのは「イテレータ」です。

イテレータは、リストの様に順に要素を取り出すことができるものですが、内容については、実際に取り出されるまで計算しないようになっています(これを遅延評価(lazy evaluation)と言います)。
詳しいことは他のサイトで調べてみるといいでしょう。[公式ならこのあたり]
(https://docs.python.org/ja/3.5/howto/functional.html)

ということで、

python

1def sample2(num): 2 print(num*2) 3 4map(sample2, range(5)) # ★

このようにしても、★のところでイテレータは作られますが、何も実行されずに捨てられてしまいます。

以下のように書き換えて実行してみてください。

python

1def sample2(num): 2 print(num*2) 3 4print ('a') 5 6x = map(sample2, range(5)) # ★1 7 8print ('b') 9 10list(x) # ★2 11 12print('c') 13

すると

text

1a 2b 30 42 54 66 78 8c

このように表示されます。
list関数は、イテレータをすべて読み出す作用があるので、このタイミングで、mapで設定された関数が実行されて、数字が表示されます。
また、

python

1for i in map(sample2, range(5)): 2 pass

こんな風にしても表示されます。 for文もイテレータを展開します。

さて、ここまで書きましたが、map関数で適用する関数はprintのような「副作用」のある処理が行なわないようにすべきです。
今回の例のように実行されないかもしれないし、実行されたとしてもタイミングが別りません。 結果が予期しないようなことになるかもしれません。

投稿2021/04/23 12:12

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokotao

2021/04/24 14:29

わかりやすい説明どうもありがとうございます。問い合わせのためサンプルとして簡単なコードで載せましたが、やりたかったのはかなり副作用があるコードでした。mapでは利用せず対応しようと思います。
guest

0

ベストアンサー

map 関数を実行するだけだと sample2 関数は呼び出されないです
map の結果得られるのは関数を適用する iterator なので
全部に実行するなら for 文で

py

1def sample2(num): 2 print(num*2) 3 4for x in map(sample2, range(5)): 5 pass

list 変換でも iterator が最後まで呼びされるので

py

1def sample2(num): 2 print(num*2) 3 4list(map(sample2, range(5)))

でも出力されます

最初だけなら

py

1def sample2(num): 2 print(num*2) 3 4next(map(sample2, range(5)))

投稿2021/04/23 12:10

lazex

総合スコア604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokotao

2021/04/24 14:28

どうもありがとうございます。for文の代わりに使えるものと思い込んでいたのですが、そういうわけではないのですね。
guest

0

sample2を使いたいのなら、以下のように呼び出せば0,2,4,6,8が表示されます。

python

1>>> def sample2(num): 2... print(num*2) 3... 4>>> for _ in map(sample2, range(5)): 5... pass 6... 70 82 94 106 118

というので、答えになっているでしょうか。

お二方がイテレータであるという説明をしていて、そのとおりです。

以下の実行結果を見ると、その意味が良くわかるかもしれません。

python

1>>> def sample2(num): 2... print(num*2) 3... 4>>> for _ in map(sample2, range(5)): 5... print('---------------') 6... 70 8--------------- 92 10--------------- 114 12--------------- 136 14--------------- 158 16---------------

つまり、for文で呼び出された時に偶数を表示し、for文の本体の部分で---------------が表示されているのです。

投稿2021/04/23 12:15

編集2021/04/23 12:37
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokotao

2021/04/24 14:30

わかりやすい例どうもありがとうございます。承知しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問