The Most Numbers (Library 2.0) - 可変長引数の扱い
どんな問題?
The Most Numbers
http://www.checkio.org/mission/most-numbers/
浮動小数点の配列を受け取って、最大値と最小値の差を計算せよ。
- 引数の個数はまちまちである。
- 引数が空なら、0を返す。
- 浮動小数点の誤差を考慮して、結果は±0.001まで許容される。
問題文の arbitrary number of arguments とは、可変長引数(任意引数)のこと。
どうやって解く?
可変長引数に対応するには、chekio(*args) のように、引数に*を付ければいい。
最大値と最小値は、max()とmin()で計算できるから、それを引けばいいだけ。
def checkio(*args): return max(args) - min(args)
はいできた。
ValueError: max() arg is an empty sequence
あ、argsが空の場合を忘れてた。
シーケンスが空のときは、if文でFalseとして扱われるので、
def checkio(*args): if args: return max(args) - min(args) else: return 0
とする。
ラムダ式で1行で書いてみる。
checkio = lambda *args: max(args) - min(args) if args else 0
ちなみに、Python3.4からは、min()やmax()で、defaultが指定できるようになって、空の場合でも分岐しなくてよくなるらしい。
他の人の答え
だいたい、みなが同じような答えになっていたが、一つよくわからないものが。
checkio=lambda*a:len(a)and max(a)-min(a)
http://www.checkio.org/mission/most-numbers/publications/veky/python-3/and/
コメント欄に詳しい説明があったので読んでみた。
Pythonの論理演算子
A and B では、AがFalseならBは評価されない。AがTrueならBが評価される。
つまり A and B は、
if a: return b else: return a
と同じ。
また、AとBはブール値(True/False)に限らないので、A and B の結果もブール値とは限らない。
例えば、
>>> 3 and 5 5 >>> 0 and 5 0
となる。
A or B は、AがTrueならBは評価されない。AがFalseならBが評価される。
つまり A or B は、
if a: return a else: return b
と同じ。
つまり、
return len(a) and max(a) - min(a)
は、
if len(a): # aが空ではないとき return max(a) - min(a) # max-minを返す else: # aが空のとき return len(a) # 0を返す
と同じ。
なるほどねーと思いながらも、頭がこんがらがってきた。