summer_tree_home

Check iOでPython3をマスターするぜっ

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を返す

と同じ。

なるほどねーと思いながらも、頭がこんがらがってきた。