【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、map 組み込み関数と使い分けることも必要ですね! 投稿一覧へ戻る
Published 2020年8月9日17:27 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
さて、まずは次のコードを見て下さい。出力結果はどうなるでしょうか?
letters と numbers という 2 つのシーケンスを定義しています。
zip() 組み込み関数を利用して、これらのシーケンスから 1 つのタプルのリストを作成し、
アンパックを利用して 1 つ 1 つのタプルの要素を取り出して、
要素同士を掛け合わせた結果を要素とするリストを作って、
全ての要素を ' ' ( スペース ) をセパレータとして繋ぎ合わせて 1 つの文字列を作成しています。
ということで、
という出力結果になります。
comprehension は、従来の filter() 関数と map() 関数を利用して実現していたことを、簡潔に記述することが可能です。
(この例では if 文が組み込まれていないので、filter 機能は実装していませんが...)
確かに便利です。
ですが、この例のように複数のシーケンスを対象にして何らかの処理を加えた新しいシーケンスを作成する場合は、
実は map() 組み込み関数を利用したほうが簡潔に記述できちゃうんです。
では、map() 関数を利用して同じ結果を取得できるように作り直してみてください。
いかがですか?
map() 関数の定義はこうなっています。
map() 関数は iterable を複数受け取ることが可能で、要素を function に渡す前に zip() を利用して要素を集めたシーケンスを作成します。
ですから、いちいちこちら側で zip() を適用する手間が必要ないんです。
ということで、
が正解例になります。
import operator
def stick_to_comprehension():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join([operator.mul(letter, number) for letter, number in zip(letters, numbers)])
def stick_to_comprehension():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join([operator.mul(letter, number) for letter, number in zip(letters, numbers)])
letters と numbers という 2 つのシーケンスを定義しています。
zip() 組み込み関数を利用して、これらのシーケンスから 1 つのタプルのリストを作成し、
アンパックを利用して 1 つ 1 つのタプルの要素を取り出して、
要素同士を掛け合わせた結果を要素とするリストを作って、
全ての要素を ' ' ( スペース ) をセパレータとして繋ぎ合わせて 1 つの文字列を作成しています。
ということで、
print(stick_to_comprehension())
# a bb ccc dddd
# a bb ccc dddd
という出力結果になります。
comprehension は、従来の filter() 関数と map() 関数を利用して実現していたことを、簡潔に記述することが可能です。
(この例では if 文が組み込まれていないので、filter 機能は実装していませんが...)
確かに便利です。
ですが、この例のように複数のシーケンスを対象にして何らかの処理を加えた新しいシーケンスを作成する場合は、
実は map() 組み込み関数を利用したほうが簡潔に記述できちゃうんです。
では、map() 関数を利用して同じ結果を取得できるように作り直してみてください。
制限時間 10 分:
import operator
def using_map():
letters = 'abcd'
numbers = range(1, 5)
pass
import operator
def using_map():
letters = 'abcd'
numbers = range(1, 5)
pass
いかがですか?
map() 関数の定義はこうなっています。
map(function, iterable, ...)
map() 関数は iterable を複数受け取ることが可能で、要素を function に渡す前に zip() を利用して要素を集めたシーケンスを作成します。
ですから、いちいちこちら側で zip() を適用する手間が必要ないんです。
ということで、
import operator
def using_map():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join(map(operator.mul, letters, numbers)))
print(using_map())
# a bb ccc dddd
def using_map():
letters = 'abcd'
numbers = range(1, 5)
return ' '.join(map(operator.mul, letters, numbers)))
print(using_map())
# a bb ccc dddd
が正解例になります。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -