for文ではなくmapやfilterを使っていきたい
典型的な(モダンを知らない)いにしえのおっさんプログラマーである
(forによるネスト愚直)
https://gyazo.com/67c1f205440062a6650f5bb744bab417
なんかmap?filter?みたいなの使ったらフラットにできるんだよね?
深く考えてない(文脈も無自覚)ですsta.icon
「なんかmapとかflatとかその辺の書き方よく見るけど、俺もそろそろ勉強した方がええんかな」くらいの気持ちを書いた
「フラット」は、ネストをなくせるって意味として使ってるのだと思われる
個人的にforのネストが2重になるのは不吉な臭いだと思っているので「なんとかできんかなぁ」と常に考えてしまう 井戸端でそういう書き方見てる機会が増えてから、ちょいちょい頭よぎっていた
ようやく重たい腰を上げてページ化してみたといったところか
不吉な臭いではないという意見
本質的にn重な処理はn重分書くしかない
が、フラットにもできる(まあここは趣味)
ただしbreakやcontinueみたいなややこい処理が入り始めると(フラット派は)死ぬ
たぶんsta.iconは以下のような思考回路が多い
なるべくリーダブルに書きたい
ネストはリーダブルじゃない
リーダブルに書けない処理は何かがおかしい
が、もちろんそうじゃない(何にでも当てはめられるほどの汎用性はない)sta.icon
煩雑なアルゴリズムだとbreak/continue使うみたいなのも普通にあるし
今そうじゃなくても後の拡張でそうなったりする
早すぎる抽象化は警戒した方がいいな
正直sta.iconは「mapやfilterで書いちゃうZE☆」って気持ちに結構傾いていたので なんかこう、ミーハー?なところあるんだよなぁ俺
井戸端のみんながそう書いてるから俺もやるぅ!みたいなw
(この「井戸端のみんな」もかなり偏ってそう&記憶も曖昧そうだし)
Me toosta.icon*2
おもろかった
with python
filterとmap
filter
code:filter.py
d = {
'1': 123,
'2': 234,
'3': 999,
'a': 3,
'b': 2,
}
def f(pair):
key, value = pair
number = value
is_odd = number%2==1
return is_odd
filter_object = filter(f, d.items())
for iter in filter_object:
print(iter)
# ('1', 123)
# ('3', 999)
# ('a', 3)
functionとiterableを渡す
iterableから取り出したiteratorごとに「trueかどうかを判定するfunction」を適用して、trueだったiteratorだけを返す
その名のとおりフィルタリングするわけかsta.icon
map
code:python
d = {
'1': 123,
'2': 234,
'3': 999,
'a': 3,
'b': 2,
}
def f(pair):
key, value = pair
number = value
calced_value = number*2
output_pair = (key, calced_value)
return output_pair
map_object = map(f, d.items())
for iter in map_object:
print(iter)
https://gyazo.com/b8b7f112d79d650b52d5ba0cb9aec7da
functionとiterableを渡す
iterableから取り出してiteratorごとにfunctionに渡して、その結果から成るiterableをつくる
元々のiterableの中身を一部変えることもできるし、計算した値だけを返すこともできる
上記コードは前者
code:後者を行う場合.py
# これだと print(iter) 時は計算後の数字になる
def f(pair):
_, value = pair
return number*2
何でも適用できるし、何でも返せるわけか