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))