or のメモ

最近checkiOというものにハマっておりまして。
いや嘘だ、最近始めてハマりだしてまして。

様々な問題に対して海外の色んな人が書いたコードを見ることができるんですが、そこでちょっとした新しい発見をしたのでメモ。

問題は、典型的なFizzBuzzテスト。
つまり、 3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリント、それ以外の場合は入力された数字をプリントするようなプログラムをかけ。といったもの。

自分は教科書通りに生きてきた愚か者なので、いわれた通り、ふつーのプログラムを書いてしまった。
いや別に悪いこととは思ってない。

自分のスクリプト

def checkio(number):
    if number % 3 == 0:
        result = 'Fizz'
        if number % 5 == 0:
            result += ' Buzz'
    elif number % 5 == 0:
        result = 'Buzz'
    else:
        result = str(number)

一方、海外の nickie 氏のスクリプト

checkio=lambda n:("Fizz "*(1-n%3)+"Buzz "*(1-n%5))[:-1]or str(n)

一行、、だと、、、?
このスクリプト、すごいです。考えつくされてます。
最初[:-1]の意味が謎だったんですけど、あれですね、ちゃんとご丁寧に語尾のスペース消してるんですね。

で、メインはorの使い方です。 orは、if をつけない場合は論理値でなく比較した値が返ってくるんですね。

x or yの場合、
xTrueであればxを返し、 xFalseであればyの値を見ることなくy返すようです。

x and yの場合、
xFalseであればをx返し、xTrueであればyの値を見ることなくy返すようです。

どの場合も両方の論理値を見て判断しているのかと思ってました。
普通に使えそうなTipsでしたー。