Pythonでfizzbuzz

Contents:

for文を使った例

1#!/usr/local/bin/python
2# -*- coding: utf-8 -*-
3for i in range(0,100):
4  if   i % 3  == 0: print "fizz"
5  elif i % 5  == 0: print "buzz"
6  elif i % 15 == 0: print "fizzbuzz"
7  else:             print i

ジェネレータを使う

無限に値を生成するなら、

 1#!/usr/local/bin/python
 2# -*- coding: utf-8 -*-
 3
 4def fb():
 5  i = 0
 6  while True:
 7    i = i + 1
 8    if   i % 3  == 0: yield "fizz"
 9    elif i % 5  == 0: yield "buzz"
10    elif i % 15 == 0: yield "fizzbuzz"
11    else:             yield i
12
13f = fb()
14for i in range(0,100):
15  print f.next()

上限を設けるならこう。

 1#!/usr/local/bin/python
 2# -*- coding: utf-8 -*-
 3
 4def fb(m):
 5  for i in range(1, m):
 6    if   i % 3  == 0: yield "fizz"
 7    elif i % 5  == 0: yield "buzz"
 8    elif i % 15 == 0: yield "fizzbuzz"
 9    else:             yield i
10
11for i in fb(100):
12  print i
13

FizzBuzzだとあまり違いは見えないけれど、使い方は違う。

文字列を使う

Pythonでは文字 * 数値で文字列を生成できる

>>> "a" * 3
'aaa'

それぞれ、以下のような定義であるため True/Falseをかけると字が表示される/されない

>>> False == 0
True
>>> True == 1
True
>>> "a" * True
'a'
>>> "a" * False
''

なのでこういうのもあり。

1#!/usr/local/bin/python
2# -*- coding: utf-8 -*-
3for i in range(0,100):
4  s = ""
5  s = "fizz" * (i % 3 == 0) + "buzz" * (i % 5 == 0)
6  if s == "": s = i
7  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#!/usr/local/bin/python
2# -*- coding: utf-8 -*-
3print "\n".join("fizz" * (c % 3 == 0) + "buzz" * (c % 5 == 0) or str(c) for c in range(1,101))