Co robisz, jeśli masz do obliczenia coś nietypowego? Albo coś, czego nie da się obliczyć komercyjnym oprogramowaniem, którego używasz na co dzień? Jakich wtedy narzędzi używasz do swoich obliczeń? Liczysz ręcznie, Excel, a może tworzysz własne procedury obliczeniowe programując w jakimś języku?
Ja na co dzień używam w takich przypadkach Pythona. Towarzyszy mi on w mojej codziennej pracy od 2013 r. i coraz bardziej go lubię (z roku na rok jest też coraz popularniejszy).
Pokażę Ci, że programowanie własnych algorytmów i procedur obliczeniowych jest łatwe i pomaga w codziennej pracy projektowej. A z czasem, kiedy stworzysz już kilka algorytmów, oszczędzisz godziny mozolnej pracy.
W tym cyklu postów pokażę Ci jak działa Python i do czego możnesz go wykorzystać w projektowaniu. Zacznę od tematów podstawowych i będę przechodzić do tematów coraz bardziej zaawansowanych.
Dla kogo jest ten kurs? Lekcje Pythona piszę przede wszystkim dla:
- początkujących, którzy jeszcze nigdy nie programowali,
- osób, które mają pewne doświadczenie w programowaniu w innych językach i chcą zacząć programować w Pythonie,
- osób, które znają Pythona na poziomie średnio zaawansowanym i chcą poznać kolejne bardziej zaawansowane tematy.
Jeśli masz już większe doświadczenie w programowaniu w Pythonie, to możesz śmiało opuścić początkowe lekcje i przeglądać treści według tego, co Cię zainteresuje. Uczymy się przecież przez całe życie, prawda? :)
Dziś oprócz krótkiego wprowadzenia do Pythona pokażę jak wykonywać podstawowe działania na liczbach. Obiecuję, że po tej lekcji będziesz w stanie pisać proste procedury obliczeniowe na swój użytek. Poznasz następujące zagadnienia:
- Krótkie wprowadzenie do Pythona,
- Typy liczb w Pythonie,
- Operacje arytmetyczne,
- Definiowanie zmiennych,
- Przykład obliczeniowy (Eurokod 2).
1. Wprowadzenie do Pythona
Na początek krótkie i konieczne wprowadzenie.
Czym jest Python? Python to oczywiście język programowania i – co ważne – wysokiego poziomu (czytaj: łatwy w rozumieniu kodu przez człowieka). Jego „ideą przewodnią jest czytelność i klarowność kodu źródłowego. Jego składnia cechuje się przejrzystością i zwięzłością” (źródło: Wikipedia). Więcej możecie znaleźć w sieci, m.in. python.org.
Uruchamianie i obsługa Pythona
Używam Pythona 3 na Windowsie i na tym systemie możesz pracować z Pythonem na kilka sposobów:
- czysty wiersz poleceń Windows,
- dedykowany edytor kodu (np. Sublime, Notepad++, Atom, czy bardziej zaawansowany PyCharm),
- za pomocą przeglądarki internetowej lub online (np. Jupyter, repl.it)
Sposób programowania i narzędzia to kwestia upodobań. Każdy powinien wybrać to, co mu najbardziej pasuje. Ja osobiście używam i polecam Pythona w pakiecie Anaconda. Paczka ta zawiera wszystkie biblioteki Pythona, które będą przydatne w naszych obliczeniach. Poza tym jest łatwa w instalacji. Do pisania i uruchamiania kodu używam edytora Sublime – jest łatwy w obsłudze i zupełnie wystarczający na potrzeby tego kursu. Instrukcje instalacji znajdziesz pod linkami:
Uwaga techniczna: Kod, który pokazuję tutaj, będzie pisany w Pythonie wersji 3. Jest to wersja Pythona, która jest obecnie najmocniej rozwijana.
2. Typy liczb w Pythonie
Zacznę od podstawowych obiektów Pythona, jakimi są liczby i od działań na nich.
Python wyróżnia kilka „typów” liczb. Najczęściej używanymi typami są liczby całkowite (w Pythonie oznaczane są jako int
, integer) i zmiennoprzecinkowe (tzw. float
, floating-point number).
Liczby typu int
to liczby całkowite (sic!), „okrągłe”, czyli bez części dziesiętnych. (Od razu wyjaśniam, że nie chcę tłumaczyć tutaj podstaw matematyki, chodzi mi tylko o pokazanie jak Python rozumie liczby.) I tak 2 i -2 są przykładami liczb całkowitych typu int
.
Liczby zmiennoprzecinkowe w Pythonie float
są to – mówiąc najprościej – liczby zawierające znak dziesiętny (dla Pythona jest to .
kropka) albo używające wyrażenia potęgowego (e
). Dla przykładu 2.0 i -2.1 są liczbami zmiennoprzecinkowymi, czyli float
. Wyrażenie 3e2 (3 razy 10 do potęgi 2) jest również przykładem liczby zmiennoprzecinkowej w Pythonie.
Tabela poniżej przedstawia dwa podstawowe typy liczb, które będziemy używać w naszych obliczeniach.
Przykład | Typ liczby |
---|---|
1 , 2 , -5 , 100 |
int (liczba całkowita) |
1.0 , -0.5 , 100.2 , 2e2 , 3E2 |
float (liczba zmiennoprzecinkowa) |
3. Operacje arytmetyczne
Zacznijmy coś liczyć. Na początek wystartuję z podstawowymi operacjami arytmetycznymi. Zobacz, że notacja działań na liczbach w Pythonie jest bardzo podobna do typowych działań matematycznych, jakie znasz. Jest to wielka zaleta Pythona w odróżnieniu od wielu innych języków programowania. Przejdźmy przez działania arytmetyczne krok po kroku.
1 2 3 |
# Dodawanie 1+2 |
Da nam oczywiście wynik 3
.
Dwie uwagi techniczne:
- Zauważ, że w kodzie powyżej użyłem znaku
#
(hash). Znak#
pozwala wprowadzić do kodu jednolinijkowe komentarze, które zwiększają jego czytelność. Są to linie, których Python „nie widzi” (pomija je). Więcej powiem o tym przy innej okazji. - Jeśli używasz czystego Pythona np. w wierszu poleceń, to tak zapisana operacja
1+2
zwróci wynik obliczeń bezpośrednio po uruchomieniu kodu. Jeśli natomiast używasz edytora tekstowego (w moim przypadku Sublime), to po uruchomieniu tego kodu, Python nie wyświetli wam nic. Python wykonał co prawda obliczenia, tylko wynik nie został jeszcze wyświetlony – służy do tego opcjaprint()
. Zatem, żeby wyświetlić wynik działania w edytorze kodu, nasze działanie należy zapisać jakoprint(1+2)
i następnie wykonać kod (w Sublime jest to komenda Ctrl+B lub menu: Tools > Build).
1 2 3 |
# Odejmowanie 3-2 |
Zwróci nam wynik 1
.
1 2 3 |
# Mnożenie 2*2 |
= 4
1 2 3 |
# Dzielenie 3/2 |
= 1.5
Uwaga do Pythona 2
1 2 3 |
# Dzielenie w Python 2 3/2 |
Wynikiem tego dzielenia będzie… 1
Co się tutaj stało? Poprzednim razem dzielenie 3/2 dało nam 1.5, a nie 1! Tutaj pojawia się różnica pomiędzy Pythonem 2 i 3. Rozróżnienie typu liczby int
czy float
ma szczególne znaczenie w Pythonie 2. W tej wersji Pythona mamy do czynienia z „klasycznym” dzieleniem liczb całkowitych. Oznacza to, że część dziesiętna z dzielenia jest odrzucana. Działając na liczbach całkowitych, wynikiem tego działania będzie liczba całkowita.
Python 3 działania już inaczej. Znak dzielenia /
wykonuje „prawdziwe” dzielenie. Dlatego wynikiem działania 3/2
jest 1.5
.
Jeżeli korzystasz z Pythona 2, to są dwie metody na to, żeby uniknąć powyższego błędu:
1 2 3 |
# Pierwszy sposób: Zmiana przynajmniej jednej liczby na liczbę zmiennoprzecinkową 3.0/2 |
= 1.5
1 2 3 |
# Działa to dla którejkolwiek z liczb 3/2.0 |
= 1.5
1 2 3 |
# Drugi sposób: Zamiana liczby całkowitej na zmiennoprzecinkową za pomocą funkcji float() float(3)/2 |
= 1.5
O tzw. funkcjach i innych bardziej zaawansowanych opcjach będę szczegółowo pisał w kolejnych lekcjach. Tutaj ważne jest, abyś poznał jak działają tylko niektóre z nich.
Działania arytmetyczne – ciąg dalszy
Wróćmy do działań arytmetycznych.
1 2 3 |
# Potęgowanie 2**3 |
= 8
1 2 3 |
# Do potęgowania możesz wykorzystać również funkcję: pow(2,3) |
= 8
1 2 3 |
# Wyrażenie potęgowe 'e' 3e2 |
= 300
(czyli 3 * 10**2
)
1 2 3 |
# Pierwiastek możesz otrzymać korzystając z funkcji potęgowania 4**(0.5) |
= 2
1 2 3 |
# Funkcja pow() też się do tego nadaje pow(4, 0.5) |
= 2
Istnieje też konkretna funkcja do otrzymania pierwiastka kwadratowego z liczby sqrt()
, ale z racji jej specyfiki, pokażę ją później przy omawianiu funkcji w Pythonie.
1 2 3 |
# Kolejność działań w Pythonie 1 + 10 * 10 + 2 |
= 103
Kolejność operacji jest zgodną z tradycyjną notacją matematyczną. Np. dodawanie i odejmowanie mają priorytet niższy niż operacje mnożenia i dzielenia, z kolei te mają priorytet niższy od potęgowania. Przy tym samym priorytecie, działania wykonywane są w kolejności czytania tekstu „od lewej do prawej”.
1 2 3 |
# Do określenia kolejności działań możesz użyć nawiasów okrągłych (1+10) * (10+2) |
= 132
1 2 3 |
# Przykład z liczbami ujemnymi (-7 + 2) * (-4) |
= 20
Jeśli potrzebujesz wartość bezwzględną z liczby, możesz ją wyznaczyć korzystając z kombinacji funkcji potęgowej, np. (x**2)**0.5
. Python ma też do tego osobną funkcję:
1 2 3 |
# Wartość bezwzględna z liczby abs(-2) |
= 2
1 2 3 |
# Wartość maksymalna ze zbioru liczb max(1,8,-10,5) |
= 8
1 2 3 |
# Wartość minimalna ze zbioru liczb min(1,8,-10,5) |
= -10
Kolejną przydatną funkcją dla liczb jest zaokrąglenie. Wynikiem tej funkcji jest liczba zaokrąglona do zadanego miejsca po przecinku (domyślnie do zerowego miejsca dziesiętnego).
1 2 3 |
# Zaokrąglenie z domyślną dokładnością round(3.1415) |
= 3
1 2 3 |
# Zaokrąglenie z zadaną dokładnością round(3.1415, 2) # Do dwóch miejsc po przecinku |
= 3.14
1 2 3 |
# Przykład zaokrąglenia innej liczby round(123.456, 1) # Do jednego miejsca po przecinku |
= 123.5
1 2 |
round(123.456, -1) # Zaokrąglenie do pełnych 10 |
= 120.0
1 2 |
round(123.456, -2) # Zaokrąglenie do pełnych 100 |
= 100.0
4. Definiowanie zmiennych
Jak dotąd poznałeś jak wykorzystać Pythona do działań na liczbach jako zwykły kalkulator. W Pythonie możesz również przypisać liczbom i innym obiektom nazwy. Taki obiekt z przypisaną do niego nazwą określamy jako zmienną. Jest to opcja bardzo pomocna zwłaszcza w algorytmach obliczeniowych, gdzie zamiast wpisywania za każdym razem np. wartości liczb, operujesz po prostu na zmiennych. Wykorzystując nazwy zmiennych możesz bardzo sprawnie śledzić przebieg obliczeń naszego kodu. Zmniejsza to znacznie ryzyko błędów w kodzie. Przypisanie nazwy do zmiennej wykonujemy za pomocą pojedynczego znaku =
(równa się). Zobacz to na kilku przykładach:
1 2 3 4 5 |
# Stwórz obiekt o nazwie 'x' i przypiszmy mu wartość 5 x = 5 # Wywołanie 'x' x |
Teraz, jeśli wykonam ten kod, Python zwróci liczbę 5
.
1 2 3 |
# Dodawanie obiektów x + x |
= 10
Zmienne w Pythonie mają to do siebie, że możesz im w każdym momencie przypisać nową wartość.
1 2 3 4 5 |
# Przypisanie zmiennej nowej wartości x = 15 # Wywołanie 'x' x |
Jeśli wywołasz x
, to dostaniesz wartość 15
, a nie – jak wcześniej – 5
.
Możesz również użyć zmiennej do zmiany jej samej. Jest to bardzo ważna funkcja w obliczeniach numerycznych (nazywa się rekurencją). Pozwala ona na odwoływanie się zmiennej do niej samej (będzie o tym trochę później). Spójrz na przykład poniżej, żeby zrozumieć o co mi chodzi:
1 2 3 4 5 6 |
# Mamy zmienną 'x' o wartości 15: x = 15 # Użyj `x` do przypisania jej nowej wartości równej 'x + x': x = x + x |
Teraz x
wynosi 30
.
Do zmiany wartości zmiennej x
możesz wykorzystać również inne poznane operatory matematyczne, np. x*x
, x/x
, x**x
etc.
Zasady nazywania zmiennych
Zmienne w Pythonie możesz nazywać dowolnie. Jest jednak kilka zasad, których musisz przestrzegać, inaczej Python zwróci nam błąd przy uruchomieniu obliczeń. Należy przestrzegać następujących zasad:
- Nazwy nie mogą zaczynać się od liczby.
- Nie można używać spacji w nazwie, zamiast tego użyj
_
(podkreślenia). - Nie można używać następujących znaków:
'
"
,
<
>
/
?
|
\
(
)
!
@
#
$
%
^
&
*
~
-
+
- Zaleca się, aby nazwy pisane były małymi literami (por. najlepsze praktyki PEP8).
Co do ostatniej uwagi, to małe rozróżnienie. Czasem potrzebujemy użyć nie tyle zmiennej, co stałej, czyli obiektu, któremu przypisujemy niezmienną wartość. Wtedy tworzymy nazwę stałej WIELKIMI_LITERAMI i z uwzględnieniem pozostałych reguł (np. BETON_WSP_POISSONA = 0.20
).
5. Przykład obliczeniowy (Eurokod 2)
W każdym z tekstów dotyczącym nauki programowania w Pythonie postaram się dać Ci konkretny przykład obliczeniowy, który będzie odpowiadać treści lekcji i który będzie można wykorzystać bezpośrednio w projektowaniu. Zacznę od przykładów prostszych (jak ten tutaj) i będę przechodzić do coraz bardziej zaawansowanych.
Napisz teraz krótką procedurę obliczeniową dla parametrów wytrzymałościowych betonu. Załóżmy, że chcemy obliczyć moduł sprężystości betonu Ecm wg Eurokodu 2. Znamy klasę betonu (np. C30/37) i przez to możemy odczytać wartość wytrzymałości betonu na ściskanie (fck = 30 MPa).
1 2 3 4 5 6 7 8 9 10 |
# Dane fck = 30 # Wartość w [MPa] # Obliczenia wg EC2 fcm = fck + 8 # Średnia wytrzymałość betonu na ściskanie [MPa] Ecm = 22*(0.1*fcm)**0.3 # Sieczny moduł sprężystości betonu [GPa] # Wynik print(round(Ecm,1)) |
Po wywołaniu tej procedury w Pythonie wynikiem naszych obliczeń będzie Ecm = 32.8
GPa, co odpowiada wartości odczytanej z tab. 3.1 EC2.
Tutaj celowo pominąłem temat jednostek w obliczeniach (MPa etc.). Bez obaw, powiem o tym później i pokażę mój sposób na obliczenia z jednostkami SI.
OK, to czego się nauczyliśmy?
Po krótkim wprowadzeniu do Pythona poznałeś typy liczb, dalej nauczyłeś się wykonywać działania arytmetyczne i obliczenia. Umiesz nazywać zmienne i przypisywać im wartości, umiesz też wykonywać obliczenia na zmiennych. Za pomocą poznanych możliwości potrafisz tworzyć proste procedury obliczeniowe.
Możesz ściągnąć spakowany plik .py z zapisanym kodem, który pokazałem w tym wpisie.
W następnym poście zajmiemy się obiektami, które określamy jako „Napisy” (dosłownie z ang. Strings)!
Wpisy z cyklu „Python dla inżynierów„:
W drugiej lekcji „Python dla inżynierów” nauczę Cię jak tworzyć napisy w Pythonie i jak operować na nich. Potrafisz już co prawda pisać proste procedury obliczeniowe, ale jak wykorzystać wyniki z Pythona do Twoich projektów? „Gołe” wyniki nie przydadzą się na wiele. Jak zatem pokazać wyniki tych obliczeń? Jak wprowadzić do algorytmów Pythona napisy i jak je później wyświetlić? Tego nauczysz się z tej lekcji!
Aby wykorzystać w projekcie stworzone przez Ciebie w Pythonie algorytmy obliczeniowe, potrzebujesz odpowiednio sformatowanego tekstu, który będziesz mógł dowolnie zmieniać i następnie wklejać tam gdzie chcesz. Nauczę Cię jak radzić sobie z napisami w Pythonie, ponieważ jest to bardzo przydatne! Nauczę Cię też jak tworzyć własne raporty obliczeniowe do wykorzystania bezpośrednio w Twoich obliczeniach statycznych.
Dzisiaj nauczę Cię następujących operacji na napisach (ang. strings):
- Tworzenie napisów
- Wyświetlanie napisów
- Podstawowe operacje na napisach
- Właściwości napisów
- Metody wbudowane napisów
- Formatowanie napisów
- Przykład zastosowania napisów: Raport z obliczeń
1. Tworzenie napisów
Napisy w Pythonie to ciąg znaków, które służą do przechowywania informacji (danych) tekstowych. Ciąg ten ma ściśle określoną kolejność znaków (sekwencja znaków). Np. napis tekst
Python widzi jako zbiór liter o konkretnej kolejności. Sekwencyjność w Pythonie ma duże znaczenie – powiem o tym więcej za chwilę.
Bardzo często ciągi znaków w Pythonie określa się zamiennie jako napis, string (wersja angielska) lub łańcuch znaków. W tej lekcji będę używać zamienne tych nazw.
Napisy (Strings) w Pythonie definiuje się za pomocą apostrofu '
umieszczonego na początku i na końcu ciągu znaków. Może to być:
1 2 3 4 5 6 7 8 9 10 11 |
# Pojedyncze słowo: 'Cześć!' # Fraza złożona z kilku słów: 'To też jest napis' 'Ten napis zawiera również cyfry 123 i inne znaki +-!@#$' # Do stworzenia napisu możemy również użyć znaku "cudzysłowu", zamiast 'apostrofu': "Napis stworzony za pomocą cudzysłowów" |
Te dwa sposoby zapisu napisów (za pomocą apostrofu '...'
lub cudzysłowu "..."
) dają taki sam efekt końcowy. Ważne jest, aby zaczynać i kończyć napisy konsekwentnie tym samym znakiem.
1 2 |
'Musisz 'uważać' na typy cudzysłowów w tym samym napisie, bo może to doprowadzić do błędu jak tutaj.' |
Po wywołaniu tego tekstu Python zwróci błąd tego typu:
1 2 3 4 5 |
File "[ścieżka pliku .py]", line 26 'Musisz 'uważać' na typy cudzysłowów w tym samym napisie, bo może to doprowadzić do błędu jak tutaj.' ^ SyntaxError: invalid syntax |
Powodem tego błędu jest to, że tym drugim apostrofem kończę mój napis, więc słowo uważać
jest już poza napisem. Jeśli potrzebujesz użyć w tekście apostrofu lub cudzysłowu (np. pisząc po angielsku I'm
lub cytując "kogoś"
), to użyj kombinacji tych dwóch, czyli '
i "
do stworzenia takiego tekstu. Przykład:
1 2 3 |
'To jest tekst "poprawnie" zapisany z cudzysłowami i apostrofami' "To też jest tekst 'poprawnie' zapisany z cudzysłowami i apostrofami" |
2. Wyświetlanie napisów (drukowanie)
Napisy możesz wyświetlić (wydrukować) za pomocą funkcji print()
. Pamiętasz? Użyłem tej funkcji już w lekcji o liczbach.
1 2 |
print('Python dla inżynierów') |
Wywołanie tej linijki kodu zwróci nam ciąg znaków Python dla inżynierów
.
Napisy są z reguły jednowierszowe. Jeśli jednak masz taką potrzebę, to możesz tworzyć napisy wielowierszowe. Tworzysz je dodając na początku i końcu ciągu znaków potrójne apostrofy '''...'''
lub potrójne cudzysłowy """..."""
.
1 2 3 4 5 |
print('''Ten napis ma wiele linii''') |
Wynikiem tego będzie:
1 2 3 4 5 |
Ten napis ma wiele linii |
Drugi sposób:
1 2 3 4 |
print('Możesz też użyć \n do stworzenia \nnowej linii w tekście.') print('\n') print('Widzisz teraz jako to działa?') |
Po wywołaniu dostaniesz taki ciąg znaków:
1 2 3 4 5 6 |
Możesz też użyć do stworzenia nowej linii w tekście. Widzisz teraz jako to działa? |
Jeśli chcesz wyświetlić jednocześnie kilka napisów, to wystarczy je wypisać rozdzielając przecinkami:
1 2 |
print('a', 'b', 'c') |
Wynikiem będzie: a b c
. Poszczególne napisy zostaną połączone i rozdzielane domyślnie pojedynczą spacją (white space).
A co jeśli chcemy sami zdecydować jaki znak będzie rozdzielał poszczególne napisy? W tym celu na końcu funkcji dodajemy separator sep='[Twój znak]'
:
1 2 3 |
print('a', 'b', 'c', sep='...') # Tutaj separatorem będzie '...' (trzy kropki) print('a', 'b', 'c', sep='') # A tutaj separatora nie będzie (brak znaku) |
Python wyświetli to jako:
1 2 3 |
a...b...c abc |
Polskie znaki w skryptach Pythona
Interpreter Pythona przyjmuje domyślnie dla plików .py kodowanie ASCII. Jeżeli chcesz stosować polskie znaki (ą
, ę
, ć
etc.), to powinieneś na początku kodu podać odpowiednie kodowanie. Ja zalecam kodowanie Unikod UTF-8. ASCII jest z nim w pełni kompatybilne i zawiera dodatkowo znaki specjalne wszystkich języków. Po zapisaniu pliku z tym kodowaniem należy dodać na początku pliku Pythona: #-*-coding: utf-8-*-
. Ta informacja pozwala zorientować się jakie kodowanie przyjąłeś w Twoim pliku .py.
3. Podstawowe operacje na napisach
Napis jako zmienna
1 2 3 4 |
# Napisom, podobnie jak zmiennym, można przypisać nazwę: str = 'abc' # nazwa 'str' pochodzi od 'string' print(str) |
Wynikiem będzie abc
.
Długość napisów
Przydatną funkcją w napisach jest funkcja len()
. Służy ona do sprawdzenia długości łańcucha znaków:
1 2 3 |
liczba_znakow = len('Ile znaków ma to zdanie?') print(liczba_znakow) |
Funkcja len()
zwróci nam, że to zdanie ma 24 znaki.
Operator indeksowania
Napisy, jak wspomniałem na początku, to łańcuchy znaków o określonej kolejności. Oznacza to, że Python może używać indeksów do wywołania poszczególnych znaków lub części danego łańcucha.
Do wywołania pojedynczego znaku w danym napisie, któremu odpowiada wybrany przez nas indeks, używamy nawiasów kwadratowych []
umieszczonych zaraz za tym napisem:
1 2 3 |
str = 'Python dla inżynierów' print(str[0]) |
Po wywołaniu tego kodu Python zwróci nam znak P
.
Zwróć uwagę, że indeksowanie w Pythonie zaczyna się od liczby 0. Zatem pierwszy znak w łańcuchu ma przypisany indeks 0, drugi – 1, trzeci – 2 itd.
1 2 3 4 |
print(str[1]) # drugi znak print(str[-1]) # ostatni znak print(str[-2]) # przedostatni |
Wynikiem będzie:
1 2 3 4 |
y w ó |
Jeśli natomiast chcesz wyświetlić określony fragment łańcucha znaków, to operator indeksowania ma postać nazwa_zmiennej[od:do]
. Przykład:
1 2 3 4 5 |
print(str[1:6]) # fragment napisu obejmujący znaki od drugiego do piątego print(str[:3]) # od pierwszego (domyślnie jeśli nie podano) do trzeciego print(str[2:]) # od trzeciego aż do końca print(str[:]) # wszystkie znaki |
W efekcie dostaniemy:
1 2 3 4 5 |
ython Pyt thon dla inżynierów Python dla inżynierów |
Możesz również użyć ujemnych wartości indeksów:
1 2 3 4 |
print(str[-2:]) # dwa ostatnie znaki print(str[:-1]) # od pierwszego do przedostatniego print(str[3:-3]) # od czwartego do czwartego od końca |
Python zwróci tutaj:
1 2 3 4 |
ów Python dla inżynieró hon dla inżynie |
Python pozwala również na wyświetlenie fragmentu łańcucha z zadanym krokiem (skok, co który znak ma być wyświetlony).
1 2 3 4 5 6 |
print(str[::1]) # Wyświetl wszystko, ale co jeden (każdy) znak print(str[::2]) # Wyświetl wszystko, ale co drugi znak # Możesz też wykorzystać to do odwrócenia napisu: print(str[::-1]) # wyświetlenie znaków od końca do początku napisu |
Wynikiem będzie odpowiednio:
1 2 3 4 |
Python dla inżynierów Pto l nyirw wóreinyżni ald nohtyP |
4. Właściwości napisów
Modyfikacja napisów
Podobnie jak w innych językach (np. C#, Java) napisy w Pythonie są niemodyfikowalne (immutable), tj. po stworzeniu napisu nie można zmieniać lub zastępować w nim poszczególnych znaków. Zobaczmy to na naszym przykładzie str = 'Python dla inżynierów'
:
1 2 3 |
# Spróbujmy zmienić pierwszą literę na 'x' str[0] = 'x' |
Po wywołaniu tej linii dostaniemy błąd:
1 2 3 4 |
File "[ścieżka pliku .py]", line 114, in <module> str[0] = 'x' TypeError: 'str' object does not support item assignment </module> |
Zwróć uwagę, że Python pokazuje bezpośrednio czego nie możesz zrobić – w tym wypadku nie możesz zmienić przypisania dla wybranego elementu.
Ale co możesz zrobić, to łączyć ze sobą napisy!
Łączenie napisów
1 2 3 |
# Napisy można ze sobą łączyć: print('abc' + ' dodaj mnie') |
Dostaniemy tutaj abc dodaj mnie
.
Zauważ, że możesz też nadpisywać napisy (przypisać im nową wartość w miejsce starej). Przykład:
1 2 3 4 |
str = 'abc' str = str + ' dodaj mnie' print(str) |
Wynikiem będzie abc dodaj mnie
.
A co jeśli chcemy połączyć ze sobą tekst i liczbę?
1 2 |
print('abc = ' + 123) |
Niestety, Python wyrzuci błąd:
1 2 3 4 |
File "[ścieżka pliku .py]", line 118, in <module> print('abc = ' + 123) TypeError: must be str, not int </module> |
Python nie pozwala na łączenie dwóch różnych typów obiektów jak str
('abc = '
) i np. int
(123
). Rozwiązaniem tego problemu jest zamiana liczby na ciąg znaków za pomocą funkcji str()
lub repr()
:
1 2 |
print('abc = ' + str(123)) |
Python zwróci nam wtedy 'abc = 123'
Powielanie napisów
1 2 3 |
# Napisy można też powielać: print('abc' * 10) |
Python zwróci ciąg znaków abcabcabcabcabcabcabcabcabcabc
.
Zauważ, że nie jest to typowe mnożenie, jak w przypadku liczb, tylko powielanie (powtórzenie). Różnica jest taka, że liczba powieleń musi być dodatnią liczbą całkowitą typu int
.
1 2 3 |
# Nie można zatem mnożyć napisów przez liczbę inną niż typ 'int', np.: print('abc' * 10.0) |
Python zwróci wtedy błąd:
1 2 3 4 |
File "[ścieżka pliku .py]", line 131, in <module> print('abc' * 10.0) TypeError: can't multiply sequence by non-int of type 'float' </module> |
1 2 3 |
# Nie można też mnożyć napisów przez siebie same: print('abc' * 'abc') |
Python wyrzuci błąd:
1 2 3 4 |
File "[ścieżka pliku .py]", line 134, in <module> print('abc' * 'abc') TypeError: can't multiply sequence by non-int of type 'str' </module> |
Uwaga: Na pewno zwróciłeś uwagę na różnicę pomiędzy operacjami na napisach i na liczbach? Żeby rozwiać wszelkie wątpliwości weźmy dwa proste przykłady:
- Dodawanie
'2' + '2'
nie da w wyniku liczby 4 tylko string'22'
, - podobnie mnożenie
4 * '2'
nie da wyniku 8, tylko'2222'
.
Widzisz teraz różnicę?
5. Metody wbudowane
Obiekty w Pythonie mają zwykle tzw. metody wbudowane (built-in methods). Metody, mówiąc najprościej, są to funkcje zaszyte w danym obiekcie (będę o tym mówił w kolejnych lekcjach), które mogą wykonywać polecenia na nich samych. Nie martw się jeśli nie wszystko jest tutaj zrozumiałe. Zajmiemy się tym później i nauczę Cię tworzenia własnych obiektów i funkcji.
Aby wywołać konkretną metodę trzeba po nazwie obiektu postawić kropkę .
i następnie podać nazwę metody. Zasada jest taka: obiekt.metoda(parametr)
. Zerknij poniżej na kilka przykładów użycia metod dla stringów.
Formatowanie napisów
1 2 3 4 5 6 7 8 |
str = 'Python dla inżynierów' # Możemy zamienić wszystkie litery na wielkie: print(str.upper()) # Zamiana na małe litery też jest możliwa: print(str.lower()) |
Dostaniemy z tego odpowiednio:
1 2 3 |
PYTHON DLA INŻYNIERÓW python dla inżynierów |
Przeszukiwanie napisów
1 2 3 4 |
# Możemy też sprawdzić czy szukany znak występuje w ciągu znaków: print(str.index('o')) # Zwraca indeks pierwszego wystąpienia szukanego znaku; w przypadku niewystępowania znaku zwraca błąd print(str.find('o')) # działa podobnie jak metoda index(); w przypadku braku znaku zwraca wartość -1 |
Powyższe dwie metody zwrócą nam:
1 2 3 |
4 4 |
Jeśli chcemy dowiedzieć się tylko czy dany znak lub ciąg znaków występuje w łańcuchu, najlepiej wykorzystać do tego polecenie in
:
1 2 3 4 5 |
str = 'Python dla inżynierów' print('Python' in str) print('Pascal' in str) |
W wyniku powyżej otrzymaliśmy wartości: True
dla 'Python'
(tak, 'Python'
występuje w str
) oraz False
dla 'Pascal'
(nie, 'Pascal'
nie występuje w str
).
Inne przydatne metody:
1 2 3 4 5 |
# Zliczanie liczby wystąpień znaku w napisie: print(str.count('P')) print(str.count('p')) print(str.count('n')) |
W wyniku dostaniemy:
1 2 3 4 |
1 0 3 |
Uwaga: Wielkość liter w Pythonie ma znaczenie! Spójrz na przykład powyżej. Dla wyrażenia str.count('p')
Python zwrócił wartość 0, ponieważ w str
nie występuję znak małe p
.
1 2 3 |
# Zamiana znaków w tekście (zastępowanie) print(str.replace('y','.')) |
Wynikiem będzie napis P.thon dla inż.nierów
. Metoda ta pozwala na zastępowanie znaków w napisie. Jednak, jak powiedziałem wyżej, sam str
pozostaje bez zmian (po wywołaniu print(str)
dostaniemy niezmieniony napis).
Dzielenie / łączenie napisów
1 2 3 4 |
# Podział napisu na części według znaku separatora print(str.split()) # Domyślny podział napisu przez spacje ('wite space') print(str.split('y')) # Podział napisu za pomocą 'y' |
Za pomocą metody split()
otrzymujemy listę znaków wydzieloną separatorem. Powstała lista nie będzie zawierać znaku separatora (odpowiednio w przykładzie: znak spacji i y
).
1 2 3 |
['Python', 'dla', 'inżynierów'] ['P', 'thon dla inż', 'nierów'] |
Nie przejmuj się jeśli nie wiesz jeszcze co to listy. Omówię je w następnych lekcjach. Tutaj wspominam o nich jedynie jako wynik działania funkcji.
1 2 3 4 |
# Można też podzielić napis wybranym ciągiem znaków: s = '.' print(s.join(str)) # Elementem dzielonym (iteratorem) będzie 'str' |
Wynikiem działania join()
będzie:
1 2 |
P.y.t.h.o.n. .d.l.a. .i.n.ż.y.n.i.e.r.ó.w |
Metody wbudowane są bardzo pomocne w szybkim operowaniu na obiektach. Nie trzeba tracić czasu na tworzenie nowych funkcji, mamy je już wbudowane. Więcej na temat metod wbudowanych w stringach możesz znaleźć tutaj.
6. Formatowanie napisów
Przechodzimy teraz do, moim zdaniem, najciekawszej części tej lekcji – formatowania napisów.
Jeśli wykonuję jakieś obliczenia za pomocą algorytmów napisanych w Pythonie, to zawsze przychodzi etap wyświetlania wyników obliczeń. A dokładnie chodzi o sensowne sformatowanie wyników, żeby można było je wykorzystać dalej.
To, co daje nam Python to to, że możemy niemal dowolnie komponować dane i wyniki wg własnych potrzeb i upodobań. Pokażę Wam kilka przydatnych opcji.
Weźmy prosty przykład.
1 2 3 4 5 6 |
stolica = 'Dodoma' # nowa stolica Tanzanii kraj = 'Tanzania' populacja = 53950935 print('Stolicą kraju ' + kraj + ' jest ' + stolica + '. Populacja kraju: ' + str(populacja) + ' mieszkańców.') |
Wynikiem będzie tekst Stolicą kraju Tanzania jest Dodoma. Populacja kraju: 53950935 mieszkańców.
Wygląda nienajgorzej, prawda? Ale można też się pogubić z tymi znakami jak +
itp. I jeszcze pilnowanie tych spacji… A może by zrobić to tak:
Formatowanie napisów za pomocą %
1 2 |
print('Stolicą kraju %s jest %s. Populacja kraju: %d mieszkańców.' % (kraj, stolica, populacja)) |
Wynik jest identyczny: Stolicą kraju Tanzania jest Dodoma. Populacja kraju: 53950935 mieszkańców.
Prawda, że lepiej? Taki sposób odwołania do zmiennych za pomocą %
jest dużo łatwiejszy, czytelniejszy i mniej podatny na błędy. Za pomocą %
możemy w Pythonie odwoływać się do m.in. następujących typów obiektów:
%s
– napis, łańcuch znaków,%d
– liczba całkowita,%f
– liczba rzeczywista, zmiennoprzecinkowa,%e
– liczba rzeczywista w notacji naukowej.
Dzięki odwołaniom możemy też określać dokładność wyświetlanych zmiennych. Przykład:
1 2 |
print('Najpopularniejsze stałe matematyczne to %s = %.2f i %s = %.3f.' % ('pi', 3.141593, 'e', 2.718282)) |
Wynik: Najpopularniejsze stałe matematyczne to pi = 3.14 i e = 2.718.
Formatowanie napisów za pomocą metody format()
Jest jeszcze inny sposób formatowania napisów – metoda format()
. Wygląda podobnie do odwołania za pomocą %
z drobnymi różnicami. Sprawdźcie sami na przykładzie ze stolicą:
1 2 3 4 |
print('Stolicą kraju {} jest {}. Populacja kraju: {} mieszkańców.'.format(kraj, stolica, populacja)) print('Stolicą kraju {2} jest {0}. Populacja kraju: {1} mieszkańców.'.format(stolica, populacja, kraj)) # wywołanie zmiennej za pomocą indeksu (odwrócona kolejność) print('Stolicą kraju {kr} jest {st}. Populacja kraju: {pop} mieszkańców.'.format(kr=kraj, st=stolica, pop=populacja)) # wywołanie do zmiennej przez nazwę |
Wszystkie trzy funkcje dadzą ten sam wynik: Stolicą kraju Tanzania jest Dodoma. Populacja kraju: 53950935 mieszkańców.
.
Więcej ciekawych przykładów z wykorzystaniem metody format()
znajdziecie tutaj.
7. Przykład zastosowania stringów: Raport z obliczeń
W ostatniej lekcji nauczyłeś się programować proste procedury obliczeniowe oparte o działania arytmetyczne. Tutaj też Ci się to przyda. W tym przykładzie nauczę Cię jak wyświetlać przykładowe wyniki obliczeń, żebyś mógł wykorzystać to bezpośrednio w Twoich obliczeniach.
Napiszemy krótką procedurę do obliczania naprężeń normalnych i sformatujemy dane i wyniki tak, żeby powstał z tego raport z obliczeń. Wykorzystując print()
i inne poznane funkcje możesz dowolnie formatować dane i wyniki obliczeń, które chcesz wyświetlić.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/usr/bin/env python #-*-coding: utf-8-*- ''' Obliczanie naprężeń normalnych dla przekroju prostokątnego (c) www.oProjektowaniu.pl | 2017 ''' # ----------------------------------------------------------- # DANE # ----------------------------------------------------------- b = 0.2 # Szerokość przekroju w [m] h = 0.6 # Wysokość przekroju w [m] N = 100 # Siła podłużna w [kN], (+) rozciąganie / (-) ściskanie My = 25 # Moment zginający w [kNm], (+) rozciąganie włókien dolnych / (-) rozciąganie włókien górnych # ----------------------------------------------------------- # OBLICZENIA # ----------------------------------------------------------- A = b*h # Pole powierzchni Iy = b * h**3 / 12 # Moment bezwładności z = h/2 # Współrzędna względem środka ciężkości Wy = Iy / z # Wskaźnik wytrzymałości sigY_gora = (N/A) - (My*z/Iy) sigY_dol = (N/A) + (My*z/Iy) sigY_srodek = (N/A) # ----------------------------------------------------------- # WYDRUK WYNIKOW # ----------------------------------------------------------- line = 60 sep = '-' print(line*sep) print('DANE') print(line*sep) print(' Przekrój prostokątny: %s = %.2f m/%.2f m' % ('b/h'.rjust(7), b, h)) print(' Wskaźnik wytrzymałości: %s = %.3E m3' % ('Wy'.rjust(5), Wy)) print('') print(line*sep) print('WYNIKI OBLICZEŃ') print(line*sep) print(' Naprężenia normalne: %s = %+.2f MPa %s' % ('sig.g'.rjust(8), sigY_gora / 1000, '(włókna górne)'.rjust(15))) print('%s = %+.2f MPa %s' % ('sig.0'.rjust(31), sigY_srodek / 1000, '(oś obojętna)'.rjust(15))) print('%s = %+.2f MPa %s' % ('sig.d'.rjust(31), sigY_dol / 1000, '(włókna dolne)'.rjust(15))) |
W efekcie dostaniemy następujący wydruk:
1 2 3 4 5 6 7 8 9 10 11 12 |
------------------------------------------------------------ DANE ------------------------------------------------------------ Przekrój prostokątny: b/h = 0.20 m/0.60 m Wskaźnik wytrzymałości: Wy = 1.200E-02 m3 ------------------------------------------------------------ WYNIKI OBLICZEŃ ------------------------------------------------------------ Naprężenia normalne: sig.g = -1.25 MPa (włókna górne) sig.0 = +0.83 MPa (oś obojętna) sig.d = +2.92 MPa (włókna dolne) |
Tak przygotowaną notatkę obliczeniową możesz wykorzystać bezpośrednio wklejając ją do Twojego projektu. Metoda jest prosta i pozwala na radzenie sobie z problemami, których nie możesz ogarnąć typowym oprogramowaniem.
Sposób formatowania notatek jest oczywiście dowolny. Można je rozbudowywać, pokazywać lub ukrywać wybrane przez Ciebie informacje. Pokazałem tutaj prosty przykład, w którym wykorzystałem też inne przydatne opcje tekstu (np. rjust()
– wyrównywanie do prawej). Przykład ten oczywiście nie rozwiązuje wszystkich problemów (np. jednostki SI, grafiki, zapis do PDF etc.), ale cierpliwości :) Będzie niedługo o tym więcej. Póki co eksperymentuj i zobacz jak to działa z innymi funkcjami!
Podsumowanie
A teraz krótkie podsumowanie. W tej lekcji nauczyłeś się tworzyć i wyświetlać napisy w Pythonie. Poznałeś właściwości napisów (jak len()
, indeksowanie znaków etc.). Umiesz operować na napisach – łączyć je, powielać, przeszukiwać etc. Wiesz też jak formatować napisy, żeby wyglądały tak, jak tego chcesz. Potrafisz już tworzyć proste i szybkie raporty z Twoich obliczeń.
Możesz też ściągnąć spakowany plik .py z kodem, który pokazałem w tej lekcji.
Teraz spróbuj napisać własną procedurę obliczeniową i utworzyć dla niej raport z tych obliczeń. Co to będzie? Jeśli potrzebujesz pomocy – napisz mi o tym w komentarzu!
W następnym poście zajmiemy się tzw. listami!
Wpisy z cyklu „Python dla inżynierów„:
- Wprowadzenie do Pythona i Liczby
- Napisy (Strings)
- Listy
- (w opracowaniu)
Chcem kalkulator z przypisanymi liczbami np: 6 == 20, 5 == 10, 4 == 5, itd
który na koniec wszystko zsumuje
liczba_a = input(„Wprowadź liczbę całkowitą\n”)
liczba_b = input(„wprowadź liczbę rzeczywistą\n”)
liczba_a = int(liczba_a)
liczba_b = float(liczba_b)
liczba_ab = liczba_a * liczba_b
liczba_ba = str(liczba_ab)
print(„iloczyn liczb = ” + liczba_ba)
Nie potarafię wykonać takiego mnożenia. Czy otrzymałbym pomoc dlaczego?
liczba_a = input(„Wprowadź liczbę całkowitą”)
liczba_b = input(„wprowadź liczbę rzeczywistą”)
liczba_a = int(liczba_a)
liczba_b = float(liczba_b)
liczba_ab = liczba_a * liczba_b
liczba_ba = str(liczba_ab)
print(„iloczyn liczb = ” + liczba_ba)
Problem tkwił w cudzysłowie.
To jak to opisałeś przekonuje mnie do programowania.
Cały czas korzystam z excela.
Dzisiaj zainteresowałem się tym programem i spróbuję coś napisać.
Grzegorz, cieszę się, że spodobała Ci się forma. Python to pomocne i potężne narzędzie. Sam też ciągle się go uczę.
Powiedzenia w nauce!
Fajne wprowadzenie. Też interesuję się tematem programowania do zastosowań inżynierskich i szukam ciekawych lekcji. Jako laik mam jedno pytanie. Czemu wybrałeś właśnie Pythona?
Hej Zbyszek! Super, że zaciekawiły Cię lekcje Pythona. Mam nadzieję, że wszystko jest czytelne?
Jeśli chodzi o wybór języka, to próbowałem wcześniej Pascal (Delphi), śladowo też C++ i było nawet OK. Mam nawet kilka programików napisanych w Delphi. Po pewnym czasie zobaczyłem jednak, że np. w Delphi ciągle muszę tworzyć wiele rzeczy sam od nowa (np. funkcji, operacje na tablicach, całki etc.), bo nie ma tyle materiałów w sieci albo tylu aktywnych usersów.
Python przewijał się gdzieś obok od samego początku, ale dopiero po czasie go doceniłem. Przede wszystkim z racji prostoty składni, szybkości pisania kodu i – co bardzo ważne – masy dostępnych bibliotek. Dodatkowo od ręki miałem łatwo dostępne przykłady kodu w Pythonie. Patrząc teraz z dystansu, to nie żałuję ani trochę. Prostota składni Pythona i dostępność tak wielu bibliotek daje niesamowite możliwości. Myślę też, że obecnie Python jest jednym z najszybciej rozwijających się języków i wiele softów daje do siebie dostęp właśnie przez Pythona.
Witaj,
Wydaje się dość przejrzyście opisane i raczej z głową.
Jednak do obiektywnej odpowiedzi musiałbym spróbować coś samemu napisac ale jeszcze się za to nie zabrałem ;).
Oczywiście będę śledził Twojego bloga.
Odnośnie tematyki mam jedną uwagę. Oczywiście każdy program obliczeniowy pomagający w pracy jest dobrym pomysłem ale ja bardziej skłaniam się ku pomocy w rysowaniu. Czy planujesz jakiś przewodnik z tej dziedziny?
ZbyszekM try try try :) W moim przypadku tylko próby tak naprawdę się sprawdziły.
Co do programowania do pomocy w rysowaniu, to obecnie nie planuję takich przewodników. Nie mam doświadczenia w tym, więc nie chcę czarować.
Warto jeszcze zwrócić czytelnikom uwagę na styl kodu który na który w Python zwykło się zwracać uwagę
https://www.python.org/dev/peps/pep-0008/
Struhon, dobra uwaga. Dzięki! Nie mówiłem o tym tutaj wiele całkiem świadomie. Będę o tym mówił później przy omawianiu funkcji – tam, moim zdaniem, najlepiej będzie to widoczne. O PEP 8 napisałem przy akapicie „Zasady nazywania zmiennych” – zerknij.