Program wyświetlający dni tygodnia.

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

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

0

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

 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:

 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:

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

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

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

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:

ValueError: invalid literal for int() with base 10: '5.5'
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/

1

A nie prościej na słowniku?

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

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

0

@lion137:
Funkcja:

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:

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'
1

Spróbuj tak:

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.")
1

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

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

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:

    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:

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

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.

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

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:

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

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