Zanim przejdziemy do Lekcji 3 – formatowanie napisów, małe przypomnienie z poprzedniego posta.
Ostatnie zadanie z obliczaniem BMI, mogło wyglądać tak:
Zresztą Twój kod nie musi być taki sam jak na screenie (pliki znajdziesz w poprzednim wpisie i na Githubie), najważniejsze by skrypt prawidłowo zwracał obliczone BMI 😉
No właśnie, wynik BMI wyświetlany jest w raczej niezbyt przyjaznej formie. Bardzo dużo miejsc po przecinku sprawia, że wynik jest nieczytelny.
Zaokrąglenie liczb w Pythonie możemy wykonać na kilka sposobów 😌 Rzuć okiem na to:
print("Twoje BMI wynosi %f." % BMI)
Twoje BMI wynosi 20.703125
>>>
print("Twoje BMI wynosi {:f}".format(BMI))
Twoje BMI wynosi 20.703125
>>>
print("Twoje BMI wynosi", round(BMI,6))
Twoje BMI wynosi 20.703125
Dwa pierwsze przykłady przedstawiają zaokrąglenie za pomocą formatowania łańcuchów znaków (stringów), natomiast trzeci wykorzystuje funkcję round(), aby zaokrąglić zmienną BMI do 6 miejsc.
Jeśli Python nie jest Twoim pierwszym język programowania, to prawdopodobnie kojarzysz więcej typów liczbowych – np. int, long, float, double.
Jeśli nie, to w skrócie: long – oznacza dużą liczbę całkowitą, a double – liczbę o większej dokładności „po przecinku”. Pozbywam się tutaj całej teorii jak liczby są przechowywane w pamięci komputera (tabelkę z wielkością i zakresami znajdziesz tutaj), ale ta teoria nie jest programiście zbyt często w życiu potrzebna.
Z tego założenia wyszli też twórcy Pythona – interpreter martwi się o to za Ciebie. Jeśli Twój int będzie za duży automatycznie wejdzie w zakres liczby long, natomiast liczby zmiennoprzecinkowe mają domyślną precyzję typu double. Spójrz na swoje BMI zostało zwrócone, aż do 15 miejsca po przecinku, dopiero Ty nakazujesz Pythonowi „weź to pokaż jako float”. Float „ma” na liczby po przecinku przeznaczone 6 miejsc. Oczywiście, możemy to ładniej przedstawić i o tym za chwilę 😉
Formatowanie stringów w Pythonie
Wyświetlanie różnych wartości wewnątrz napisów to całkiem przydatna sprawa, jednak dokumentacja zarówno starego (wywodzącego się z Pythona 2.x), jak i nowego (od Pythona 3) stylu formatowania jest dość ciężka w lekturze, dlatego najlepiej zaprezentować ją w przykładach.
Co to znaczy formatowanie stringów / napisów / łańcuchów znaków?
To nic innego jak umieszczenie wewnątrz napisu treści, którą podamy jako listę argumentów (konkretnie jako krotkę, ale o krotkach będzie trochę później 🙂 ).
W przykładzie z BMI podajemy do funkcji print() wartość liczbową, a jednocześnie informujemy przez %f czy też {:f} – „w to miejsce wstaw liczbę float”.
Odpal konsolę i sprawdzimy inne przykłady – starym i nowym sposobem:
Stary:
print("1 po angielsku: %s \n2 po angielsku: %s" % ('one', 'two'))
Nowy:
print("1 po angielsku: {} \n2 po angielsku: {}".format('one', 'two'))
Wynik w obu wypadkach otrzymujemy taki sam:
2 po angielsku: two
Powyższe wyrażenia mogą wydawać się skomplikowane, ale zaraz wszystko będzie oczywiste. Tekst jest bardzo prosty, chcemy wyświetlić 1 i 2 po angielsku, rozdzielamy je za pomocą \n – znaku nowej linii (znaki specjalne znasz z jednego z poprzednich wpisów).
Spójrz – w pierwszym wypadku wystąpienie %s wymusza, by to miejsce zastąpić innym napisem (s = string). Mamy dwa wystąpienia %s i dwa argumenty „jeden” i „dwa”, które umieszczamy po kolei wewnątrz napisu. Nasz napis i argumenty łączymy za pomocą znaku %.
W nowym formatowaniu miejsca oznaczamy przez klamry {}, a napis i argumenty łączymy przez .format().
Liczby
– całkowite:
Stary:
print("Cyfra %d poprzedza %d" % (7, 8))
Cyfra 7 poprzedza 8
Nowy:
print("Cyfra {} poprzedza {}".format(7,8))
Cyfra 7 poprzedza 8
– zmiennoprzecinkowe:
Stary:
print("Rekord świata na 100m to %f ustanowił go %s" % (9.58, 'Usain Bolt'))
Rekord świata na 100m to 9.580000 ustanowił go Usain Bolt
Nowy:
print("Rekord świata na 100m to {} ustanowił go {}".format(9.58, 'Usain Bolt'))
Rekord świata na 100m to 9.58 ustanowił go Usain Bolt
No nie! Co to ma być! Przecież jeszcze przed chwilą użyliśmy {:f}, a teraz wystarczą same klamry {}, aby za pomocą nowej metody wyświetlić zawartość float’a!
Jest to całkiem słuszne oburzenie.
Przy wyświetlaniu wg nowego formatowanie, nie jest nam konieczne :f wewnątrz nawiasów {}, ale jest to informacja, dzięki której płynnie przejdziemy do zaokrąglania:
Stary:
print("Rekord świata na 100m to %.2f ustanowił go %s" % (9.5877, 'Usain Bolt'))
Rekord świata na 100m to 9.58 ustanowił go Usain Bolt
Nowy:
print("Rekord świata na 100m to {:.2f} ustanowił go {}".format(9.5877, 'Usain Bolt'))
Rekord świata na 100m to 9.58 ustanowił go Usain Bolt
Gdy przed f, wstawiamy modyfikator .2 nakazujemy Pythonowi zaokrąglić wynik do dwóch miejsc po przecinku. Analogicznie zadziała zaokrąglenie do 1 miejsca:
Stary:
print("Rekord świata na 100m padł %s i wynosi poniżej %.1f sekund - wow!" % ('16 sierpnia 2009', 9.58))
Rekord świata na 100m padł 16 sierpnia 2009 i wynosi poniżej 9.6 sekund – wow!
Nowy:
print("Rekord świata na 100m padł {} i wynosi poniżej {:.1f} sekund - wow!".format('16 sierpnia 2009', 9.58))
Rekord świata na 100m padł 16 sierpnia 2009 i wynosi poniżej 9.6 sekund – wow!
Co więcej możemy przewidzieć ile znaków na zapisanie wyrażenia chcemy przeznaczyć.
Utwórz plik, skopiuj i uruchom poniższy skrypt (jeśli korzystasz z IDLE Pythona wystarczy, że wybierzesz Run lub wciśniesz F5, możesz uruchomić z konsoli, jak ja na poniższym screenie)
szer = 42
print("-" * szer)
print("| Czas | Zawodnik | Data |")
print("*" * szer)
print("| %6.3f | %16s | %10s |" % (9.58, "Usain Bolt", "16.08.2009"))
print("| %6.3f | %16s | %10s |" % (9.69, "Tyson Gay", "20.09.2009"))
print("| %6.3f | %16s | %10s |" % (9.69, "Yohan Blake", "23.09.2012"))
print("| %6.3f | %16s | %10s |" % (9.74, "Asafa Powell", "2.09.2008"))
print("-" * szer)
Ten zapis „mówi” Pythonowi:
%6.3f – przeznacz 6 znaków na zapisanie liczby zmiennoprzecinkowej, z czego 3 będą po kropce
%16s – przeznacz 16 znaków na zapisanie string’a
%10s – przeznacz 10 znaków na zapisanie string’a
szer – całkowita szerokość mojej tabeli to 42 znaki:
- 2 znaki | – budujące tabelę,
- po 2 znaki spacji z każdej strony wyświetlanej wartości
- znaki przeznaczone na wyświetlanie wartości, które wynikają z powyższego zapisu (6 + 16 + 10).
A jak ten skrypt będzie wyglądał dla nowego formatowania stringów?
szer = 42
print("-" * szer)
print("| Czas | Zawodnik | Data |")
print("*" * szer)
print("| {:6.3f} | {:16s} | {:10s} |" .format(9.58, "Usain Bolt", "16.08.2009"))
print("| {:6.3f} | {:16s} | {:10s} |" .format(9.69, "Tyson Gay", "20.09.2009"))
print("| {:6.3f} | {:16s} | {:10s} |" .format(9.69, "Yohan Blake", "23.09.2012"))
print("| {:6.3f} | {:16s} | {:10s} |" .format(9.74, "Asafa Powell", "2.09.2008"))
print("-" * szer)
Formatowanie, działa analogicznie, z drobnym wyjątkiem.
Czy widzisz różnicę?
W starym formatowaniu, gdy mamy nadmiar wolnych znaków w stringu, spacje wstawiane są od lewej strony, czyli „przed” napisem.
W nowym formatowaniu puste znaki trafiają na koniec, czyli w sposób bardziej dla nas intuicyjny.
Oczywiście w starym formatowaniu, problem ten można rozwiązać. Spróbuj podmienić tylko jedną linijkę w pierwszej tabeli i zobacz co się stanie:
print("| %6.3f | %-16s | %-10s |" % (9.58, "Usain Bolt", "16.08.2009"))
Mimo, że napisy wyświetlają się inaczej w starej i nowej metodzie, to %6.3f i {:6.3f} dają dokładnie ten sam efekt.
Żeby to zrozumieć zmień %6.3f na %06.3f, a w drugim wypadku {:6.3f} na {:6.3f}.
Możesz też sprawdzić jak się zmieni wyświetlanie, gdy zamiast zaokrąglać do 3 miejsc po przecinku będziesz zakrąglać do 2 lub tylko 1:
print("| %06.1f | %16s | %10s |" % (9.58, "Usain Bolt", "16.08.2009"))
Jeśli kopiując i zmieniając te napisy myślisz „oh dżizas, jakie to nudneeeee!”, to przyznam Ci rację 😀
ALE:
– warto wiedzieć, że coś takiego istnieje
– właściwie nie musisz umieć tego na pamięć
– szczerze nie pamiętam kiedy tego w życiu użyłam, ale byłabym nie fair wobec Ciebie nie pokazując Ci, że w ten sposób możesz formatować napisy
Przyjrzyj się jeszcze poniższemu skryptowi:
waluta = "dolar"
us = 1
pln = 4.08234915
print("Aktualnie %d %s kosztuje %.2f zł" % (us, waluta, pln))
Czy umiesz przepisać go za pomocą nowego formatowania?
Zamień ostatnią linijkę mojego skryptu na:
print("Aktualnie %r %r kosztuje %r zł" % (us, waluta, pln))
Teraz w miejscu %r wyświetla się dokładnie to samo co zawiera zmienna, nieważne co to jest.
Zamiana miejscami
Jeszcze jeden drobiazg, którego nie ma w starej metodzie, a może Ci się spodobać. Sprawdź w konsoli:
"{} ma {}".format("Ala", "kota")
Ala ma kota
>>>
"{1} ma {0}".format("Ala", "kota")
kota ma Ala
Elementy są numerowane od 0, dlatego Ala jest domyślnie na pozycji 0 a kot na pozycji 1 – podając pozycje w nawiasach możesz dowolnie zmieniać kolejność wyświetlania.
"{} {} {} {}".format("truskawka", "13", "1.5","herbata")
truskawka 13 1.5 herbata
>>>
"{3} {2} {1} {0}".format("truskawka", "13", "1.5","herbata")
herbata 1.5 13 truskawka
>>>
"{1} {3} {3} {2} {0}".format("truskawka", "13", "1.5","herbata")
13 herbata herbata 1.5 truskawka
PODSUMOWANIE:
Dla starego formatowania wystąpienie, które ma zostać zastąpione przez:
- napis oznaczamy: %s (s – string)
- liczbę całkowitą oznaczamy: %d (d – digit)
- liczbę zmiennoprzecinkową: %f (f – float)
- dowolną wartość: %r (r – raw)
np. "Moja %s o wadze %dg ma ok. %d kcal i %.1f węglowodanów" % ("czekolada", 100, 545, 58.5)
Używając nowego formatowania, nie musimy wiedzieć, co będzie wyświetlane wystarczy umieścić nawiasy klamrowe {}.
np. "Moja {} o wadze {}g ma ok. {} kcal i {:.1f} węglowodanów".format("czekolada", 100, 545, 58.5)
Więcej o formatowaniu napisów, bardzo przystępnie pokazanych znajdziesz tutaj: pyFormat.info
Spróbujmy zrobić jakieś praktyczne zadania 😉
Zadanie 1 – konwerter jednostek
Utwórz nowy plik np. jednostki.py, który po podaniu przez użytkownika długości w cm będzie wyświetlał wynik w metrach i calach zaokrąglając do 4 miejsc po przecinku.
Podobny skrypt możesz wykonać dla zamiany kg na funty.
Wynik wyświetl używając dowolnego sposobu formatowania tekstu.
Zadanie 2 – lokata
Napisz skrypt, który, który obliczy stan konta za kilka lat. Program pyta użytkownika o:
- stan początkowy konta,
- stopę oprocentowania rocznego (zwróć uwagę, że odsetki podlegają miesięcznej kapitalizacji)
- liczbę lat na lokacie.
Wynik wyświetl jako zdanie używając dowolnego sposobu formatowania tekstu. Wypisz np. takie zdanie:
Twoje *stan_początkowy* zł przez *czas* lata na lokacie *oprocentowanie* % urośnie do *wynik*.
Zadania z rozwiązaniem dostępne na githubie – Lekcja 3.
Daj znać czy któraś metoda formatowania wydaje Ci się przyjemniejsza? 🙂
(Na podstawie dotychczasowych wpisów możesz też wyświetlić wyniki tych zadań zupełnie bez formatowania, ale wtedy nie przećwiczysz dzisiejszej lekcji.)
Dobre pytanie 😀 Odpowiedź będzie odwrotna – jestem nieludzka, bo katowałam Cię nową metodą, gdy większość kursów programowania w Pythonie nawet 3.x wciąż podaje tylko starszą metodę.
Właśnie dlatego, gdy je zobaczysz w cudzym kodzie będziesz wiedzieć co to jest i jak tego używać. Możliwe też, że formatowanie tekstu nie będzie Ci potrzebne, a po tej lekcji po prostu o nim zapomnisz – ok, rozumiem, ale nie powiesz mi, że nie ostrzegałam 😉
Ten wpis jest częścią cyklu: Python kurs od podstaw
Zadania zrobione. Bardzo dziękuję 🙂
Mam problem z wyświetleniem wyniku w zdaniu z zadania na lokatę: gdy dodaję „%” jako oznaczenie wartości lokaty, wyrzuca mi błąd. Gdy próbuje wprowadzić jako % tak samo: za mało argumentów dla formatu string. Jak mozna to obejsc?
Hej, podeślij mi może przez fb linijkę 😀
Sprawdź wszystkie cudzysłowy i nawiasy –
starym formatowaniem ogólnie powinnaś mieć „jakaś treść %wartosc jakas tresc” % (co_wyswietlasz)
w momencie, gdy używasz print() – pojawiają się dodatkowe nawiasy.
Więc print(„jakaś treść %wartosc jakas tresc” % (co_wyswietlasz)) <- dwa nawiasy na końcu.
Może tu chowa się błąd, jak nie to najszybciej będzie rzucić okiem na kod 😀
https://www.facebook.com/flynerdpl/
Pół godziny życia stracone na próbie zapisania % jako zwykł znak, a wystarczyło zjechać na dół komentarzy…
😀
upsss 😀
Po prostu wartość procentową dziel przez „/ 100”, i później mnóż przez to.
Jak obiecałam nadrobiłam, ale bez powtórek się nie obędzie 😀 Czekam na kolejne lekcje <3
No i pięknie, już prawie napisałam zadanie, w którym trzeba było policzyć ile procen Pythona umie Joanka „bądź jak Joanka” – ale chyba ta seria żartów wszystkim się przejadła 😉
wpisuje ten kod:
waga = int(input(„podaj swoją wagę:”))
wzrost = int(input(„podaj swój wzrost:”))
BMI = waga / (wzrost ** 2)
print(„Twoje BMI wynosi: „,BMI)
kiedy wpisuję w wadze np: 1.75
wyskakuje mi:
Traceback (most recent call last):
File „C:/Users/Bartek/Desktop/nowy.py”, line 2, in
wzrost = int(input(„podaj swój wzrost:”))
ValueError: invalid literal for int() with base 10: '1.7′
a czy zamiast int nie powinieneś uzyć float? Int to liczba calkowita, a 1.75 nie jest liczba calkowita.
Hej, Twoje przykładowe rozwiązanie kalkulatora BMI ma chyba małego buga.
Przy pobieraniu wzrostu, aby kalkulator zadziałał z tym wzorem, musimy podać liczbę z kropką (w metrach)
Natomiast przy użyciu int(input()) wyświetli się nam błąd przy próbie wpisania liczby zmiennoprzecinkowej. Dlatego powinniśmy tutaj użyć float(input()) 🙂
rozwiązanie było wzorem i z tego co pamiętam celowo nie dałam go w wersji copy-paste 😉 ale cieszę się, że wpisałeś w komentarz, chyba kolejne zadania będę dawać na githubie z komentarzami w miejscu gdzie trzeba samodzielnie uzupełnić lub coś zmienić 😉
Hej, jest może opcja, żeby zmusić pythona do wyświetlania długich liczb z odstępami?
np. 58434682 -> 58 434 682 lub 58’434’682
przyjrzyj się:
print(„{:,d}”.format(58434682))
print(„{:,f}”.format(58434682))
print(„{:,}”.format(58434682))
następnie skorzystajmy z metody replace (zamieniamy przecinki dodane przez formatowanie na spacje)
print(„{:,}”.format(58434682).replace(„,”, ” „))
Zadanie nr 2 można nieco skomplikować 🙂
2.1 Pierwsze (to prostsze) to uwzględnienie podatku belki, które zżera nam 19% wypracowanego zysku z kapitału.
2.2 Drugie to uwzględnienie średniej inflacji przez okres lokaty – tak aby sprawdzić czy faktycznie zyskujemy czy może mimo wzrostu nominalnej wartości kapitału, tak naprawdę tracimy 😉 Dzięki temu możemy jaką będzie miał realną siłę nabywczą kapitał, który wypłacimy z lokaty.
Założenia:
— poziom inflacji jest w granicach celu NBP, czyli około 2.5%
— inflacja jest indeksowana raz do roku (przekładając na nasze „odsetki” naliczane są raz na rok)
Wiem lubię komplikować 🙂 Ale dzięki temu przykład staje się naprawdę praktyczny i przydatny.
Na Twoja prosbe stworzylem program z uwzglednieniem podatku belki, oraz inflacji, ktora mozna zmieniac.
Byc moze mozna zapisac kod krocej, lecz nie doszedlem jeszcze do tego jak – wazne, ze dziala 😉
start=float(input(„Stan początkowy konta:”))
stopa=float(input(„Stopa oprocentowania w %:”))
czas=int(input(„Okres lokaty w latach:”))
czas2= czas*12
tax=0.19
inflation=0.025
stopa2=stopa/100
wynik = start * ((1 + (stopa2/12)) ** (12*czas))
wynik2= (wynik-start)*tax
wynik3= (wynik-wynik2-start)*inflation
wynik4= wynik-wynik2-wynik3
wynik5= wynik4-start
print(„Twoje {:.0f} zł przez {} lata na lokacie {} % urośnie do {:.2f} zł.” .format(start, czas, stopa, wynik4))
print(„Twoj zysku w ciagu {} miesiecy bedzie wynosil: {:.2f} zl”.format(czas2,wynik5))
Fajne rozwiązanie 🙂 Mała sugestia, nadawaj zmiennym bardziej opisowe nazwy. Na przykład zamiast wynik2 lepiej brzmiało by podatekBelki, zamiast start – kapitalPoczatkowy, wynik5 – zyskNetto, – w ten sposób od razu wiem o czym ta muzyka 🙂
Dziekuje za trafna i cenna sugestie 😉
Wezme to pod uwage, aby jakos kodu byla zawsze lepsza. Obcuje z Pythonem dopiero tydzien, wiec dlatego tak to wyglada, oczywiscie moge poprawic, nie ma najmniejszego problemu.
Pozdrawiam,
Michal
Teraz widzę, że nic nie wiem 😀
Zadanie z liczenia kredytów nigdy nie było moim ulubionym. Układając je skorzystałam z podręcznika do matematyki (gimnazjum) i z proponowanych rozwiązań podręcznikowych. Możliwe, że coś z tego połknęłam. Samo zadanie nie jest zbyt jasne, twój opis – milion razy lepszy. Jeżeli nie masz nic przeciwko przy aktualizacji tego wpisu chętnie wkleję twoją propozycję u góry 🙂
Co do rozwiązania zadania z lokatą: w założeniach było, że kapitalizacja następuje co miesiąc, natomiast w rozwiązaniu nie ma tego uwzględnionego (co powoduję, że odsetki są źle liczone, w szczególności przy wyższym kapitale początkowym lub dłuższym okresie lokaty).
Tutaj moje rozwiązanie na githubie:
https://github.com/SebastianAdamek/lokaty
Co do treści merytorycznej, artykułu nie mogę się przyczepić – igła 🙂 Tak przy okazji zmotywowałaś mnie, żeby w końcu nauczyć się git i poszło mi to w jeden dzień 😀 THX
Witam, wydaje mi się, że Twoje rozwiązanie zadania 2 jest niepoprawne. Nie wykluczam, oczywiście opcji, że jestem w błędzie 😉
Napisałaś, że odsetki podlegają miesięcznej kapitalizacji, a nie uwzględniłaś tego w kodzie. Poniżej wstawiam kod, który moim zdaniem wskazuje prawidłowe rozwiązanie. Sprawdź to, proszę 😀
print(„Stan początkowy:”)
stanp=float(input())
print(„Stopa oprocentowania, w %:”)
stopa=float(input())
print(„Okres lokaty, w latach:”)
czas=int(input())
stopa2=stopa/100
wynik = stanp * ((1 + (stopa2/12)) ** (12*czas))
print(„Twoje {} zł przez {} lata na lokacie {} % urośnie do {:.2f} zł.” .format(stanp, czas, stopa, wynik))
W zadaniu 2 powiedziałaś o kapitalizacji i podatku dochodowym, to chyba powinno wyjść tak:
start = float(input(„Please provide your initial balance: „))
rate = float(input(„What is your yearly % rate gain: „))
period = int(input(„How many years will you keep the account: „))
rate2 = rate/100
end_b = (start*((1 + rate2 / 12)) ** 12 * period)
tax = (end_b – start)*19/100
end = end_b – tax
print(„Your initial {:.2f} will grow to {:.2f} in {} years including monthly capitalization and tax cut.”.format(start, end, period))
Mi wyszło coś takiego. Wynik zbliżony do tych, co pokazują kalkulatory online. Podejrzewam, że „groszowa” różnica to wina nieuwzględnienia inflacji ale to już dla mnie zbyt skomplikowane na ten moment, żeby się tym bawić 🙁 I tak się spociłam przy tym 😀
https://uploads.disquscdn.com/images/679941b9337ab382c4ec2927f13a23104a3fd7c8f65316f745d020face5cc342.png
Szacun. Po moim pierwszym starciu z tym zadaniem różnica między nami jest taka, że ja co prawda też się spociłem, ale do właściwego wzoru z uwzględnieniem miesięcznej kapitalizacji – nie doszedłem… Cieszę się, że jest tu podany. Nie pozostaje nic innego, jak przeanalizować i pojąć. I jest to jednak łatwiejsze do zapisania w Pythonie, niż pierwotnie – łamiąc sobie nad tym głowę – sądziłem.
lenght = float(input(’Podaj dlugosc w cmt’))
print(lenght,”cm to:”)
print(„{:.4f}m n{:.4f}cali” .format(lenght*0.01,lenght/2.54))
print(„nn”)
waga = int(input(’Podaj wage w kg t’))
print(waga,”kg to inaczej:”)
print(„{:.2f}g n{:.3f}funta”.format(waga*1000,waga*1000/453.59237))
Czy to jest git ? Czy zbyt ubogie albo proste ? Niby i przelicznik cm/m/cal i ten z kg na funty 😛
ok, lekcja 3 zrobiona,
Lekcję przerobiłem. Dziękuje za dzielenie się wiedzą w przystępny sposób.
Odnośnie formatowania bardziej przypadła mi do gustu nowa metoda. Lepiej
wstawiać nawiasy niż procenty, domyślnie czuję, że coś w tych nawiasach
musi być.
Witam pomóżcie nie wiem czemu nie wychodzi na pewno coś źle robię
waga = int(input(’waga???’) )
wzrost =int( input (’wzrost???’) )
BIM = print (’twoje BIM wychodzi;’, waga /( wzrost ** 2))
print (round (BIM , 6)) #TUTAJ CHCEM ZAOKRĄGLIC BMI DO 6 MIEJSC PO PRZECINKU
uprzedzam że dopiero się uczę pierwszego języka
ROZWIĄZANE
Długo walczyłem z przykładem nr 2. Ciekawe jest to, że autorka kursu sugeruje, by pamiętać o miesięcznej kapitalizacji, ale sama – w swoim przykładzie na GitHubie – pomija już ten aspekt. Szkoda po prostu, że w ramach lekcji nie został podany gotowy wzór matematyczny na to obliczenie, podobnie jak to było robione w przykładach z poprzednich lekcji.
A skoro już człowiek miałby się pogłowić nad wzorem uwzględniającym miesięczną kapitalizację, to nigdzie – jak dotąd – w kursie nie pojawiła się informacja, jak zapisywać w Pythonie tak złożone wzory. Nie jest to na pewno jakiś szczyt złożoności, ale jednak wzory w dotychczasowych przykładach były prostsze i nie było problemów z ich zapisaniem. Zresztą, autorka sama te wzory podawała. A tu – zonk.
Kończę więc na dziś rozczarowany ostatnią częścią tej lekcji (czyli tym właśnie zadaniem praktycznym), jak i podsuniętym przez autorkę możliwym rozwiązaniem, które nie pokrywa się z tym, jak sama autorka zadanie formułuje.
Pozostaje więc w mocy pytanie: jak powinien wyglądać wzór uwzględniający miesięczną kapitalizację odsetek i jak powinien być zapisany, aby Python prawidłowo go „przemielił”? Acha.. Ten program (wzór zatem też) powinien chyba umożliwiać, by użytkownik podał oprocentowanie lokaty po prostu w procentach, a nie w ułamku.
Jeśli jest tu więc jakaś tęga głowa, która poda tego rodzaju rozwiązanie, będę bardzo wdzięczny.
Bo sama autorka, z tego co widzę na GitHubie, swojego zadania nie rozwiązała. 🙂
Jeżeli czegoś nie rozumiem i mój zarzut jest błędny, to proszę o wytłumaczenie. W każdym razie – wkurzająca jest taka opcja, że coś się człowiekowi każe napisać, ale de facto nie daje się wiedzy potrzebnej do tego, by to działało. 🙁
Można do mnie pisać personalnie 😉
Zadania są dla was, rozwiązania na githubie to tylko podpowiedzi, można też założyć, że nikt nie jest nieomylny 😉 Na githubie znalazło się inne zadanie niż na blogu, gdyż początkowe zadanie było trochę inne i zostało jednak zmienione.
-> Fakt rozwiązania dostępnego nie ma
-> Fakt, autorka go nie rozwiązała
Z drugiej strony w formie obecnej to jedno z zadań matematyki dla uczniów gimnazjum. Podejścia mogą być różne, a jedną z opcji może być np. wzór na procent składany jest trochę trudniejszy do zaimplementowania, ale ogólnie można go znaleźć. Nawet można znaleźć bardzo podobne zadania z programowania w C++, php i innych językach, założę się, że w Pythonie też jest 🙂 w wolnej chwili zaktualizuję githuba – pozdrawiam!
Używając wzoru na procent składany Kn=K⋅(1+p100⋅k)n⋅k (n*k jest potęgą, nie wiem jak to tu zapisać ;)), kod zapisałem tak:
Kawał dobrej roboty. Bardzo Mi się podoba Twoje tłumaczenie oraz przykłady. Wielki plus! 🙂
Cześć. Mały błędzik:
https://uploads.disquscdn.com/images/3ab3c9f3011515fc896ff66f7cfdea37fd88d4a6eb0985f4646d75ebeb16f767.png
Dzięki 🙂
W zadaniu 1 na konwerter jednostek nie powino być {:.4f} zamiast {:3f} z uwagi, że program miał zaokrąglać do 4 miejsc po przecinku?
Do poprawki!
„Żeby to zrozumieć zmień %6.3f na %06.3f, a w drugim wypadku {:6.3f} na {:6.3f}.”
Chyba {:6.3f} na {:06.3f}.
Dziękuję za lekcję :*
Dziękuję Ci bardzo za te wpisy dotyczące Pythona! Szczególnie cenne są ćwiczenia pod koniec 😉 Są całkiem pomysłowe 😀 Zrobienie ich daje satysfakcję, a to przecież na razie zupełne podstawy kodowania
Ja zrobiłem to tak, nie wiem czy jest dobrze…:
print(„Obliczenie zysku z lokaty terminowej”)
stan = int(input(„Podaj stan początkowy konta w zł:”))
stopa = int(input(„Podaj stope oprocentowania rocznego lokaty w procentach:”))
lata = int(input(„Liczbę lat na lokacie:”))
dni = lata * 365
wynik = (stan * stopa / 100 * dni / 365) + stan
print(„Twoje”, stan, „zł przez”, lata, „lat na koncie z oprocentowaniem”, stopa,”% urośnie do”, wynik,”zł”)
W kalkulatorze lokat uwzględniłam podatek ^^
Dzięki za lekcję, faktycznie w rozwiązaniu na githubie tak jak poprzednicy już wspomnieli jest błąd, ale nie jest on związany z tematem lekcji, tj. formatowaniem, tylko ze wzorem na procent składany. Jedyne, co bym proponował, to zamieszczanie odpowiedzi na zadania zarówno w starym, jak i nowym formatowaniu. Do tej pory wszystko jasne.
stanpocz = int(input(„Podaj stan początkowy konta”))
oprocentowanie = float(input(„Podaj stope oprocentowania”))*0.01
czas = int(input(„Podaj czas kapitalizacji latach”))*12
stan = stanpocz*(1 + oprocentowanie/12)**czas
print(„Twoje {} zł przez {} lata na lokacie {} % urośnie do {:.2f}.”.format(stanpocz,int(czas/12),oprocentowanie,stan))
No i fajnie
Cześć 🙂
czy w przykładzie z tabelką nie powinna być inna szerokość tabeli? Mamy tam 4 znaki | budujące tabelę więc powinniśmy dodać je, i 4 spację, czyli szer = 48. Tylko przy takie wartości buduje mi ładną, dokończoną tabelkę.
Jesteś pewna, że masz tę samą zawartość tabeli? jeszcze raz sprawdziłam kod i na tym przykładzie wszystko jest ok. Ale jeśli dodasz inaczej i dodasz tyle spacji by Ci się zgadzało, to ze spokojem mozesz ustawic tak szerokosc by ci się zgadzało 🙂
tu jest błąd
cm_to_cal = cm/0.394
powinno być
cm_to_cal = cm*0.394
Kurs korzysta z Py 3.6, który wprowadził f-stringi, a jednak nie przedstawiono ich. Dlaczego? D:
Miałam już dawno je dopisać, ale brak czasu, permanentny brak czasu ;P
Tak sobie myślę, że rozwiązanie zadania z lokatą nie jest tak do końca poprawne z finansowego punktu widzenia 🙂 Tzn programistycznie jest ale wzór jest niewłaściwy, bo odsetki w miesiącu n+2 będą narastały od kwoty n+1 a nie od n. Zatem lepszym byłoby tu zastosowanie wzoru na n-ty wyraz ciągu geometrycznego – inaczej gubimy piękno procentu składanego :).
A tak poza tym super kurs dla osoby, która na codzień nie programuje! Dziękuje i jadę dalej 🙂
Cześć.
Przede wszystkim dzięki za tą stronę.
Zaczynam przygodę z programowaniem.
Mam pytanie troszkę innej natury.
>>> print(„Rekord świata na 100m to {:.2f} ustanowił go {}”.format(9.5877, 'Usain Bolt’))
Rekord świata na 100m to 9.58 ustanowił go Usain Bolt
Czy jest opcja, aby zaokrąglanie odbywało się zgodnie z matematyką, czyli 9.59, skoro wcześniej jest …77?
Serdecznie pozdrawiam!
możesz użyć round().
da wynik 0.59
Rita, jesteś super.
Jak znajdujesz czas na pisanie bloga?
Dla mnie bardzo przydatny. Uczę się z niego.
Dziękuję za pomoc.
Zdecydowanie podoba mi się nowsza wersja formatowania 🙂
Cześć Rita, super blog 🙂 tak trzymaj!
>>>don’t drink and drive but code and FLY<<<
:D:D:D
Dzięki bardzo! Po 2 latach po dłuższej przerwie naszła mnie ochota na programowanie, co mi umożliwiłaś. Mam nadzieję, że teraz na dłużej 🙂
Dzieki:)
ps zadanie z kapitalizacja przepisałem bo może się przydać:)
„Żeby to zrozumieć zmień %6.3f na %06.3f, a w drugim wypadku {:6.3f} na {:6.3f}.”
Tutaj chyba chodziło o zamianę z {:6.3f} na {:06.3f}.
Literówka złapana 🙂
Fajny kurs
Dzień dobry,
w odpowiedziach do zadania 1 na githubie zakradł się błąd.
dla wyliczenia wartości w calach zostało podane:
gdzie powinno być:
lub
0.394 to długość 1 cm w calach.
Pozdrawiam.
Mi się podoba 3
I kurs coraz bardziej mi się podoba:)
Zrobiłam, nie uwzględniam inflacji ponieważ nie ma ona wpływu na wypłatę odsetek. Oczywiście pieniądz straci na wartości ale de facto bank i tak wypłaci daną kwotę. Wszystkie wartości uwzględniają podatek belki 19%. Przykład zrobiłam w oparciu o lokatę z kapitalizacją na koniec okresu i konto oszczędnościowe z kapitalizacją miesięczną. Dodatkowo uwzględniłam różnicę pomiędzy dwoma produktami.
Ogólnie fajne szkolenia i złapałam bakcyla 🙂 w 2h doszłam do tego momentu więc chyba nie jest tak źle jak sądziłam. Zobaczymy co będzie dalej.
moje rozwiązanie:
https://prnt.sc/ve5gam
Zadanie 1 trochę rozbudowane
W poprzedniej lekcji przy zadaniu z kalkulatorem dziennego zapotrzebowania kalorycznego skończyła mi się kawa, na dworze się ściemniło i zdążyłem zgłodnieć zanim ogarnąłem, że pod if’ami muszą być tabulatory. No i działa;)
Jeśli chodzi o formatowanie, zdecydowanie wolę te nowe. Jest jakby bardziej przejrzyste. Kurs jest spoko. Dzięki Tobie możemy za darmo i po cichu obczaić o co w tym wszystkim chodzi i czy warto w to brnąć. Osobiście mocno się wciągnąłem. Pozdrawiam 😉
Moja wersja zadania # 2
Poprawna polska pisownia ułamków dziesiętnych wymaga stosowania przecinka zamiast kropki. Czy można ustawić jakąś opcję lokalizacji dla konwersji liczb zmiennoprzecinkowych na stringi?
Tak jak było napisane w komentarzach – zadanie 2 jest źle zrobione. Pamietam coś takiego z liceum, nie mam podręcznika, ale podam tę stronę za źródło poprawnego wzoru najlepszelokaty /kapitalizacja-odsetek.
Więc najlepiej gdyby rozwiązanie lub treść zadania zostały zmienione, bo wprowadza to w błąd.
Tutaj mój zapis:
x = float(input(’Podaj stan początkowy konta: ’))
y = float(input(’Podaj stopę oprocentowania rocznego: ’))
z = int(input(’Podaj liczbę lat na lokacie: ’))
c = x*(1+y/1200)**(12*z)
print(’Twoje {} zł przez {} lata na lokacie {}% urośnie do {:.2f} zł’ .format(x, z, y, c))
Cześć, zdaję sobie sprawę, że od publikacji tego posta minęło 5 lat, jest 2022 rok, a ja tu trafiłam i uczę się dzięki Tobie Pythona 🙂 Pewnie nikt tego nie czyta, ale napiszę. Dzięki, że trzymasz ten blog jeszcze przy życiu! Mam 33 lata, jestem po studiach inżynierskich z teleinformatyki, ale zaniedbałam temat i dotychczas nie pracowałam w zawodzie, a języki programowania zapomniałam natychmiast po studiach (szczerze mówiąc słabo chciały we mnie wchodzić, nie wychodziły mi podobnie tak jak Ty pisałaś w zakładce „o Tobie” ;)). Kiedyś robiłam strony HTML/CSS teraz chciałabym wrócić do zawodu i doceniam ten ciekawy zbiór treści zgromadzonych na Twym blogu. Temat finansów też nie jest mi obcy i ogromną radość sprawiło mi zrobienie programu, który liczy zysk z zainwestowanej kwoty na koncie oszczędnościowym w dzisiejszych czasach, obniżony oczywiście o podatek belki. Pokonała mnie jedynie matematyka, bo przy miesięcznej kapitalizacji podatek też jest pobierany co miesiąc i zysk jest nieco mniejszy niż w moim programie, który podatek belki pobiera dopiero na koniec. Ale działa i zadanie wykonane! PS. Również zauważyłam błąd w rozwiązaniu na githubie w przeliczaniu centymetrów na cale, powinno być:
A tu mój program liczący zysk z oszczędności:
Pozdrawiam!
Jestem tu i czytam komentarze – może nie aż tak często, może nie mam czasu na nowe wpisy ale doceniam.
Błędów trochę zrobiłam – głównie literówki, pojawiło się kilka rzeczy wartych rozszerzenia! Powodzenia z nauką!
Cześć, zdaję sobie sprawę, że wpis jest z 2017 roku, jest 2022, a ja tu dotarłam i uczę się z Twojego bloga Pythona! Dzięki, że utrzymujesz jeszcze przy życiu ten blog. Doceniam zawarte w nim zbiory informacji, nawet jeśli gdzieś popełniałaś błędy (kto z nas nie popełnia…). Mam 33 lata, studiowałam teleinformatykę, ale języki programowania średnio mi wchodziły i dotychczas nie pracowałam w zawodzie, jedynie kilka stron www w oparciu o html i css zrobiłam. Teraz chciałabym to zmienić, znalazłam Twój blog i trochę tu zostanę. Pozdrawiam!
Cześć. Nowsza metoda zdecydowanie przyjemniejsza ;)))
Jesteś super!
Trochę po czasie, bo jakieś parę lat 🙂 Ale sposób liczenia odsetek – pozostał aktualny w 2023 r.
Powiedziałbym tak: bez najprostszej „pętelki” – nie damy rady,
Kapitalizacja miesięczna nie od kwoty bazowej, tylko od już zarobionych pieniędzy. I na tym się też zarabia 🙂 Choćby tak:
I to liczy poprawnie… nie dajcie się doradcom kredytowym 😉
W zadaniu z przeliczeniem na cale był błąd w odpowiedziach bo nie dzielimy przez 0.394 tylko mnożymy to 🙂
Do kodu na samym końcu warto dodać linijki:
import time
time.sleep(5)
Inaczej po uruchomieniu skryptu i wpisaniu wartości okno sie zamyka bez wyświetlenia wyniku. Znaczy wynik jest wyświetlony ale tylko ułamek sekundy 🙂