Jeszcze przed pierwszymi zajęciami

Ankieta

Szanowny czytelniku, przed rozpoczęciem zajęć prosimy o przystąpienie do ankiety ewaluacyjnej.

Ankieta ewaluacyjna

Ankieta ewaluacyjna

Serwer Jupyter

Pod adresem: http://omega.smcebi.us.edu.pl dostępna jest spersonalizowana platforma do ćwiczeń. Detale logowania otrzymacie na pierwszych zajęciach.

Server Jupyter

Dedykowana plaftorma Jupyter

Lekcja 1. Co to takiego język Python. Zmienne oraz typy zmiennych.

Języki programowania, budowa i podział

Z wyjątkiem całkowicie niezrównoważonego zachowania, każda ludzka decyzja sprowadza się do wyboru jednej z dwóch możliwości

(Jeff Dunteman, Zrozumieć Asembler)

Program komputerowy to przepis jak coś zrobić. Nieco bardziej technicznie możemy powiedzieć, że jest to skończona ilość instrukcji prostych. Aby napisać program komputerowy posługujemy się pewnym schematem leksykalnym, który nazywamy językiem programowania. Kiedyś programy “pisało się”, dziurkując karty, dzisiaj zwykle otwieramy edytor tekstowy i wpisujemy komendy.

Wybór konkretnego języka programowania to wybór pewnego zestawu instrukcji prymitywnych, składni, semantyki, itp. Decydując się na dany język, musimy wybrać jak blisko/daleko chcemy być od języka maszyny. Języki programowania możemy dzielić na kilka sposobów:

  • języki wysokiego poziomu

    posiadają duży zestaw instrukcji prymitywnych, przykładowo możemy od razu mieć dostępną instrukcję, obliczającą pierwiastek, nie musimy poświęcać czasu na jej zaprogramowanie (Python, C, C++, .Net)

  • języki niskiego poziomu

    za ich pomocą przesuwamy części pamięci między konkretnymi rejestrami (asembler)

  • języki mieszane

    niejako hybryda dwóch powyższych.

Ze względu na zastosowanie możemy wyróżnić:

  • języki ogólnego zastosowania

    bardzo bogate w instrukcje prymitywne (C, C++, Python)

  • języki szczególnego zastosowania

    instrukcje prymitywne zorientowane na konkretne zastosowania (Matlab, R)

W końcu z powodów technicznych istnieją:

  • języki interpretowane (Python, HTML, PHP)

    operuje bezpośrednio na kodzie źródłowym, wykonanie programu przebiega w stadiach źródło - checker - interpreter - wyjście (wynik)

  • języki kompilowane (C, C++, Fortran)

    kod kompiluje się wstępnie do kodu obiektowego. Daje to lepszą kontrolę nad błędami jeszcze przed uruchomieniem programu oraz zwyczajowo bardziej sprawną sekwencję końcową. Stadia uruchomienia programu to:

    źródło - kompilator + checker - kod obiektowy - intepreter - wyjście

Informacja

Język Python jest interpretowanym językiem wysokiego poziomu i ogólnego zastosowania.

Na język programowania składają się:

  • konstrukcje prymitywne

    • literał - jednostka leksykalna reprezentująca określoną wartość, np: 1, ‘Ala’, 3.1415. Możemy wyróżnić cały ich szereg. W zasadzie wszystko zależy od wybranego przez nas języka programowania. Pewne podstawowe literały to
      • literał bitowy
      • literał liczbowy
      • literał łańcuchowy
      • literał logiczny
      • literał znakowy
      • literał pusty
      • literał tablicowy
      • literał wyliczeniowy
      • literał zbiorowy
      • literał zespolony
    • operator - takie jak +, -, itp.
  • składnia (syntaks)

    mówi nam o tym, jak poszczególne znaki możemy ze sobą łączyć, które symbole są legalne

    >>> 2 + 2  # zapis legalny
    >>> 2 2 +  # zapis nielegalny
    

    Język Python ma bardzo dobrą kontrolę nad poprawnością składni.

  • semantyka statyczna i pełna

    pierwsza mówi o tym które połączenia operatorów oraz literałów mają sens. Druga zapewnia jednoznaczny sens każdemu zdaniu.

Wprowadzenie do składni języka Python

Pracować z językiem Python możemy co najmniej na dwa sposoby:

  • W trybie interaktywnym, w powłoce.

    W typowej instalacji domowej, na lokalnym komputerze, aby zacząć korzystać z tego trybu należy uruchomić program python. Powłoka języka powinna zwrócić, tak zwany znak zachęty:

    >>>
    

    Aby zakończyć pracę w tym środowisku, można użyć funkcji:

    >>> exit()
    
  • Poprzez skrypty.

    Skrypty zawierają, w formie pliku tekstowego, sekwencję funkcji, wyrażeń, itp. Do ich tworzenia użyć można dowolnego edytora tekstów. Skrypty te powinny mieć rozszerzenie .py Typowy skrypt Pythona, w środowisku GNU/Linux rozpoczyna się linią:

    #!/usr/bin/python
    

Komentarze

Komentarze w języku Python poprzedzone są znakiem #. Wszystkie znaki następujące po #, a ciągnące się do końca linii, są ignorowane.

>>> # pierwsza linia komentarza

>>> print "Witaj Swiecie"  # druga linia komentarza

Dodatkowo, istnieją tak zwane komentarze blokowe, obejmujące dowolny tekst wpisany w potrójne cudzysłowy lub apostrofy.

""" ten tekst, poprzedzony jest,
    oraz zakończony
    trzema cudzysłowami,
    zatem potraktowany zostanie jako komentarz
"""

Jest to w istocie tak zwany literał znakowy, jego szersze użycie skomentowane jest w dalszej części kursu.

Wcięcia

W języku Python istotne są tak zwane wcięcia. To one definiują logiczne bloki kodu. Poprzez bloki, rozumiemy na przykład instrukcje sterujące takie jak: if, for, itp. Instrukcje sterujące, są tematem drugiej lekcji kursu. Bloki kodu, nie są ograniczone żadnymi nawiasami, klamrami, czy słowami kluczowymi, tak jak to ma miejsce w innych językach programowania.

>>> owoce = 'gruszka'
>>> if owoce == 'gruszka': # jeśli warunek jest spełniony,  to
        >>>print('Bardzo lubie gruszki!')       #wykonaj
        >>>print('I moglbym to powiedziec 100 razy...') # ciąg kolejnych
        >>>print(100 * (owoce + '! ')) # poleceń ...

W tym języku, jedynym separatorem innym niż wcięcia jest :. Wstawiając wcięcie, zaczynamy blok, a kończymy go zmniejszając wielkość wcięcia do poprzedniej wartości. Wcięciami mogą być wszystkie białe znaki, czyli w szczególności spacje i tabulatory. Należy zapamiętać

W jednym bloku ilość znaków wcięcia musi być taka sama.

Dzielenie linii

Wyrażenia w Pythonie kończą się wraz ze znakiem nowej linii. Jeśli chcemy je kontynuować to fakt ten musimy zaznaczyć poprzez \.

>>> suma = skladnik_pierwszy + \
        >>> skladnik_drugi + \
        >>> skladnik_trzeci

Wyjątkiem od tej reguły dzielenia wyrażeń, są te, które zawarte są w nawiasach: (), [], {}.

Aby w jednej linii wprowadzić wiele wyrażeń, należy się posłużyć ; (zupełnie jak w języku C).

>>> napis = "Witaj Swiecie"; print(napis)
Witaj Swiecie

Słowa zarezerwowane:

Poniżej, w formie tabeli, wymienione są tak zwane słowa zarezerwowane. Nie mogą być one używane jako nazwy zmiennych, stałych czy funkcji.

and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield
False None True

Uwaga, należy pamiętać, że w Pythonie wielkość liter ma znaczenia. Wyrazenie oraz wyrazenie to dwie różne zmienne.

Typy i operatory

Powłoka Python jako kalkulator

Powłoka języka Python, może być używana jako mniej lub bardziej zaawansowany kalkulator. Zastosowanie to jest tylko pozornie trywialne. Opanowanie, podstawowych technik oferowanych przez tę funkcję, jest dobrym ćwiczeniem, przed bardziej zaawansowanymi tematami. Jest to również dobre miejsce, by zapoznać się z tak zwanymi typami danych, na których można pracować w języku Python.

Poszczególne typy danych różnią się między sobą zbiorami dozwolonych wartości oraz zestawem dozwolonych operacji, które można na nich wykonać.

W dużym uproszczeniu, w języku Python istnieją dwa podstawowe typy liczbowe:

  • typ całkowity int:

    Stowarzyszone są z nim następujące operatory: +, -, *, /, //, %. Ten typ danych, możesz utożsamiać z liczbami całkowitymi. Reprezentowane są jako liczby niezakończone kropką.

    >>> 2 + 2
    4
    

    Proszę pamiętać, że odstępy między symbolami działania a jego argumentami (zwanymi dalej operandami) nie są istotne, wprowadzono je dla lepszej czytelności.

  • typ zmiennoprzecinkowy float:

    Stowarzyszone są z nim następujące operatory: +, -, *, /, //. Ten typ danych, możesz utożsamiać z liczbami rzeczywistymi. Część dziesiętna jest oddzielona od części całkowitej za pomocą znaku kropki.

    >>> 4.0 - 1.0
    3.0
    

Prócz tego, w języku Python istnieją:

  • typ danych tekstowych str:

    związany jest on z obsługą napisów i pojedynczych znaków. Stowarzyszone są z nim następujące operatory: +, *

  • typ logiczny bool,

    przyjmować może dwie wartości: True i False. Więcej o tym typie danych dowiecie się na lekcji drugiej.

  • typ NoneType: None

    Wartość używana do wyrażania braku sensownej wartości, nieistnienia danej, itp.

Żeby sprawdzić jakiego typu jest dany obiekt, można użyć funkcji type(), przykładowo:

>>> type(3)
<type 'int'>
>>> type(7.5)
<type 'float'>
>>> type("a")
<type 'str'>

Poznajmy podstawowe operacje matematyczne zaimplementowane w powłoce:

  • Suma, a + b:

    realizowana jest za pośrednictwem operatora +:

    >>> 5 + 6
    11
    >>> 5.0 + 1.2
    6.2
    >>> -3.4 + 6
    2.6
    >>> type(-3.4 + 6)
    <type 'float'>
    

    Zwrócić należy uwagę na możliwość wykonywania operacji na dwóch różnych typach danych! W takim przypadku dokonane zostanie rzutowanie typów. Jest to konwersja, zmiana do wartości pewnego typu na odpowiadającą jej wartość innego typu. Nie każde rzutowanie jest możliwe do wykonania!

  • Różnica, a - b:

    realizowana jest za pośrednictwem operatora -:

    >>> 5 - 6
    -1
    >>> 5.0 - 1.2
    3.8
    >>> -3.4 - 6
    -9.4
    
  • Iloczyn, a * b:

    realizowane jest za pośrednictwem operatora *:

    >>> 5 * 6
    30
    >>> 5.0 * 1.2
    6.0
    >>> - 3.4 * 6
    -20.4
    
  • Iloraz, a / b oraz a // b:

    realizowany jest za pośrednictwem operatorów / oraz //:

    >>> 9 / 2
    4
    >>> 9.0 / 2.0
    4.5
    >>> 9.0 // 2
    4.0
    >>> 9 // 2
    4
    

    W przypadku działań na liczbach typu float, a // b oznacza dzielenie całkowite, z odrzuceniem części ułamkowej.

  • Reszta z dzielenia, a % b:

    realizowane jest za pośrednictwem operatora %:

    >>> 9 % 2
    1
    >>> 9.0 % 2.0
    1.0
    >>> 9.0 % 2
    1.0
    
  • Potęgowanie, a ** b:

    realizowane jest za pośrednictwem operatora *:

    >>> 2 ** 3
    8
    >>> 2 ** -2
    0.25
    

Wymienione powyżej +, -, *,**, /, //, % noszą nazwę operatorów arytmetycznych. Kolejność wykonywania działań jest zgodna z tradycyjnie przyjętą. Dozwolone jest stosowanie nawiasów okrągłych. Mogą one być zagnieżdżane.

Należy pamiętać, że jeśli zapis liczby zaczyna się od:

  • 0b to oznacza to liczbę w zapisie dwójkowym,
  • 0x to oznacza to liczbę w zapisie szesnastkowym,
  • 0 to oznacza to liczbę w zapisie ósemkowym.

Bardziej zaawansowane funkcje matematyczne dostępne są po zaimportowaniu modułu math. Więcej o modułach dowiesz się z dodatku 1 (moduły).

Operatory - ciąg dalszy

  • Operatory logiczne:
    • and zwraca wartość True wtedy i tylko wtedy, gdy oba operandy są prawdziwe,
    >>> False and True
    0
    
    • or zwraca wartość True, gdy którykolwiek z operandów jest True,
    >>> False or false
    0
    
    • not operator używany do zamiany wartości logicznej operandów.
    >>> not (True and True)
    False
    
  • Operatory porównania:
    • == - jeśli wartość dwóch operandów jest równa to wyrażenie jest prawdziwe, jeśli nie to jest fałszywe,
    >>> 2 + 2 == 4
    True
    >>> 5.0 == 5 # porównywanie w ramach dwóch róznych typów - automatyczna konwersja
    True
    >>>
    >>> "e" == "f" # przy sprawdzaniu napisów obowiązuje porządek słownikowy
    False
    
    • <> - jeśli wartość dwóch operandów nie są równie to wyrażenie jest prawdziwe,
    >>> 2 + 2 <> 5
    True
    >>> 5.0 <> 5
    False
    >>>
    >>> "e" <> "f"
    True
    
    • > - jeśli wartość lewego operandu jest większa niż wartość prawego, to wyrażenie jest prawdziwe,
    >>> 2 + 2 > 5
    False
    >>> 5.0 > 4
    True
    >>>
    >>> "e" > "f"
    False
    
    • < - jeśli wartość lewego operandu jest mniejsza niż wartość prawego, to wyrażenie jest prawdziwe,
    >>> 2 + 2 < 5
    True
    >>> 5.0 < 4
    False
    >>>
    >>> "e" < "f"
    True
    
    • >= - jeśli wartość lewego operandu jest większa lub równa niż wartości prawego, to wyrażenie jest prawdziwe,
    >>> 2 + 2 >= 5
    False
    >>> 5.0 >= 5
    True
    >>>
    >>> "e" >= "f"
    False
    
    • <= - jeśli wartość lewego operandu jest mniejsza lub równa wartości prawego, to wyrażenie jest prawdziwe
    >>> 2 + 2 < 5
    True
    >>> 5.0 < 4
    False
    >>>
    >>> "e" < "f"
    True
    
    • specyficznym sposobem przyrównywania jest sprawdzenie, czy dwa obiekty są tożsame - czyli czy są tym samym obiektem. Służą do tego operatory is oraz is not.
    >>> 19998889998 is 19998889997 + 1
    False
    >>> 19998889998 == 19998889997 + 1
    True
    
  • Operator przypisania
    • = ten operator przypisuje wartość prawego operandu do operandu lewego. Najczęstszym jego użyciem jest deklaracja zmiennych. Nową zmienną inicjujemy, zapamiętując pewną wartość pod nowo nadaną nazwą:

      nazwa = wartosc
      

    Przyjmuje się pewną konwencję dla nazw zmiennych:

    >>> x = 0
    >>> X = 0
    >>> zmienna = 0  # zalecane dla nazw modułów
    >>> ZMIENNA = 0
    >>> pewna_zmienna = 0  # zalecane dla nazw funkcji i metod
    >>> PEWNA_ZMIENNA = 0  # zalecane dla stałych
    >>> pewnaZmienna = 0  # zmienne
    >>> PewnaZmienna = 0  # zalecane dla nazw klas
    

    Nazwa powinna być słowem składającym się wyłącznie z liter łacińskich, cyfr i znaku podkreślenia, nie może rozpoczynać się cyfrą. Nazwa nie może też być słowem kluczowym języka Python. Nie może zawierać spacji. Jeszcze raz należy podkreślić, że wielkie i małe litery są w nazwach rozróżniane. Jedna wartość może być przypisana jednocześnie kilku zmiennym:

    >>> x = y = z = 0  # Zero x, y i z
    >>> x
    0
    >>> y
    0
    >>> z
    0
    

    W innym wariancie można:

    >>> u, v = 100, 200
    >>> u
    100
    >>> v
    200
    

    w jednej instrukcji przypisać jedną wartość pierwszej zmiennej, a inną drugiej. Jest to bezpośrednie wykorzystanie nieco innego typu danych zwanego krotką. O nim powiemy w lekcji drugiej. Korzystając z tej konwencji można zamienić wartości między zmiennymi:

    >>> u, v = 100, 200
    >>> u, v = v, u
    >>> u
    200
    >>> v
    100
    

    Można zmiennej, modyfikować przypisaną wartość:

    >>> x = 10
    >>> x = x + 10
    >>> x
    20
    >>> x = x * 2
    >>> x
    40
    

    Aby usunąć przypisaną zmiennej wartość (niejednokrotnie w praktyce, usuwając przez to samą zmienną) należy odwołać się do funkcji del.

    >>> zmienna = 33.0
    >>> zmienna
    30.0
    >>> del zmienna
    >>> zmienna
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'zmienna' is not defined
    
    • += operator ten przypisuje lewemu operandowi wartość sumy lewego i prawego
    >>> k = 20
    >>> l = 30
    >>> k += l
    >>> k
    50
    
    • -= operator ten przypisuje lewemu operandowi wartość różnicy lewego i prawego
    >>> k = 20
    >>> l = 30
    >>> k -= l
    >>> k
    -10
    
    • *= operator ten przypisuje lewemu operandowi wartość iloczynu lewego i prawego
    >>> k = 20
    >>> l = 30
    >>> k *= l
    >>> k
    600
    
    • /= operator ten przypisuje lewemu operandowi wartość ilorazu lewego i prawego
    >>> k = 20.0
    >>> l = 30.0
    >>> k /= l
    >>> k
    0.6666666666666666
    

Literały liczbowe

  • liczba_int = 2
  • liczba_float = 3.2
  • liczba_complex = 2.0 + 3.0j

Literały znakowe

  • str1 = ‘ala’
  • str2 = “ala”
  • str3 = ‘’’ala’’’
  • str4 = “””ala”””

Istnieje specjalna konstrukcja ciągu znaków zaczynająca i kończąca się trzema cudzysłowami “””. Jest to ciąg znaków charakterystyczny dla języka Python i może on ciągnąć się przez wiele linii. Odstępy użyte w środku zostaną zachowane. Ponadto możemy w takim środowisku używać pojedynczych apostrofów i cudzysłowów w zasadzie dowolnie. Przed literałem łańcuchowym takim jak powyżej “ala ma kota” możemy użyć prefiksów r,u,b. Oznaczają one odpowiednio:

  • r

    (raw, raw string literał) w tak oznaczonym literale łańcuchowym wszystkie znaki traktowane będą dosłownie, np. ukośnik wsteczny traktowany będzie jak zwykły ukośnik wsteczny np: r”ala ma kota”, r’sin to komenda LaTeX{}a’

  • u

    (unicode) napis w Unikodzie np: u”ala ma kota”, u’zażółć gęślą jaźń’

  • b

    napis w ASCII np: b”ala ma kota”, b’A quick brown fox jumps over the lazy dog’

Instrukcje wejścia i wyjścia

Instrukcja print

Formatowanie proste

>>> imie = ‘Ala’
>>> wiek = 13
>>> print imie, "ma", wiek, "lat"
>>> print "liczba pi =", 3.1415, "a jej kwadrat to", 3.1415 ** 2

oraz złożone (podobnie jak w C)

>>> print "%s ma %d lat" % (imie, wiek)
>>> print "liczba pi = %f, a jej kwadrat to %f" % (3.1415, 3.1415 * 3.1415)

lub w nowym (choć już nie takim nowym) typie, poprzez metodę format

>>> print '{0}, {1}, {2}'.format('a', 'b', 'c')
>>> print '{}, {}, {}'.format('a', 'b', 'c')
>>> print '{2}, {1}, {0}'.format('a', 'b', 'c')
>>> print '{2}, {1}, {0}'.format(*'abc')
>>> print '{0}{1}{0}'.format('abra', 'cad')
>>> print 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')

Polecenie print drukuje na ekran ciąg znaków - wszystko, co zawarte jest pomiędzy cudzysłowami (lub apostrofami). Pomiędzy nimi występują specjalne znaki, zaczynające się od znaku %. W ich miejsce podstawiane są odpowiednio interpretowane wartości zmiennych (bądź literały) występujące za identycznym znakiem, znajdującym się za ciągiem zawartym w cudzysłowach. Pierwsza wartość z nawiasu podstawiana jest w miejsce pierwszego wystąpienia %f. Analogicznie druga wartość podstawiana jest w miejsce drugiego wystąpienia %f. Znak f, występujący po procencie wymusza interpretację argumentu jako liczby zmiennoprzecinkowej (float). Inne możliwe formatowania print

  • %s ciąg znaków
  • %d liczba całkowita
  • %0Nd liczba całkowita poprzedzona zerami w taki sposób, że otrzymujemy N cyfr na wyjściu (pod warunkiem, że N ¡ liczby cyfr danej liczby)
  • %f liczba zmiennoprzecinkowa
  • %e notacja naukowa (e przy eksponencie)
  • %E notacja naukowa (E przy eksponencie)
  • %g,%G notacja dziesiątkowa
  • %Xz formatowanie liczby z do prawej dla pola o szerokości X print "%31f" % 0.0123412
  • %-Xz formatowanie liczby z do lewej dla pola o szerokości X print "%-31f" % 0.0123412
  • %.Yz formatowanie liczby z Y miejscami po przecinku
  • %X.Yz formatowanie liczby z Y miejscami po przecinku w polu o szerokości X
  • %% znak procenta

Instrukcje input oraz raw_input

Pobranie wartości odbywa się za pośrednictwem jednej z dwóch funkcji:

  • raw_input(komunikat) - wartość przekazana przez tę funkcję jest zawsze tekstem.

    >>> imie = raw_input("Jak masz na imię? ")
    Jak masz na imię? Marian
    >>> imie
    'Marian'
    
  • input(komunikat) - tekst wprowadzony przez użytkownika jest interpretowany, a typ wartości wynikowej jest ustalany w czasie interpretacji

    >>> x = input('Ile godzin ma doba? ')
    Ile godzin ma doba? 24
    >>> print 'Doba ma', x, 'godziny'
    Dobra ma 24 godziny
    >>> x = input('Ile minut ma godzina? ')
    Ile minut ma godzina? 60.0
    >>> print 'Godzina ma', x, 'minut.'
    godzina ma 60.0 minut.
    
Next Section - Zadania do lekcji 1