【python】CheckIOの「The Most Numbers」を一行で書いてみた

久しぶりにCheckIOに挑戦です。
以前、Homeで悪戦苦闘をしまくっていた私のところへ社長降臨からのアドバイス。
「Homeじゃなくて、Elementaryの方やれよなにやってん」(もうちょい優しかった)

基本的にあまり接点のない社長と私ですが、
うん、なんかね。。
うん。

ということで、改めまして、
CheckIOを継続してやっております。
解くので精一杯の状況は正直今も変わっておりませんが、
なんとか冗長な表現を少しでも減らして解くように色々考えながら挑んでます。

でも将来的にはWebのデザイナーなので、
正直Pythonなのか・・・?という疑問は拭い去れませんが、それでもとりあえず
色々できたほうがいいでしょうってことで。
CheckIOが落ち着いて、今個人的に勉強していることが落ち着いたら
JavascriptのCheckIOにも挑んでみようかな〜
前置きが長くなりましたが、CheckIOの「The Most Numbers」の一行解答いってみましょう。

数字の配列の中から最大と最小を引いた数を返せ

ということで、まあ内容自体そもそもそんなに難しくないので、
こんなのワンライナーなんて余裕だろバカかって人は回れ右でお願いします♪

まず普通に解答したのはこれ。


def checkio(*args):
if not args == ():
min_num = min(args)
max_num = max(args)
ans = max_num - min_num
return ans
else:
return 0

そもそも*argsってなんやねんって俺もそれ思った。
なのでググる。

日曜プログラマーの休日

こちらがわかりやすかったです。

どんな引数でも受け取れるらしい。
ん?いや、うん。

関数定義に使用した場合、頭に”*”が付いた変数は、余った引数を受け取るタプルという意味になります。
また”**”が付いた変数は、余ったキーワード引数を受け取り、辞書として機能します。
引数に(*args、**kwargs)を入れておけば、どんな引数でも受け取れることを意味しています。

なんか引用がとんでもない大きさになったけどスルー
ということで、引用、勝手にリンクさせていただきました。
ありがとうございます。

中身知りたかったら、
*argsの場合、

print (*args)

じゃなく、

print (args)

としてくださいってのが地味にわからなかった。

で、まあこの配列の中から、一番大きい値を抜き出す。そのあと一番小さい値を抜き出す。
それを引く。もし空が渡ってきたら、0を返すって感じの流れです。

これを一行で書いてみました。


checkio = lambda *n : max(n) - min(n) if not n == () else 0

lambda n:~~~
のところで少し躓いた。
一つの値しか受け取れないよってことだったので、
さっきの上のargsの例を活かして見たらうまくいった。

正直lambda使ったことなかったので、良い経験になったなぁと。
もっと突き詰められたり、他のやり方あんのかな。
色々やってみようと思います。
ではでは。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です