Kalkulator wieku - prośba o ocenę kodu

0

Prosiłbym o ocenę kodu, każda uwaga będzie dla mnie bardzo ważna, ponieważ w końcu postanowiłem i chcę zacząć pisać linijki kodu

https://github.com/luki783/calculator

2

Ty chyba sobie jaja robisz :D

1

168 ifów, tóż to nowy rekord guinessa!

0
Czarny Karp napisał(a):

Ty chyba sobie jaja robisz :D
168 ifów, tóż to nowy rekord guinessa!

A tak trochę jaśniej można by było?

1

Doszedłeś już do pętli?

4

Ten kod powinno się wrzucać każdemu, kto twierdzi naiwnie, że kod w Pythonie musi być ładny, bo jak widać, może być również bardzo brzydki. Ale cóż...

Pomyśl nad tym, czy istnieje wzór matematyczny, za pomocą którego możesz przeliczyć wiek kota na wiek człowieka (rozumiem, że to tylko taka zabawa z tym przeliczaniem?)
Próbowałem się domyślić czy to jakoś mnożysz czy dodajesz, ale nie widzę tu jasnej zasady.

Jeśli więc nie ma wzoru i faktycznie musisz przemapować każdą liczbę na inną liczbę, w Pythonie możesz to łatwo zrobić za pomocą tzw. słownika:

cat_age_to_human_age = {1:7, 2: 13, 3: 20, 4: 26, ...I TUTAJ DALEJ SOBIE MAPUJESZ LICZBY

albo tak

cat_age_to_human_age = {
  1:7, 
  2: 13, 
  3: 20, 
  4: 26, 
  # (kazda para w nowej linijce dla lepszej czytelnosci)

i potem zamiast ifów po prostu sobie wydobędziesz ze słownika liczbę coś w tym stylu:

age = cat_age_to_human_age[answer_cat]
print("Your cat's age in human years is " + str(age))

i to samo z wiekiem psa. I logika się powinna skrócić z 500 linijek do około 10 (słowników z danymi nie liczę już - te w zasadzie należałoby by trzymać w osobnym pliku, żeby było bardziej elegancko, i importować).

3

Tam nawet miejsca na pętlę nie ma, tlyko na używanie mózgu a nie ctrl+c i ctrl+v.
Podpowiem że ten kod można napisać w 10 linijkach tak na oko z jednym ifem, kot czy pies.

0

Aaaa! Popatrzylem na to!:)

0

Ja nawet podpowiem, że nie trzeba żadnego ifa zamiast twoich 3000 ifow elifow itp :P
Jak się wczyta słownik z osobnego pliku no to będzie 8 linijek

print("Welcome to the age calculator! \n")
print("What animal do you choose?")

animal = str(input("Cat or dog? ")).lower()
age = input("How old is your animal? ")

def animalAge(age,animal):
    animals = {
        'cat': {
            '1': 7,
            '2': 13,
            '3': 20,
            '4': 26
        },
        'dog': {

        }
    }
    animal_age = animals.get(str(animal)).get(str(age))
    print(animal_age)

animalAge(age,animal)

0
LukeJL napisał(a):

Ten kod powinno się wrzucać każdemu, kto twierdzi naiwnie, że kod w Pythonie musi być ładny, bo jak widać, może być również bardzo brzydki. Ale cóż...

Pomyśl nad tym, czy istnieje wzór matematyczny, za pomocą którego możesz przeliczyć wiek kota na wiek człowieka (rozumiem, że to tylko taka zabawa z tym przeliczaniem?)
Próbowałem się domyślić czy to jakoś mnożysz czy dodajesz, ale nie widzę tu jasnej zasady.

Jeśli więc nie ma wzoru i faktycznie musisz przemapować każdą liczbę na inną liczbę, w Pythonie możesz to łatwo zrobić za pomocą tzw. słownika:

Dane pobrałem kolejno ze stron http://www.catyearschart.com/ oraz http://www.dogyearschart.com/ i ciężko znaleźć tu jakąś zależność, szczególnie dla psów, których wiek jest uzależniony również od ich wielkości (masy).

Jak rozumiem kod jest całkowicie bezużyteczny w takiej formie i popełniłem dużo za dużo ifów, które można zastąpić słownikami, które w ogóle nie powinny znaleźć się w tym pliku?

0

Ślepawy jestem, ale na moje oko wedle tej rozpiski przy tych kotach chyba wychodzi tak:
wiek kota od 1 do 5:
ludzki wiek = 7 x wiek kota - wiek kota : 2 (część całkowita, bez reszty)
dalej +/- tak
dla wiek kota = 6:
40 // bardziej po ludzku ludzki wiek (6) = 40
wiek kota > 6 :
ludzki wiek(wiek kota - 1) + 4 ew. 40 + (wiek kota - 6) x 4

Może się mylę, ale to chyba trochę skróci kod.

0

Dupa kupa, klocków kupa

def gen(tab):
  zzz = len(tab)-1
  for i in tab:
    yield i
  while(True):
    yield tab[zzz]

def zero(*dupa):
  return 0

def dupa(gen, zug, x):
  return next(gen) + zug[not x](gen, zug, x-1)

def main():
  x = int(input("cat: "))
  tab = [7,6,7,6,7,7,4]
  zug = [dupa, zero]
  if(x>0):
    y = dupa(gen(tab), zug, x-1) 
  else:
    y = 0

  print("cat: ", y)

if __name__ == "__main__":
  main()
3

Bardzo czytelny, samodokumentujący się kod.

4

przynajmniej nie pchał na siłe wzorców projektowych

0

Wzorców nie ale za to jest elegancka ilustracja zastosowania KISS w praktyce.

0

Gratuluję samozaparcia

0

Biorąc pod uwagę, że i tak to jest mocno orientacyjne i IMHO bezwartościowe przeliczanie wieku ludzkiego na "psi" i "koci" to zamiast na sztywno upadlać się ifami na 500 linijek można dopasować funkcję liniową opisującą zjawisko.


from math import round

def wiekPsi(n):
  return round(4.434*n + 7.749)

def wiekKoci(n):
  return round((4.434*n + 7.749)) # do policzenia
  
def wiek(animal, age):
    switcher = {
        "cat": wiekPsi(age),
        "dog": wiekKoci(age),
    }
    return switcher.get(animal, "Choose proper animal.")

print("Welcome to the age calculator!\n")
animal = str(input("What animal do you choose?")).lower()
age = int(input("Age of animal?"))
print(wiek(animal, age))

1 użytkowników online, w tym zalogowanych: 0, gości: 1