Pythonでfizzbuzz¶
Contents:
Contents
for文を使った例¶
1 2 3 4 5 6 7 | #!/usr/local/bin/python
# -*- coding: utf-8 -*-
for i in range(0,100):
if i % 3 == 0: print "fizz"
elif i % 5 == 0: print "buzz"
elif i % 15 == 0: print "fizzbuzz"
else: print i
|
ジェネレータを使う¶
無限に値を生成するなら、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/local/bin/python
# -*- coding: utf-8 -*-
def fb():
i = 0
while True:
i = i + 1
if i % 3 == 0: yield "fizz"
elif i % 5 == 0: yield "buzz"
elif i % 15 == 0: yield "fizzbuzz"
else: yield i
f = fb()
for i in range(0,100):
print f.next()
|
上限を設けるならこう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/local/bin/python
# -*- coding: utf-8 -*-
def fb(m):
for i in range(1, m):
if i % 3 == 0: yield "fizz"
elif i % 5 == 0: yield "buzz"
elif i % 15 == 0: yield "fizzbuzz"
else: yield i
for i in fb(100):
print i
|
FizzBuzzだとあまり違いは見えないけれど、使い方は違う。
文字列を使う¶
Pythonでは文字 * 数値で文字列を生成できる
>>> "a" * 3
'aaa'
それぞれ、以下のような定義であるため True/Falseをかけると字が表示される/されない
>>> False == 0
True
>>> True == 1
True
>>> "a" * True
'a'
>>> "a" * False
''
なのでこういうのもあり。
1 2 3 4 5 6 7 | #!/usr/local/bin/python
# -*- coding: utf-8 -*-
for i in range(0,100):
s = ""
s = "fizz" * (i % 3 == 0) + "buzz" * (i % 5 == 0)
if s == "": s = i
print s
|
内包リスト¶
内包リストでできるか考える。
まず、内包リストによって、以下のように数字は列挙可能。
>>> print "\n".join(str(c) for c in range(1,3))
1
2
(rangeのmax-1までしか出ない)
ここで、文字列に対する論理演算を利用する。 (結果論から使っているだけですが、Pythonの仕様なんでしたっけ?)
>>> "a" or "b"
'a'
>>> "a" and "b"
'b'
>>> "" or "b"
'b'
>>> "" and "b"
''
となるのを利用して、以下の通りになる。
1 2 3 | #!/usr/local/bin/python
# -*- coding: utf-8 -*-
print "\n".join("fizz" * (c % 3 == 0) + "buzz" * (c % 5 == 0) or str(c) for c in range(1,101))
|