05 - Skrypty i komunikacja z użytkownikiem
Dotychczas używaliśmy poleceń jednolinijkowych albo krótkich kodów. Przyjdzie jednak czas na napisanie nieco dłuższych programów. Poznajmy zatem podstawowe zasady pisania i uruchamiania skryptów. W trakcie tej lekcji poznamy także podstawy komunikacji z użytkownikiem w linii komend.
Tworzymy i uruchamiamy skrypt
Do pisania skryptów potrzebny jest dobry edytor tekstu (nie jest nim np. Word) lub zintegrowane środowisko programistyczne. Wybór jest szeroki i nie będziemy teraz rozwijać tego tematu. Do tworzenia programu użyjemy teraz Visual Studio Code, który można pobrać ze strony https://code.visualstudio.com/.
Utwórz katalog w którym będziesz zapisywać skrypty.
W Visual Studio (lub innym wybranym edytorze) utwórz nowy plik i zapisz go jako program-01.py
. Zauważ, że plik ma przedłużenie py
, które jest charakterystycznym przedłużeniem dla skryptów Pythona. Przy zapisywaniu pliku Visual Studio poprosi o zainstalowanie rozszerzenia Pythona.
Zgadzamy się.
Możesz też zainstalować kolejne dodatki.
Następnie w pliku umieść następujący kod:
print('Witaj ponownie Świecie!')
Witaj ponownie Świecie!
Zapisz plik.
Teraz otwórz okno terminala. W przypadku systemu Windows i zainstalowanego środowiska Anaconda, możesz uruchomić Anaconda Prompt lub Anaconda Navigator z menu Start a następnie wybrać ,,CMD.exe Prompt’'.
W tym drugim przypadku (,,CMD.exe Prompt’’) pod Windows pokaże się takie okienko:
Pod Linuksem może ono wyglądać np. tak:
W obu przypadkach pojawiła się linia, w której możemy wpisać polecenia. Teraz trzeba przejść do katalogu, w którym został zapisany plik. W obu systemach służy do tego komenda cd
ale trzeba pamiętać, że w różny sposób zapisuje się ścieżkę prowadzącą do katalogu, zwróć uwagę na rodzaj ukośnika między nazwami katalogów. W Windows jest to \
w Linuksie i w MacOS używamy znaku /
.
Zatem pod Windows polecenie może wyglądać tak:
cd Documents\Python-programowanie
Pod Linuksem (i MacOS):
cd Dokumenty/python_dla_biologow/skrypty/
Teraz uruchamiamy skrypt:
python proba-01.py
lub
python3 proba-01.py
Pokazuje się wynik:
Witaj ponownie Świecie!
Wprowadzanie danych przez użytkownika
Teraz powróćmy do edytora w którym piszemy skrypt. Usuń polecenie. Wpisz kolejne polecenia i uruchom skrypt.
sekwencja = input('Podaj sekwencję: ')
print(sekwencja)
W terminalu pojawi się tekst, oraz zachęta w postaci migającego kursora, do wpisania sekwencji:
Podaj sekwencję:
Wpisz sekwencję i wciśnij Enter
. Zostanie wydrukowana sekwencja lub inny ciąg znaków, który został wpisany.
Podaj sekwencję: ACCAGAAA
ACCAGAAA
Jak łatwo się domyślić, za pobieranie sekwencji odpowiadało polecenie input()
. Można, jako argument, podać w nawiasach ciąg znaków, który zostanie wydrukowany jako ,,zachęta’’ do wprowadzenia danych.
Teraz spróbujmy pobrać dwie liczby i je przez siebie pomnożyć. Usuń poprzednio wpisane polecenia i wprowadź do skryptu nowe:
liczba1 = input('Podaj pierwszą liczbę: ')
liczba2 = input('Podaj drugą liczbę: ')
wynik = liczba1 * liczba2
print(f'Wynik: {wynik}')
Podaj pierwszą liczbę: 12
Podaj drugą liczbę: 23
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-dcafbc6b7a68> in <module>
1 liczba1 = input('Podaj pierwszą liczbę: ')
2 liczba2 = input('Podaj drugą liczbę: ')
----> 3 wynik = liczba1 * liczba2
4 print(f'Wynik: {wynik}')
TypeError: can't multiply sequence by non-int of type 'str'
Po uruchomieniu i wpisaniu liczb pojawił się komunikat błędu.
Okazuje się, że liczby, które wprowadziliśmy zostały potraktowane jako ciągi znaków, a tych nie można przez siebie pomnożyć. Trzeba je wcześniej przekonwertować na typ liczbowy.
Poprawmy zatem nasz kod:
liczba1 = int(input('Podaj pierwszą liczbę: '))
liczba2 = int(input('Podaj drugą liczbę: '))
wynik = liczba1 * liczba2
print(f'Wynik: {wynik}')
Podaj pierwszą liczbę: 12
Podaj drugą liczbę: 23
Wynik: 276
Podobnie można, korzystając z innych funkcji poznanych na lekcji poświęconej zmiennym i typom danych, konwertować dane wprowadzone przez użytkownika na inne typy liczbowe.
liczba1 = float(input('Podaj pierwszą liczbę: '))
liczba2 = float(input('Podaj drugą liczbę: '))
wynik = liczba1 * liczba2
print(f'Wynik: {wynik}')
Podaj pierwszą liczbę: 12
Podaj drugą liczbę: 13
Wynik: 156.0
Uruchamianie skryptu bez opuszczania edytora
Jeśli piszemy skrypt w Visual Studio można go uruchomić bezpośrednio z poziomu edytora. Służy do tego skrót Ctrl+F5
, ikona z zieloną strzałką, lub pozycja w menu: Run -> Run Without Debugging
.
Poniżej okienka edytora pojawi się okienko terminala gdzie pokażą się efekty działania programu.
Warto też wiedzieć, że mamy możliwość wyboru interpretera Pythona, co może mieć znaczenie zwłaszcza, gdy mamy zainstalowanych jego kilka wersji. W takim przypadku może się okazać, że domyślnie włączy się np. Python 2.7
a nasz kurs bazuje na Python 3.8.x
.
Można to zmienić klikając w lewy dolny róg okna Visual Studio:
Komentarze i czytelny kod
Pisząc program, zwłaszcza jeśli jest on długi i złożony, warto (a nawet trzeba!) umieszczać w nim komentarze. Mogą one służyć wyjaśnieniu działania kodu innej osobie, która będzie chciała w przyszłości pracować nad naszym dziełem, lub je sprawdzać, ale przede wszystkim służą samemu programiście. Kiedy piszesz kod, prawdopodobnie jego działanie jest dla Ciebie w momencie tworzenia w pełni zrozumiałe. Jednak praktyka wskazuje, że jeśli wrócisz do niego po kilku dniach, tygodniach czy tym bardziej miesiącach, może się okazać, że to co było oczywiste, staje się mocno niejasne i trzeba czasem spędzić dużo czasu, żeby zrozumieć co (parafrazując klasyka) ,,programista miał na myśli’'.
Czas poświęcony na pisanie komentarzy, choc może się wydawać początkowo stracony, często zwraca się później z nawiązką. Zatem warto jest wyrobić w sobie zwyczaj komentowania kodu, zwłaszcza jeśli przypuszczasz, że może być w przyszłości modyfikowany czy ponownie wykorzystany na przykład przy pisaniu kolejnych programów.
Odpowiednie komentowanie jest jednym z aspektów pisania czytelnego kodu. Kod powinien być pisany w taki sposób, żeby był możliwie zrozumiały dla człowieka (programisty). Ma to znaczenie nie tylko przy pisaniu i modyfikowaniu programów ale także przy usuwaniu zawartym w nich błędów (debugowaniu). Bardzo rzadko zdarza się, że napisany dłuższy kod działa od razu bezbłędnie. Zwykle znacznie więcej czasu zajmuje znajdywanie i poprawianie w nim błędów niż napisanie pierwszej wersji programu. Im kod będzie czytelniej napisany i lepiej skomentowany, tym poprawianie go będzie łatwiejsze i krótsze.
W trakcie kursu będę tłumaczył niektóre zasady pisania czytelnego kodu w Pythonie, ale warto także zapoznać się z bardziej kompletnym omówieniem problemu np. pod adresem https://github.com/google/styleguide/blob/gh-pages/pyguide.md.
Komentarz jest dowolnym tekstem, który nie jest interpretowany przez komputer. Jak więc umieścić go w kodzie, tak aby nie został potraktowany jako fragment kodu, który należy wykonać? W tym celu można użyć znaku #
. Wszystko co znajdzie się w linii po prawej stronie kodu od tego znaku, jest traktowane jak komentarz. Znak ten może znaleźć się na początku linii, wtedy cała linia jest traktowana jako komentarz, albo po prawej stronie fragmentu kodu, w takim przypadku od miejsca wystąpienia #
do końca linii, wszystko będzie traktowane jako komentarz:
# Pobranie danych od użytkownika
liczba1 = float(input('Podaj pierwszą liczbę: ')) # Pierwsza liczba
liczba2 = float(input('Podaj drugą liczbę: ')) # Druga liczba
# Obliczanie wyniku
wynik = liczba1 * liczba2
# Drukowanie wyniku
print(f'Wynik: {wynik}')
Podaj pierwszą liczbę: 2.3
Podaj drugą liczbę: 3.7
Wynik: 8.51
Jest jeszcze inny sposób umieszczania komentarzy, stosowany zwłaszcza, jeśli składa się z kilku linijek. W taki przypadku można zamiast umieszczać na początku każdej z nich #
, zamknąć całość w parze potrójnych cudzysłowów:
"""
Program, który pobiera od użytkownika dwie liczby,
które następnie mnoży przez siebie
i wypisuje wynik.
"""
# Pobranie danych od użytkownika
liczba1 = float(input('Podaj pierwszą liczbę: ')) # Pierwsza liczba
liczba2 = float(input('Podaj drugą liczbę: ')) # Druga liczba
# Obliczanie wyniku
wynik = liczba1 * liczba2
# Drukowanie wyniku
print(f'Wynik: {wynik}')
Podaj pierwszą liczbę: 2.3
Podaj drugą liczbę: 4.5
Wynik: 10.35
Otaczanie komentarza przez """
ma jeszcze inne zastosowania, do którego wrócimy później.
Komentowanie linii wykorzystuje się także w inny sposób. Można ,,wyłączać’’, pewne fragmenty kodu, na przykład podczas debugowania, albo przeciwnie, kiedy część kodu służy nam wyłącznie podczas testowania a podczas normalnego funkcjonowania jest zbędna:
"""
Program, który pobiera od użytkownika dwie liczby,
które następnie mnoży przez siebie
i wypisuje wynik.
"""
# Pobranie danych od użytkownika
liczba1 = float(input('Podaj pierwszą liczbę: ')) # Pierwsza liczba
liczba2 = float(input('Podaj drugą liczbę: ')) # Druga liczba
# Obliczanie wyniku
wynik_mnozenia = liczba1 * liczba2
# Drukowanie wyniku mnożenia
# print(f'Wynik mnożenia: {wynik_mnozenia}')
# Drukowanie końcowego wyniku
koncowy_wynik = wynik_mnozenia ** 2
print(f'Końcowy wynik: {koncowy_wynik}')
Podaj pierwszą liczbę: 2.3
Podaj drugą liczbę: 24.1
Końcowy wynik: 3072.4849
W powyższym, nieco rozbudowanym kodzie, linia print(f'Wynik mnożenia: {wynik_mnozenia}')
może być zbędna dla normalnego funkcjonowania programu, ale gdybyśmy chcieli sprawdzić np. czy mnożenie działa prawidłowo, to można ją ,,odkomentować’’ i wtedy wynik się wyświetli.
Spyder
Jak wspomniałem powyżej, istnieje wiele środowisk programistycznych ułatwiających programowanie w Pythonie. Na razie spotkaliśmy się z Visual Studio Code, ale warto też zwrócić uwagę na program Spyder, który domyślnie instaluje się wraz ze środowiskiem Anaconda. Być może bardziej przypadnie Ci do gustu. Po uruchomieniu może pojawić się komunikat, o dostępności nowej wersji programu, w takim wypadku warto go zaktualizować zgodnie z instrukcją znajdującą się w okienku z komunikatem, wykonując kolejno komendy w Anaconda Prompt:
conda update anaconda
conda install spyder=5.0.5
Porównaj jednak powyższe polecenia z komendami w okienku z informacją, ponieważ mogą się różnić, zwłaszcza pod względem numeru aktualnej wersji Spyder-a.
Po zresetowaniu Anaconda Navigator pojawi się wśród programów do wyboru zaktualizowana wersja Spyder-a. Można go też uruchomić bezpośrednio wpisując w Menu Start (Windows): Spyder
, wtedy pojawi się odpowiednia pozycja, albo wpisując w terminalu lub Anaconda Prompt polecenie spyder
.
Po uruchomieniu pojawi się krótki samouczek.
Warto też zainstalować narzędzie Kite (pojawi się odpowiednie okienko), które znacznie ułatwia pracę. Jeśli nie pojawi się automatycznie okienko z taką propozycją, można uruchomić w Tools
-> Install Kite completion engine
. Niestety, na starszych komputerach może się okazać, że instalacja Kite nie jest możliwa.
Zadanie
Zmień programy, które były zadaniem z lekcji 02 (z późniejszymi modyfikacjami) tak, aby tworzyły skrypty uruchamiane z linii komend, a dane wprowadzał użytkownik. W skryptach umieść komentarze.