Kolejne zadanie do rozwiązania_[try, except]

0

Witam wszystkich.

Uczę się Pythona od niedawna. Korzystam z kursów na Udemy, Książek i zasobów Internetu.
Przy okazji dużo pracuję, więc traktuję to na razie hobbystycznie.

W jednej z książek znalazłem zadanie:

Ćwiczenie 1. Napisz program, który odczytuje liczby tak długo, aż użytkownik
wprowadzi „gotowe”. Po wpisaniu „gotowe” wydrukuj sumę, ile wprowadzono liczb
oraz średnia z tych liczb. Jeśli użytkownik wprowadzi cos innego niż liczba, wykryj
jego błąd, używając try i except, wypisz komunikat o błędzie oraz przejdź do
następnej liczby.

[tak ma wyglądać przykładowe rozwiązanie]
Wprowadź liczbę: 4
Wprowadź liczbę: 5
Wprowadź liczbę: złe dane
Nieprawidłowe wejście
Wprowadź liczbę: 7
Wprowadź liczbę: gotowe
16 3 5.333333333333333

Niestety, potrafię zrobić tylko tyle:

lista = []
while True:
    try:
        x = int(input('Wprowadź liczbę: '))
        lista.append(x)
        continue
    except ValueError:
        print('Oops, nie wprowadziłeś liczby. Kończymy.')
        break

x = sum(lista)
y = len(lista)
srednia = round((x/y), 2)
print('Podałeś następujące liczby:', lista,'Średnia podanych liczb, to:', srednia)

Próbowałem dodawać if i else, zmienną x wystawiać przed try, ale nie wychodzi mi dodanie działającej instrukcji, która po wpisaniu 'gotowe' zrobi to, co robi teraz except ValueError. Szukałem na necie, ale nie znalazłem czegoś, co mogłoby mi pomóc, albo co mógłbym zrozumieć, aby wykonać to zadanie.
Oczywiście, oprócz rozwiązania, prosiłbym też o krótkie wyjaśnienie rozwiązania. Wszelka konstruktywna krytyka mile widziana :)
Dziękuję.

1

A gdzie masz sprawdzenie, czy user wprowadzi, gotowe? Po co to continue? Także zrefaktoruj to zgodnie z wymaganiami zadania, i zobaczymy...

0

Nie możesz konwertować wprowadzonych znaków od razu na liczbę, odczytuj to co wpisze użytkownik, potem sprawdzaj czy jest to "gotowe", dopiero potem konwertuj na liczbę.

3

cos takiego

lista = []
data = None
while data != "gotowe":
    try:
        data = input("podaj liczbe albo napisz 'gotowe'")
        data = int(data)
        lista.append(data)
    except Exception as e:
        pass

print("suma:{0}, liczba:{1}, srednia:{2}".format(sum(lista),
                                                 len(lista),
                                                 sum(lista)/len(lista) if len(lista) > 0 else 0))

Maly edit :D

0

@Arthan: Cześć. No właśnie zastanawiałem się skąd to wynika. Wiesz, podczas nauki czytasz różne rzeczy, np. o tym, aby kod programu był zwięzły i myślisz sobie, że taka konwersja trochę go uszczupla. Czy mógłbyś mi wytłumaczyć, kiedy konwertujemy od razu, a kiedy robimy to w sposób, jaki pokazał ***ledi12 ***? To jest jakiś standard czy chodzi o czytelność kodu, a może to jeszcze coś innego.

1

To działa podobnie jak w przypadku zwykłych równań matematycznych ... to co w nawiasie wykonywane jest najpierw. W przypadku konstrukcji: "x = int(input('Wprowadź liczbę: '))", najpierw wykonasz input, potem konwersję na int, a potem przypisanie. Co jeśli użytkownik nie poda liczby? Wywali się na konwersji i nie wykona się przypisanie, zmienna "x" w ogóle się nie utworzy, a kod przejdzie do bloku except. Nie masz w takim przypadku możliwości sprawdzenia jaki tekst podał użytkownik. Jednak jeśli robisz najpierw x = input() to do x wpadnie to co podał użytkownik jako tekst, a potem dopiero próbujesz zrobić konwersję, jeśli się nie uda to i tak w x pozostanie tekst zamiast liczby.

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