Originalgeschichte Originalgeschichte: [Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren] (http://qiita.com/elzup/items/d532ffa1d326fbf75d01) Originalgeschichte: [Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"] (http://qiita.com/t2y/items/8584b77b3fe02dd2ce63)
Ich weiß immer noch nicht, wie man einen Doc-Block schreibt, also werde ich lernen
Eine der Funktionen von Python ist doctest. Wenn Sie das Dokument zur Verwendung der Funktion mit einem einfachen Test kombinieren, können es zwei Fliegen mit einer Klappe sein.
Wenn Sie die Logik des ursprünglichen Codes so ändern, dass Sie sich nicht damit anlegen, ist die Prüfung des geänderten Codes nicht gut. Wenn Sie jedoch versuchen, sich beim Schreiben der Prüfung zu entwickeln, erweitert sich die Perspektive der zu verwendenden Position und ist auf natürliche Weise einfach zu verwenden Sie können Funktionen und Module implementieren.
Beim Schreiben von doctest wollte ich sagen, dass es einfacher wäre, API zu debuggen und zu verwenden, wenn es interaktiv entwickelt würde, und dass es so wie es ist als Dokument verwendet werden könnte, aber ich konnte keinen geeigneten Beispielcode schreiben, also räche ich mich.
Ich habe versucht, es einfacher zu machen, den Zweck der Lehre zu verstehen.
__repr__
* implementieren, benötigen Sie die Debug-Ausgabefunktion nicht (* __repr__
* scheint in der Druckfunktion usw. verwendet zu werden, wenn * __str__
* nicht definiert ist).Abgesehen davon habe ich mich gefragt, ob ich den Prozess der Kartennummerngenerierung seit gestern klarer schreiben kann, und ich war ein wenig froh, dass es so wurde, als ich * reduzieren * verwendete.
def _generate(self):
def sampling(k=5):
for i in range(k):
yield sample(range(15 * i + 1, 15 * (i + 1) + 1), k)
return reduce(add, sampling())
Ich würde mich freuen, wenn ich diese Atmosphäre vermitteln könnte.
# -*- coding: utf-8 -*-
from functools import reduce
from operator import add
from random import sample
class Card:
""" 75-ball Bingo Card
The middle square is designated a "FREE" space.
The columns are labeled as follows.
"B": (numbers 1–15)
"I": (numbers 16–30)
"N": (numbers 31–45)
"G": (numbers 46–60)
"O": (numbers 61–75)
http://en.wikipedia.org/wiki/Bingo_card
>>> data = [ # for testing use
... 1, 2, 3, 4, 5,
... 6, 7, 8, 9, 10,
... 11, 12, 13, 14, 15,
... 16, 17, 18, 19, 20,
... 21, 22, 23, 24, 25,
... ]
>>> card = Card(data)
>>> len(card.numbers)
25
>>> card.numbers[12]
True
>>> card.is_bingo
False
>>> print(card)
1 2 3 4 5
6 7 8 9 10
11 12 o 14 15
16 17 18 19 20
21 22 23 24 25
Show 'o' when giving number is found
>>> card.set_number(14)
>>> print(card)
1 2 3 4 5
6 7 8 9 10
11 12 o o 15
16 17 18 19 20
21 22 23 24 25
Check bingo giving number to the card.
>>> card.set_number(35) # have no effect if number not in card.numbers
>>> card.set_number(1)
>>> card.set_number(7)
>>> card.set_number(19)
>>> card.is_bingo
False
>>> card.set_number(25)
>>> card.is_bingo
True
>>> print(card)
o 2 3 4 5
6 o 8 9 10
11 12 o o 15
16 17 18 o 20
21 22 23 24 o
"""
def __init__(self, numbers=None):
self.numbers = self._generate() if numbers is None else numbers
self.numbers[12] = True
self.is_bingo = False
def __repr__(self):
ascii_card = ''
for i in range(int(len(self.numbers) / 5)):
for num in self.numbers[5 * i:5 * (i + 1)]:
if num is True:
num = 'o'
elif num is False:
num = 'x'
ascii_card += '{0:>3s}'.format(str(num))
ascii_card += '\n'
return ascii_card[:-1]
def _generate(self):
def sampling(k=5):
for i in range(k):
yield sample(range(15 * i + 1, 15 * (i + 1) + 1), k)
return reduce(add, sampling())
def set_number(self, number):
if number not in self.numbers:
return
self.numbers[self.numbers.index(number)] = True
if not self.is_bingo:
self.check_bingo()
def check_bingo(self):
def check(start, stop, step=1):
return all(map(lambda x: x is True, self.numbers[start:stop:step]))
if self.numbers.count(True) < 5:
return
for i in range(5):
if check(i * 5, (i + 1) * 5): # horizontal
self.is_bingo = True
return
for i in range(5):
if check(i, i + 21, 5): # vertical
self.is_bingo = True
return
if check(0, 25, 6) or check(4, 21, 4): # skew
self.is_bingo = True
return
Führen Sie doctest so aus.
$ python -m doctest Bingo_kai2.py #Wenn kein Fehler angezeigt wird, ist der Test korrekt
$ python -m doctest Bingo_kai2.py -v #Redundanter Modus
Recommended Posts