最近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
の場合、
x
がTrue
であればxを返し、
x
がFalse
であればy
の値を見ることなくy
返すようです。
x and y
の場合、
x
がFalse
であればをx返し、x
がTrue
であればy
の値を見ることなくy
返すようです。
どの場合も両方の論理値を見て判断しているのかと思ってました。
普通に使えそうなTipsでしたー。