Aplikacja konsolowa python: Losowanie Lotto cz.2
Hej, w tym wpisie omówię między innymi, jak wykonać metodę która sprawdzi czy wylosowany numer przez nasz program jest poprawny, oracz czy nie został już wcześniej użyty w tej samej liście. Oczywiście zgodnie z zasadami programowania obiektowego, nie będziemy powielać naszej metody i wykorzystamy ją również dla numerów wpisanych przez użytkownika. Zaczynamy
W poprzednim wpisie dodaliśmy metodę randNumber, w niej do listy przy pomocy append dopisywaliśmy kolejne liczby, bez żadnej walidacji! Jak można się domyśleć, to nie jest dobry sposób. W losowaniu lotto nie może trafić nam się dla przykładu 2x liczba 14.
Dopiszmy więc kolejną metodę i nazwijmy ją checkNumber, potrzebujemy przekazać jej parametr number oraz list.
Parametr number to numer który został wylosowany, sprawdzimy czy nie został już wcześniej użyty, ale w jakim zbiorze ? A no właśnie w liście która zostanie przekazana jako drugi parametr list.
def checkNumber(self, number, list, created, returnData=None): while True: brokeData = True if number not in list: returnData = int(number) break else: number = random.randint(1,49) return returnData
W kodzie powyżej mamy jeszcze trzeci parametr returnData który z automatu ma przypisaną wartość None. Wpisałem go dla tego, gdyż zostanie on wykorzystany poniżej w metodzie.
Jeśli automat wylosował złą liczbę, musi powtórzyć jej losowanie, dla tego całość została zamknięta w pętli while. Sprawdzamy czy liczba nie znajduje się już w zbiorze list, jeśli nie, zapisujemy liczbę w returnData i przerywamy działanie pętli. Jeśli liczba wylosowana przez program znajduje się już w zbiorze list, losujemy ponownie kolejną, wtedy pętla zaczyna działać na nowo.
Gdzie wywołać metodę ?
Wystarczy spojrzeć na poniższy kod:
def randNumber(self): tempNumber = [] oneNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(oneNumber, tempNumber)) twoNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(twoNumber, tempNumber)) threeNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(threeNumber, tempNumber)) fourNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(fourNumber, tempNumber)) fiveNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(fiveNumber, tempNumber)) sixNumber = random.randint(1, 49) tempNumber.append(self.checkNumber(sixNumber, tempNumber)) tempNumber.sort() self.randNumber = tempNumber
Tak teraz będziemy losować numery lotto.
Wróćmy w tym momencie do głównej części naszego programu.
Dopiszmy w dalszych liniach kodu pętle While i zapytajmy się w niej o ilość kuponów jakąś użytkownik chce posłać w losowaniu lotto. Dodatkowo sprawdźmy za pomocą try czy podana wartość przez użytkownika jest typu int, w przeciwnym wypadku, zapytamy ponownie, tak długo, aż użytkownik poda int
userCountDraw = '' while True: try: int(userCountDraw) break except ValueError: userCountDraw = input("Podaj ilość kuponów jaką chcesz wysłać w lotto: ")
Za pierwszym razem userCountDraw nie będzie typu int, więc automatycznie przejdziemy do except. Tam zapytamy o podanie ilości kuponów, po wprowadzeniu wartości przez użytkownika, pętla wykona się ponownie. Przerywamy ją tylko w sytuacji gdy wartość będzie typu int.
Przekazujemy wartość userCountDraw do nowej metody draw wewnątrz głównej klasy naszego programu. Ale o tym będzie następny wpis.