Program wyświetlający dni tygodnia.

Program wyświetlający dni tygodnia.
PG
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:26
0

Cześć mam takie pytanko.
Mam zrobić programik w ramach ćwiczeń , który poprosi użytkownika o wprowadzenie danych od 1 do 7 i wyświetli odpowiednie dni tygodnia przypisane do wartości. Natomiast, gdy dana liczba jest poza zakresem ma dać błąd podejrzewam, że ma być to błąd typu value error.

Jednak jakoś kod, który utworzyłem nie chce mi dać błędu automatycznie gdy wpiszę liczbę z poza zakresu

Kopiuj
week = range(1,7)
week = int(input("Wprowadz dane z przedziału od 1 do 7"))

day1="Poniedziałek"
day2 = "Wtorek"
day3 = "Sroda"
day4 = "Czwartek"
day5 = "Piątek"
day6 = "Sobota"
day7 =  "Niedziela"

if week ==1:
 print(day1)
elif week ==2:
 print(day2)
if week ==3:
 print(day3)
elif week ==4:
 print(day4)
if week ==5:
 print(day5)
elif week ==6:
 print(day6)
if week==7:
 print(day7)
else:
 if week >=8:
  print(ValueError, "Liczba poza zakresem")

Czy jest to bardzo dużym "niedbalstwem" i złą praktyką w przypadku, gdy osoba bardzo początkująca w trakcie nauki narzuci programowi, aby wyświetlił dany komunikat błędu i czy dobry wybrałem komunikat błędu wydaje mi się ,że tak ale nie jestem pewien no i ewentualnie proszę o podpowiedź dlaczego program z automatu nie daje mi komunikatu błędu po wpisaniu liczby z poza zakresu ? Z góry proszę o wyrozumiałość i proszę o pomoc.

Pozdrawiam wszystkich i życzę miłego dnia

edytowany 3x, ostatnio: cerrato
Zbigniew Skoczkowski
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:10
0

Idąc bardzo Twoją ścieżką ja bym to napisał tak:

Kopiuj
 if week == 1:
        print(day1)
    elif week == 2:
        print(day2)
    elif week == 3:
        print(day3)
    elif week == 4:
        print(day4)
    elif week == 5:
        print(day5)
    elif week == 6:
        print(day6)
    elif week == 7:
        print(day7)
    else: # else ponieważ user może wprowadzić nie tylko liczby większe równe 8 ale również np -1, a else też to obsłuzy
        print("Liczba poza zakresem (1-7)") 

If stosujemy raz, potem już tylko elif aż do else które obsługuje wszystkie pozostałeprzypadki, no chyba że zagnieżdżamy, to wtedy dopiero od nowa if (czyli cos takiego:

Kopiuj
 if week == 1:
        print(day1)
    elif week == 2:
        print(day2)
    elif week == 3:
        print(day3)
**        if cos tam == costam:...**
)

week = range(1,7) - to raczej nie jest Ci do niczego potrzebne
Co do typu błędu, nie spotkałem sie żeby coś takiego pisać
Pozdrawiam
Też sie uczę.
Ze swojej strony - ja bym to wsadził w pętle wtedy user mógłby pytać o dzien kilka razy bez ponownego uruchamiania i dodał jakies prosciutkie menu:

Kopiuj
day1 = "\nPoniedziałek"
day2 = "\nWtorek"
day3 = "\nSroda"
day4 = "\nCzwartek"
day5 = "\nPiątek"
day6 = "\nSobota"
day7 = "\nNiedziela"

week = None

while week != 0:
    print(
        """
    Dni tygodnia
    0 - Zamknij
    1 - Wybierz dzien tyg do wyswietlenia
    """
    )
    week = int(input("Wprowadz dane z przedziału od 1 do 7: "))
    if week == 1:
        print(day1)
    elif week == 2:
        print(day2)
    elif week == 3:
        print(day3)
    elif week == 4:
        print(day4)
    elif week == 5:
        print(day5)
    elif week == 6:
        print(day6)
    elif week == 7:
        print(day7)
    elif week == 0:
        break
    else:
        print("Liczba poza zakresem (1-7)")
edytowany 2x, ostatnio: cerrato
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 godziny
  • Postów:4928
0

ValueError, to błąd, który spowoduje wyjątek, gdy podasz złą wartość do funkcji int, np. float; a Chcesz tylko sprawdzić zakres integera, if się nada, bardziej zwięźle:

Kopiuj
day = int(input())
if day not in range(1, 8):
  print("...")

Zbigniew Skoczkowski
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:10
0

A tak z ciekawości... bo teraz jak patrze to zarówno mój else jak i kod lion137

Kopiuj
day = int(input())
if day not in range(1, 8):
  print("...")

działają poprawnie przy podaniu liczby spoza zakresu, a jak obsłużyć wprowadzenie innego typu danych jak np. float, albo string? Jest na to jakis prosty sposób?
Bo jak wpisałem litere albo float to wyskakuje:

Kopiuj
ValueError: invalid literal for int() with base 10: '5.5'
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 godziny
  • Postów:4928
1

a jak obsłużyć wprowadzenie innego typu danych jak np. float, albo string? Jest na to jakis prosty sposób?

Poczytaj o łapaniu wyjątków w Pythonie
https://pythonbasics.org/try-except/


Zbigniew Skoczkowski
W kodzie OP działa mi to bardzo dobrze, natomiast próbowałem zaimplementować u sb i mam dziwny przypadek - za pierwszym złym wpisaniem dobrze wyłapuje exception, ale za drugim złym wpisaniem wyskakuje cos takiego: During handling of the above exception, another exception occurred: Spotkałeś się z czymś takim? Na stackoverflow jest to opisane ale tam rozwiązaniem jest zmiana treści exceptiona a ja bym chciał żeby w pętli cały czas pytało o podanie liczby aż do jej podania. Będę wdzieczny za odp i z góry przepraszam za pytanie w nie swoim poście.
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
1

A nie prościej na słowniku?

Kopiuj
tydzien = {"1":"Poniedziałek", "2":"wtorek", "3":"Sroda", "4":"Czwartek", "5":"Piątek", "6":"Sobota", "7":"Niedziela"}
dzien = input("którzy?")
if dzien in tydzien:
    print(tydzien[dzien])
else:
    print("poza zakresem")
Zbigniew Skoczkowski
Wydaje mi się, że OP ma zadania związane z if/elife/else statements dlatego nie ma tam wspomnianych żadnych słownikówi stąd taki kod, ale Twój dużo lepszy
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 godziny
  • Postów:4928
0

@Zbigniew Skoczkowski: Muisz pokazać kod i wyjątek


Zbigniew Skoczkowski
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:10
0

@lion137:
Funkcja:

Kopiuj
def ask_number(question, low, high):
    """
    Asks about the number of winners, if the user enters a number out of range, asks again.
    :param question: Enter a question about the number of winners to draw, add information about the established range
    :param low: the minimum number in the established range
    :param high: the maximum number in the established range
    :return: number of winners to draw from the established range, chosen in the console by the user.
    """
    try:
        response = None
        while response not in range(low, high):
            response = int(input(question))
    except ValueError:
        while response not in range(low, high):
            response = int(input(question))
    return response

Wyjatek:

Kopiuj
Traceback (most recent call last):
  File "E:\Python\Upskill UPS016\Skrypt_venv\Questions.py", line 26, in ask_number
    while response not in range(low, high):
ValueError: invalid literal for int() with base 10: 'g'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:/Python/Upskill UPS016/Skrypt_venv/Lottery_Script.py", line 72, in <module>
    main_menu()
  File "E:/Python/Upskill UPS016/Skrypt_venv/Lottery_Script.py", line 37, in main_menu
    load_json_wow()
  File "E:\Python\Upskill UPS016\Skrypt_venv\Files.py", line 19, in load_json_wow
    winner = ask_number("Choose the number of winners (1 - 5):", 1, 6)
  File "E:\Python\Upskill UPS016\Skrypt_venv\Questions.py", line 29, in ask_number
ValueError: invalid literal for int() with base 10: 'g'
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 16 godzin
  • Postów:156
1

Spróbuj tak:

Kopiuj
def ask_number(question, low, high):
    response = None

    while response not in range(low, high):
        try:
            response = int(input(question))
        except ValueError:
            print("Wprowadzono nieprawidłową wartość. Spróbuj ponownie.")
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 godziny
  • Postów:4928
1

Dla mnie to trochę hack i napisy można poprawić, ale chyba robi co Chcesz.

Kopiuj
def get_day():
  try:
    while True:
      day = int(input("Enter day\n"))
      if day not in range(1, 8):
        print("Error not a day of the week\n")
      else:
        return day
  except ValueError:
    while True:
      try: 
        day = int(input("Enter day\n"))
        if day not in range(1, 8):
          print("Error not a day of the week\n")
        return day
      except ValueError:
        pass

@Dżery None not in range(low, high), jak myślisz, co to zwróci? A None not in range(10**100)?


Zbigniew Skoczkowski
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:10
0

Super dziękuję bardzo. Z tego co widzę oba Wasze rozwiązania działają dobrze, natomiast kod Dżerego jest prostszy to na nim się oparłem.
Kod lion137 przerobiłem na:

Kopiuj
    try:
        while True:
            response = int(input(question))
            if response not in range(low, high):
                print("Wrong number")
            else:
                return response
    except ValueError:
        while True:
            try:
                response = int(input(question))
                if response not in range(low, high):
                    print("Wrong number")
                else:
                    return response
            except ValueError:
                pass

i również działa.
Ostatecznie napisałem tak:

Kopiuj
def ask_number(question, low, high):
    """
    Asks about the number of winners, if the user enters a number out of range, asks again.
    :param question: Enter a question about the number of winners to draw, add information about the established range
    :param low: the minimum number in the established range
    :param high: the maximum number in the established range
    :return: number of winners to draw from the established range, chosen in the console by the user.
    """
    response = None
    while response not in range(low, high):
        try:
            response = int(input(question))
            if response not in range(low, high):
                print("\nThe number out of range! Choose the number within the range, please.\n")
        except ValueError:
            print("\nEnter the number(int)! Remember it must be within the range.\n")
    return response
edytowany 1x, ostatnio: Zbigniew Skoczkowski
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 16 godzin
  • Postów:156
0
lion137 napisał(a):

@Dżery None not in range(low, high), jak myślisz, co to zwróci? A None not in range(10**100)?

słuszna uwaga, jeśli to ma być ogólna funkcja, to range(low, high) zdecydowanie nie jest dobrym pomysłem

Zbigniew Skoczkowski
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:10
0

@Dżery: Mogę dopytać czemu? Bo chyba nie rozumiem. Funkcja - w swoim założeniu - nie miała być bardzo uniwersalna, ale potrzebuję ją wywołać 4-krotnie z takimi samymi parametrami.

  • Rejestracja:ponad 8 lat
  • Ostatnio:około 16 godzin
  • Postów:156
0

chodzi o to, że w obecnej wersji funkcja ask_number będzie działać przy małych zakresach, np. w przypadku dni tygodnia będzie ok, jednak jeśli ktoś chciałby użyć jej użyć dla dowolnych wartości parametrów 'low' i 'high', np. ask_number(1, 10**9), to jej wykonanie potrwa bardzo długo.
Przyczyną jest użycie range(), która działa różnie w zależności od wersji:
w Python 2 zwraca listę liczb z całego zakresu; w Pythonie 3 oblicza na bieżąco;
ponieważ jednak masz

Kopiuj
response = None

więc pierwsze sprawdzenie w pętli while będzie i tak po całym zakresie.
Na koniec wersja bez range(), tak, dla porównania:

Kopiuj
def ask_number(question, low, high):
    while 1:
        try:
            response = int(input(question))
            if response >= low and response < high:
                return response
            else:
                print("\nThe number out of range! Choose the number within the range, please.\n")
        except ValueError:
                print("\nEnter the number(int)! Remember it must be within the range.\n")

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.