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:minuta
  • Postów:4888
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:minuta
  • Postów:4888
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 5 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:minuta
  • Postów:4888
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 18 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:minuta
  • Postów:4888
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 18 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 18 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")
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)