Python podstawy programowania

Podobne dokumenty
Wykresy i interfejsy użytkownika

Kurs rozszerzony języka Python

Zaawansowany kurs języka Python

Język Python. Język Python 1/35

Wstęp do Pythona. Janusz Szwabiński. Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński p.1/36

Kurs rozszerzony języka Python

Programowanie obiektowe

Języki skryptowe w programie Plans

Środowisko programisty

Python. Wprowadzenie. Jolanta Bachan

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Wstęp do programowania

Podstawy. Jan Koprowski Politechnika Gdańska, FTiMS Informatyka Stosowana

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Wstęp do programowania

Przegląd języka Python. Łukasz Anwajler

Python wstęp do programowania dla użytkowników WCSS

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Python dla początkujących. Małgorzata Niewiem AGH, GGiOŚ, Katedra Geoinformatyki i Informatyki Stosowanej SATIM Satelitarny Monitoring

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

KOTLIN. Język programowania dla Androida

Programowanie w języku Python. Grażyna Koba

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Język C++ wykład VIII

Bash - wprowadzenie. Bash - wprowadzenie 1/39

System operacyjny Linux

Podstawy Programowania C++

Kurs WWW. Paweł Rajba.

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy programowania skrót z wykładów:

Redis, skrypty w języku Lua

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Zaawansowany kurs języka Python

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Oracle PL/SQL. Paweł Rajba.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Python. Skąd taka nazwa? Kurs systemu UNIX 1


Podstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski

Podstawy programowania w Pythonie

Microsoft IT Academy kurs programowania

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

PHP: bloki kodu, tablice, obiekty i formularze

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Python podstawy programowania

Wykład 2 Składnia języka C# (cz. 1)

Programowanie RAD Delphi

Programowanie obiektowe

Technologie cyfrowe semestr letni 2018/2019

Temat zajęć: Tworzenie skryptów powłoki systemu operacyjnego.

Szablony klas, zastosowanie szablonów w programach

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Środowisko programisty

Python wstęp. Michał Bereta

TEMAT : KLASY DZIEDZICZENIE

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Programowanie robota mobilnego E-puck w języku Python

2. Składnia Pythona. Robert Janczewski. Gdańsk, 2014

Języki i metody programowania

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Technologie cyfrowe semestr letni 2018/2019

Wprowadzenie do Scilab: podstawy języka Scilab

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 2

MATERIAŁY DO ZAJĘĆ II

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

PODSTAWY BAZ DANYCH 13. PL/SQL

Przeciążanie operatorów

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

SWIFT. Zaawansowane Programowanie Obiektowe

1 Podstawy c++ w pigułce.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

PARADYGMATY PROGRAMOWANIA Wykład 4

TEI. Dr Wojciech Palubicki

Podstawy Programowania Podstawowa składnia języka C++

Wprowadzenie do Python

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Definiowanie własnych klas

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Podstawy programowania w Pythonie

Listy, krotki, słowniki, funkcje

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Język ludzki kod maszynowy

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

G PROGRAMMING. Part #4

Transkrypt:

Python podstawy programowania Kurs w ramach przedmiotu: Symulacja komputerowa systemów dr inż. Krzysztof Czarnecki Politechnika Gdańska Katedra Systemów Elektroniki Morskiej 2014

Plan Słowo wstępu Ogólnie o typowaniu Instrukcje sterujące Programowanie obiektowe interfejs do obiektu Moduły zewnętrzne Wybrane operacje na plikach Obsługa wyjątków Wykres dyskretnej funkcji jednej zmiennej Przetwarzanie wektorów, macierzy Analiza widmowa sygnału Generacja addytywnego szumu białego (AWGN) Generacja sygnału świergotowego Symulacja transmisji danych w paśmie podstawowym Programowanie obiektowe w służbie SKS

Zakres kursu, popularność Pythona Niniejszy kurs obejmuje wybrane zagadnienia języka Python. Wspólnym mianownikiem wszystkich prezentowanych tu zagadnień jest implementacja komputerowej symulacji systemów, zwłaszcza analizy i przetwarzania sygnałów, oraz graficzna prezentacja zobrazowań. Elastyczność, wieloplatformowość, dość prosta składnia, ogromna liczba dodatkowych modułów oraz fakt, iż język Python jest udostępniany na wolnej licencji sprawia, że język ten jest jednym z najpopularniejszych języków programowania. www.codeeval.com, spectrum.ieee.org

Instalacja interpretera języka Python Instalacja w systemie Linux należy wydać następujące polecenie w terminalu: apt-get install python3 (Ubuntu, Mint) yum install python3 (Fedora)... (inne Linuksy) Instalacja w systemie Windows należy ściągnąć najnowszą wersję ( 3.3.0) instalatora ze strony projektu: www.python.org/download/ i postępować zgodnie z instrukcjami.

Wybór zintegrowanego środowiska programistycznego IDE: ang. Integrated Development Environment Do oddzielenia bloków kodu stosuje się wcięcia tabulatora. Dlatego zaleca się stosowanie zaawansowanych edytorów, które będą zapewniały, aby komunikat IndentationError: unexpected indent pojawiał się jak najrzadziej. Często stosowane IDE / edytory: PyCharm IDLE Python Emacs, Vim Notepad++ Eclipse skrypt-1.py 1 # blok 1 x = 1 3 print ("x =", x) if True : # po dwukropku nast ę puje blok,, podrz ę dny 5 # blok 2 7 y, z = 2, 3 print (" x + y + z =", x+y+z)

Uruchomienie skryptu Skrypt napisany w języku Python powinien rozpoczynać się od wskazania położenia interpretera w systemie plików oraz wyboru kodowania tekstu. Informacje te przekazuje się w dwóch pierwszych liniach skryptu jako komentarze: skrypt-2.py 1 #!/ usr / bin / python # -*- coding : utf -8 -*- Skrypt można uruchomić za pośrednictwem powłoki (Linux, Unix): bash python skrypt -2. py lub po nadaniu praw do wykonywania, bezpośrednio (Linux, Unix): 1 chmod a+x skrypt -2. py./ skrypt -2. py bash IDE m.in. udostępniają intuicyjne interfejsy do uruchamiania skryptów. (Linux, Windows,...)

Hello world! W języku Python deklaracja zmiennej odbywa się automatycznie przy jej inicjacji. Co więcej nie trzeba troszczyć się o usuwanie niepotrzebnych zmiennych i obiektów, gdyż interpreter Pythona jest wyposażony w tzw. garbage collector. Wybrane popularne typy danych to int, float i string. skrypt-3.py x = " Hello world!" # inicjacja zmiennej typu string 2 y = 2014 # inicjacja zmiennej typu int z = 2014.0 # inicjacja zmiennej typu float 4 print ( x, type (x)) 6 print ( y, type (y)) print ( z, type (z)) 8 # konwersja typu, rzutowanie 10 a = str (2014) b = float (" 2014.0 ") 12 c = int (z) 14 print ( a, type (a)) print ( b, type (b)) 16 print ( c, type (c))

Instrukcja warunkowa Instrukcja warunkowa: musi składać się z jednej klauzuli if, po której następuje test logiczny może zawierać dowolną liczbę klauzul elif, po których następują testy logiczne może zawierać klauzulę else skrypt-4.py 1 # instrukcja warunkowa,, wbudowana print (" x exists " if " x" in vars () else " x doesnt exist ") 3 # rozbudowana instrukcja warunkowa 5 if not " x" in vars (): pass elif type (x)== type ( float ()): print ("x is float ") 7 elif type (x)== type ( int ()): print ("x is int ") else : 9 print (" unexpected type ") del (x) Jeżeli blok kodu pod klauzulą zawiera tylko jedną instrukcję to może ona być umieszczona bezpośrednio po dwukropku. wbudowana funkcja vars() zwraca zbiór istniejących zmiennych. in służy do testowania czy obiekt znajduje się w zbiorze. Instrukcja pusta może być wywołana poleceniem pass. Można wymusić usunięcie obiektu poleceniem del. not to zaprzeczenie logiczne.

Wybrane tablicowe typy danych Tablicowe typy danych collections są szczególnie istotne dla niniejszego kursu, z racji możliwości wyrażania sygnałów dyskretnych za ich pomocą. Trzy często spotykane to napisy (string), listy i krotki (tuple). Odwołania do poszczególnych elementów takich zmiennych można dokonać przy pomocy nawiasów kwadratowych. skrypt-5.py A = " 1234 " # inicjacja napisu 2 B = (1, 2, 3, 4) # inicjacja krotki C = [1, 2, 3, 4] # inicjacja listy 4 print (A, B, type (B), C, type (C)) 6 print (A[2], B [1:3], C [ -2]) Krotki i listy mogą przechowywać obiekty dowolnego typu. Ponadto, z wymienionych, tylko listy mają możliwość przypisania wartości do poszczególnych elementów niezależnie, czym różnią się od krotek i napisów. skrypt-6.py 1 L = [" Adam ", (" Ewa ", 2014), 2014.0] print (L [0][0:3], "i " + L [1][0]) # " Ada i Ewa " 3 L [2] = " Ola " 5 L [1][1] = " Ela " # tu interpreter zgł osi błąd TypeError: tuple object does not support item assignment

Pętla for Pętla for przeznaczona jest do iterowania po danych typu tablicowego. Instrukcje continue oraz break można stosować podobnie jak w języku C. skrypt-7.py Vips = [" Asia ", " Ania ", " Helena ", " Ela ", " Ola ", " Ala "] 2 for imie in Vips : if imie == " Ania ": continue # pomini ę cie iteracji 4 if imie == " Ela ": break # przerwanie pę tli for litera in imie : print ( litera ) # pę tla zagnie żdż ona 6 print () Przykład wykorzystania pętli generującej listę (inline) do utworzenia osi czasu: skrypt-8.py 1 rate = 1000.0 # pró bki na sekund ę interval = 0.8 # interwa ł w sekundach 3 number = int ( rate * interval ) 5 # Lista przechowuj ąca dyskretne warto ści czasu Timeline = [ float ( n) / rate for n in range ( number )] 7 print ( Timeline ) Wbudowana funkcja range() zwraca listę kolejnych liczb naturalnych.

Licznik pętli Co jeżeli potrzebny jest licznik w pętli? skrypt-9.py Vips = [" Asia ", " Ania ", " Helena ", " Ela ", " Ola ", " Ala "] 2 # tu pę tle for da się zmie ścić w 1 czytelnej linii kodu 4 for nr, imie in enumerate ( Vips ): print (" element %d to vip %s" % (nr, imie )) 6 nr = 0 # tu niezb ę dne są 4 linie 8 while (nr < len ( Vips )): print (" element %d to vip %s" % (nr, Vips [nr ])) 10 nr += 1 Wbudowana funkcja enumerate() zwraca listę (dokładniej generator) krotek, których pierwszy element to indeks, a drugi przyjmuje zawartość oryginalnego elementu listy. Wbudowana funkcja len() zwraca długość kolekcji. Przy pierwszej pętli mamy niejawnie do czynienia z wielokrotnym przypisaniem. skrypt-9.py 1 nr, imie = 0, " Asia " # wielokrotne przypisanie nr, imie = (1, " Ania ") # rozpakowanie krotki 3 nr, imie = [2, " Helena "] # rozpakowanie listy Uwaga na ValueError: too many values to unpack ValueError: need more than 2 values to unpack

True i False W Pythone dostępne są typy binarne określone słowami kluczowymi True i False. Są wykorzystywane m.in. w testach logicznych przez instrukcje warunkowe oraz pętle. Fałsz logiczny poza zmienną False wyrażają także m.in.: Zaprzeczenie logiczne prawdy: not True Wyrażenie None, reprezentujące brak wartości. Zmienna typu float przyjmująca wartość 0.0. Zmienna typu int przyjmująca wartość 0. Puste krotka, lista lub napis: ( ), [], skrypt-10.py 1 Vips = [" Asia ", " Ania ", " Helena ", " Ela ", " Ola "] print ( Vips ) 3 while ( Vips ): 5 print ( Vips [0]) del ( Vips [0]) 7 print ( Vips ) Do konstruowania testów logicznych służą m.in. następujące operatory: and, or, not, in. Uwaga na IndexError: list assignment index out of range

Obiekty Język Python wspiera wszystkie najważniejsze paradygmaty programowania, w tym również paradygmat programowania obiektowego, w którym do opisu programu stosuje się abstrakcyjne obiekty wyposażone w specjalny interfejs. Do poszczególnych atrybutów obiektu (pól, metod, innych zagregowanych obiektów) można odwołać się za pomocą operatora kropki. skrypt-11.py Vips = [" Asia ", " Ania ", " Helena ", " Ela ", " Ola "] 2 print ( Vips ) 4 # metoda append () powoduje dołą czenie # do końca listy kolejnego elementu ( napisu ) 6 Vips. append (" Ala ") print ( Vips ) Do wylistowania wszystkich atrybutów obiektu służy wbudowana funkcja dir(). skrypt-11.py print ( dir ( Vips )) Również zmienne typu int, float oraz string są obiektami w rozumieniu paradygmatu programowania obiektowego.

Lista jako obiekt skrypt-12.py Vips = [" Asia ", " Ania ", " Helena ", " Ela ", " Ola "] 2 More_Vips = [" Ala ", " Ula "] 4 # Metoda extend () powoduje rozszerzenie listy o inn ą list ę. Vips. extend ( More_Vips ) 6 print ( Vips ) 8 # Metoda pop ( n) powoduje pobranie i zwr ó cenie elementu # o numerze n z listy. Element jest usuwany z listy! 10 imie = Vips. pop (2) print (imie, Vips ) 12 # Bez podawania jawnie argumentu metody pop () 14 # domy ś lnie zostanie pobrany ostatni element listy. imie = Vips. pop () 16 print (imie, Vips ) 18 # Metoda index zwraca numer pierwszego elementu, # któ rego warto ść jest ró wna argumentowi. 20 print ( Vips. index (" Ela "))

Metoda, funkcja, procedura... Funkcje definiowane jako wewnętrzne procedury obiektów nazywa się metodami. Metody wywołuje się na obiektach, tak jak pokazano to na poprzednim slajdzie. Funkcje, w tym także metody, definiuje się zwykle za pomocą słowa kluczowego def. skrypt-13.py 1 def my_cmx (x, y): return x+1j* y 3 print ( my_cmx (1.5, 3.5) ) Funkcje można definiować z domyślnymi wartościami argumentów. Należy przy tym pamiętać, aby argumenty z przypisanymi domyślnymi wartościami były umieszczane na końcu sygnatury (poniżej y=0 występuje po x). skrypt-13.py 1 def my_cmx (x, y =0) : if not isinstance (x, ( int, float )): return None 3 if not isinstance (y, ( int, float )): return None z = complex (x, y) 5 return z 7 print ( my_cmx (1.5) ) print ( my_cmx (y=2, x =1) ) Wbudowaną funkcję isinstance() użyto, aby sprawdzić czy przekazane argumenty mają charakter numeryczny.

Moduły rozszerzeniowe Język Python jest językiem ogólnego przeznaczenia, którego funkcjonalność można rozszerzać przy pomocy dodatkowych modułów. Dodatkowe moduły można dołączać za pomocą słowa kluczowego import. Interfejs do zaimportowanego modułu jest spójny z interfejsem klasycznego obiektu. skrypt-14.py 1 import sys # importowanie cał ego modu łu sys 3 print ( dir ( sys )) # lista wszystkich element ów modu łu sys print ( sys. argv ) # linia wywo łująca ten skrypt Moduły wspierające obliczenia, takie jak math, są szczególnie istotne dla tego kursu. skrypt-15.py rate, interval, freq = 1000.0, 1.2, 100.0 # Sa/s, s, Hz 2 number = int ( rate * interval ) Timeline = [ float ( n) / rate for n in range ( number )] 4 # import alternatywny za pomoc ą struktury,, from import 6 from math import pi, sin, cos def my_cmx (t, f, a =1) : 8 arg = 2.0* pi*t*f return complex (a* cos ( arg ), a* sin ( arg )) 10 # Wygenerowanie zespolonej sinusoidy : 12 Complexoida = [ my_cmx (t, freq ) for t in Timeline ]

Wybrane operacje na plikach Obsługa plików może przebiegać standardowo: otwarcie pliku, zapis lub odczyt oraz zamknięcie pliku. skrypt-16.py 1 Vector = range (16) # wygenerowanie danych fds = open (" data. txt ", "w") # otwarcie pliku do zapisu 3 for e in Vector : fds. write ("%d\t %f\n" % (e, float (e))) # zapis do pliku 5 fds. close () # zamkni ę cie pliku Język python oferuje wygodną w użyciu strukturę with as, którą można wykorzystać m.in. do obsługi plików. skrypt-16.py # otwarcie pliku do odczytu : 2 with open (" data. txt ", "r") as fds : # wczytanie danych do listy : 4 Lines = fds. readlines () 6 # wyś wietlenie danych z pliku : for line in Lines : print (line, end ="",flush = True ) Plik został zamknięty automatycznie po opuszczeniu bloku kodu w strukturze with as.

Wygenerowanie i zapisanie sygnału do pliku Moduł cmath jest dedykowany do wsparcia obliczeń z liczbami zespolonymi. Wbudowana funkcja zip() łączy ze sobą dwa obiekty typu tablicowego na zasadzie zamka błyskawicznego, w ten sposób powstaje nowa lista, której elementami są krotki przechowujące odpowiadające sobie elementy z łączonych tablic. Jeżeli tablice mają różne rozmiary, to nieprzystające elementy z dłuższej tablicy są ignorowane. Taki mechanizm wykorzystano w listingu poniżej: skrypt-17.py rate, interval, freq = 1000.0, 1.2, 100.0 # Sa/s, s, Hz 2 number = int ( rate * interval ) Timeline = [ float ( n) / rate for n in range ( number )] 4 # Wygenerowanie zespolonej sinusoidy : 6 from cmath import pi, rect Complexoida = [ rect (1.0, 2* pi* t* freq ) for t in Timeline ] 8 # Zapis sygna łu do pliku wraz z osi ą czasu : 10 with open (" signal. txt ", "w") as fds : for t, s in zip ( Timeline, Complexoida ): 12 fds. write ("%f\t%f\t%f\n" % (t,s.real,s. imag ))

Obsługa wyjątków skrypt-18.py 1 try : # w pythonie 3 interpreter powinien zgł osi ć błąd 3 eval (" print napis ") except SyntaxError : 5 print ("błąd skł adni... ") 7 # nie zaleca się takiego sposobu programowania, # gdy ż właś ciwie uniemo ż liwia on debugowanie. 9 except : pass 11 def fun (): 13 try : return x **2 15 except NameError : print (" brak x... ") 17 return finally : 19 print (" finally... ") 21 fun ()

Wykres y = f (x) - Pylab Modułem przeznaczonym do wizualizacji jest m.in. mathplotlib. bash apt - get install python - matplotlib skrypt-19.py rate, interval, freq = 1000.0, 0.05, 50.0 # Sa/s, s, Hz 2 number = int ( rate * interval ) Timeline = [ float ( n) / rate for n in range ( number )] 4 # Wygenerowanie zespolonej sinusoidy : 6 from cmath import pi, rect Complexoida = [ rect (1.0, 2* pi* t* freq ) for t in Timeline ] 8 # listy nie wspieraj ą operacji macierzowych 10 def get_real ( Tab ): return [ s. real for s in Tab ] def get_imag ( Tab ): return [ s. imag for s in Tab ] 12 import pylab as pl # kolejny alternatywny spos ób importu 14 pl. plot ( Timeline, get_real ( Complexoida )) pl. plot ( Timeline, get_imag ( Complexoida )) 16 pl. show ()

Wykres y = f (x) - Pylab

Operacje wektorowe Numpy Moduł numpy wspiera m.in. obliczenia numeryczne, w tym oparte na przetwarzaniu liczb zespolonych i całych macierzy. bash 1 apt - get install python - numpy skrypt-20.py from cmath import pi, rect 2 import pylab as pl, numpy as np 4 rate, interval, freq = 1000.0, 0.05, 50.0 # Sa/s, s, Hz number = int ( rate * interval ) 6 Timeline = [ float ( n) / rate for n in range ( number )] Complexoida = [ rect (1.0, 2* pi* t* freq ) for t in Timeline ] 8 # konwersja listy do typu numpy. array 10 Complexoida = np. array ( Complexoida ) 12 # numpy. array wspiera operacje na cał ych macierzach pl. plot ( Timeline, Complexoida. real ) 14 pl. plot ( Timeline, Complexoida. imag ) pl. show ()

Operacje wektorowe Numpy Wbudowana funkcja map() może być szczególnie przydatna w przetwarzaniu list. Pierwszym argumentem tej metody jest referencja do procedury przetwarzającej poszczególne elementy listy, natomiast drugim obiekt typu tablicowego. Moduł numpy ma wbudowane mechanizmy przetwarzania całych macierzy, więc w wielu sytuacjach nie ma potrzeby stosowania funkcji map() lub pętli. skrypt-21.py import numpy as np, pylab as pl 2 rate, interval, freq = 1000.0, 0.05, 50.0 # Sa/s, s, Hz 4 Timeline = np. arange (0.0, interval, 1.0/ rate ) 6 # mno ż enie macierzy przez wielko ść skalarn ą: j 2 pi freq # i mapowanie jej warto ści na funkcj ę numpy. exp (): 8 Complexoida = map (np.exp, 2j*np.pi* freq * Timeline ) Complexoida = np. array ( Complexoida ) 10 # ekwiwalentny zapis mógłby wygl ądać nast ę puj ąco: 12 Complexoida = np. exp (2j* np. pi* freq * Timeline ) # numpy. exp () zwraca tu obiekt typu numpy. array 14 pl. plot ( Timeline, Complexoida. real ) 16 pl. plot ( Timeline, Complexoida. imag ) pl. show ()

Operacje wektorowe Numpy Wbudowana funkcja abs() może działać różnie, przyjmując argumenty różnych typów 1. Gdy jako argument zostanie podany obiekt typu numpy.array, w wyniku otrzymamy obiekt również tego typu. skrypt-22.py import numpy as np, pylab as pl 2 rate, interval, freq = 1000.0, 0.05, 50.0 # Sa/s, s, Hz 4 Timeline = np. arange (0.0, interval, 1.0/ rate ) Complexoida = np. exp (2j* np. pi* freq * Timeline ) 6 # przyk ł adowe przetwarzanie macierzy 8 Complexoida. real = abs ( Complexoida. real /( Timeline +0.01) ) Complexoida. imag = Complexoida. imag *( Timeline *2000.0) 10 pl. plot ( Timeline, Complexoida.real, "g") 12 pl. plot ( Timeline, Complexoida.imag, "b") pl. plot ( Timeline, abs ( Complexoida ), "r") 14 pl. grid () pl. show () Z klasycznej listy nie można obliczyć wartości bezwzględnej: TypeError: bad operand type for abs(): list 1 Funkcja abs wykorzystuje mechanizm metod specjalnych, które będą zaprezentowane w dalszej części.

Wykres y = f (x) - Pylab

Operacje macierzowe Numpy Poniżej przedstawiono wybrane operacje na macierzach reprezentowanych obiektami typu numpy.array. skrypt-23.py import numpy as np 2 A = np. array ([ range (3**2) ]) 4 B = np. array ([ range (3*3) ]) C = A. reshape (9,1) 6 D = A. reshape (3,3) +1j print ("A =", A, "\nb =", B, "\nc =", C, "\nd =\n", D) 8 # Mno ż enie macierzy. Uwaga na ValueError! 10 print ("\na*b =\n", A*B) # Mno ż enie macie ży ement - element print (" dot (A,C) =\n", np.dot (A,C)) # Mno ż enie macierzy 12 print (" dot (C,A) =\n", np.dot (C,A)) # Mno ż enie macierzy 14 # Odwracanie macierzy print ("np. linalg. inv (D) =\n", np. linalg. inv (D)) 16 # Transpozycja, sprz ęż enie i zmiana wymiar ów macierzy 18 print ("A. transpose () =\n", A. transpose ()) print ("A. reshape (3,3) =\n", A. reshape (3,3) ) 20 print ("D. conj (). transpose () =\n", D. conj (). transpose ())

Analiza widmowa sygnału skrypt-24.py from numpy import pi, exp, arange 2 rate, interval = 1000.0, 0.1 # Sa/s, s Timeline = arange (0.0, interval, 1.0/ rate ) 4 # generacja sygna łu 6 f1, f2, a1, a2 = 100.0, 200.0, 1.0, 0.1 w1, w2 = 2.0* pi*f1, 2.0* pi*f2 # rad /s 8 Signal = a1*exp (1j*w1* Timeline )+a2*exp (1j*w2* Timeline ) 10 # analiza widmowa from numpy import log10, blackman 12 from numpy. fft import fft, fftshift Spectrum = fftshift ( fft ( Signal * blackman ( len ( Signal )))) 14 Spectrum = Spectrum / max ( abs ( Spectrum )) # normalizacja Freqline = arange (- rate /2, rate /2, rate / len ( Spectrum )) 16 # ekspozycja w skali logarytmicznej 18 import pylab as pl pl. plot ( Freqline, 20* log10 ( abs ( Spectrum )),".-") 20 pl. xlabel ("F (Hz)") pl. ylabel ("E ( dbc )") 22 pl. grid () pl. show ()

Widmo amplitudowe w skali logarytmicznej

Generacja addytywnego szumu białego symulacja kanału AWGN skrypt-25.py # obliczenie parametru sigma 2 from numpy import log10, sqrt, mean snr = 20 # Założ ony SNR w db 4 length = len ( Signal ) average = mean ( Signal ) 6 var = sum ( abs ( Signal - average ) **2) / length sigma = sqrt ( var /2) *10**( - snr /20) 8 # losowanie pró bek szumu 10 from numpy. random import normal Noise = normal ( loc =0.0, scale = sigma, size =( length,2) ) 12 NSignal = [s+ complex (*n) for s,n in zip ( Signal, Noise )] 14 print (" Assumed SNR :", snr ) signal_enery = sum ( abs ( Signal ) **2) 16 noise_enery = sum ( k **2 for n in Noise for k in n) print (" Obtained SNR :", 10* log10 ( signal_enery / noise_enery )) Assumed SNR: 20 Obtained SNR: 20.031579662

Widmo amplitudowe w skali logarytmicznej analiza fragmentu sygnału długości 0.1 sekundy

Widmo amplitudowe w skali logarytmicznej analiza fragmentu sygnału długości 2.2 sekundy

Generacja sygnału świergotowego (chirp) skrypt-26.py 1 from numpy import pi, exp, arange rate, interval = 1000.0, 1.1 # Sa/s, s 3 Timeline = arange (0.0, interval, 1.0/ rate ) 5 # generacja sygna łu chirp f, a, c = 10.0, 2.0, 120.0 7 w = 2.0* pi*f # rad /s Signal = Timeline * exp (1j*( w* Timeline + pi* c* Timeline **2) ) skrypt-26.py import pylab as pl 2 pl. figure (" Sygna ł Ś wiergotowy ") pl. subplot (211) 4 pl. plot ( Timeline, Signal.real,"b-") pl. xlabel ("T (s)") 6 pl. ylabel (" Real (V)") pl. grid () 8 #...

Sygnał świergotowy

Widmo amplitudowe sygnału świergotowego

Spektrogram sygnału świergotowego (chirp) skrypt-26.py 1 #... pl. figure (" Widmo Amplitudowe ") 3 pl. plot ( Freqline, 20* log10 ( abs ( Spectrum )),"b.-") pl. xlabel ("F (Hz)") 5 pl. ylabel ("E ( dbc )") pl. grid () skrypt-26.py pl. figure (" Spectrogram ") 2 pl. specgram ( Signal, NFFT =128, Fs=rate, noverlap =127) pl. ylim ([0, 150]) 4 pl. xlim ([0, 1]) pl. xlabel ("T (s)") 6 pl. ylabel ("F (Hz)") pl. grid () 8 pl. show ()

Spektrogram sygnału świergotowego

Symulacja transmisji danych w paśmie podstawowym skrypt-28.py 1 # Wiadomo ść do przes ł ania. Data = " To jest przesy ł ana informacja w kodzie ASCII." 3 # Ignorowanie wszystkich znak ów nie nale żą cych do kodu ASCII. 5 Data = Data. encode (" ascii ", ignore ) 7 # Przetwarzanie litera po literze. for letter in Data : 9 # Zapewnienie jednakowej dł ugo ści ramek (8 bit ów). 11 Tab = list ( bin ( letter )) # konwersja char to bin as list Frame = (10 - len ( Tab )) *[0] 13 for b in Tab [2:]: Frame. append ( int ( b)) # pierwsze dwie # pozycje reprezentacji binarnej np. 0 b10011 są ignorowane 15 # Formowanie strumienia danych binarnych 17 try : Stream += Frame # unipolarnych (0,1) except NameError : Stream = Frame 19 print (" Nadano : ", Data ) Dalej następuje mapowanie symboli w tej konkretnej sytuacji konwersja kodu unipolarnego (0,1) do bipolarnego (1, -1)

Symulacja transmisji danych w paśmie podstawowym - dekodowanie 1 # Dekodowanie. RecStream = Stream 3 # analiza bit po bicie 5 while RecStream : skrypt-28.py 7 frame = "" while len ( frame ) <8: # wydzielanie 8- bitowych ramek 9 frame += str ( RecStream. pop (0) ) 11 char = chr ( int ( frame, 2)) # konwersja bin to int to char 13 # utworzenie łań cucha znak ów: try : RecData += char 15 except NameError : RecData = char 17 print (" Odebrano : ", RecData )

Symulacja transmisji danych w paśmie podstawowym - filtr formujący czas, t wstawianie zerowych próbek czas, t odpowiedź impulsowa filtru opóźnienie, τ splot = filtracja czas, t

Symulacja transmisji danych w paśmie podstawowym - filtr formujący

Symulacja transmisji danych w paśmie podstawowym - symulacja kanału AWGN

Symulacja transmisji danych w paśmie podstawowym - filtr dopasowany czas, t opóźnienie, τ odpowiedź impulsowa filtru splot = filtracja czas, t

Symulacja transmisji danych w paśmie podstawowym - filtracja i synchronizacja po stronie odbiorczej

Symulacja transmisji danych w paśmie podstawowym - analiza widmowa nadawanego sygnału

Symulacja transmisji danych w paśmie podstawowym - analiza widmowa dłuższej wiadomości

Symulacja transmisji danych w paśmie podstawowym - charakterystyka amplitudowa filtru

Symulacja transmisji danych w paśmie podstawowym Nadano: b informacja Uzyskany SNR: 3.27185103433 db Odebrano (bez filtracji): hntovmqgha Odebrano (po filtracji): informacja SNR Po filtracji: 9.93855656284 db

Klasa jako definicja typu obiektu skrypt-31.py 1 class Box : # instrukcja class rozpoczyna definicj ę klasy 3 def init ( self ): # metoda implementuj ąca konstruktor # argument self jest obowi ą zkowy 5 # oznacza odwo ł anie do instancji tej klasy print (" New box ") 7 self. content = [] # zmienna wewn ą trz klasy, pole self. name = " box " 9 def print_name ( self ): # metoda wyś wietla imi ę 11 print ( self. name ) 13 box1 = Box () # utworzenie obiektu wed ług opisu klasy 15 print ( type ( box1 )) print ( type ( Box )) 17 print ( dir ( box1 )) 19 box1. print_name () print ( box1. name ) 21 print_box1_name = box1. print_name 23 print_box1_name ()

Dziedziczenie skrypt-32.py class Box : # konstruktor z dodatkowym argumentem : 2 def init (self, name ): print (" New box : %s" % name ) 4 self. name = name self. content = [] 6 def print_name ( self ): print ( self. name ) 8 class BetterBox ( Box ): # nowa klasa dziedziczy po klasie Box 10 def add (self, item ): self. content. append ( item ) 12 def print_content ( self ): print ( self. content ) 14 box2 = BetterBox (" czarna ") 16 box3 = BetterBox (" czerwona ") box3. print_name () # print_name z klasy Box 18 box2. print_content () 20 box2. add ( box3 ) # content zdefniowano jako lista więc można box2. add (" czapka ") # tu doda ć, w zasadzie, dowolny obiekt 22 box2. print_content ()

Dziedziczenie po wielu klasach skrypt-33.py 1 class Contener : # pierwsza klasa nadrz ę dna def init ( self ): 3 self. content = [] def add (self, item ): 5 self. content. append ( item ) def print_content ( self ): 7 print ( self. content ) 9 class Caller : # druga klasa nadrz ę dna def init (self, name ): 11 self. name = name def print_name ( self ): 13 print ( self. name ) 15 class Box ( Contener, Caller ): def init (self, name ): 17 Contener. init ( self ) Caller. init (self, name ) 19 print (" New box : ", end =""); self. print_name () 21 box = Box (" szary ") box. add (" szalik ") 23 box. print_content () print ( type ( box ), isinstance (box, Caller ), isinstance (box, int ))

Diagram klas add() Contener print content() = content Box Caller print name() - name

Dziedziczenie po wielu klasach - rozwiązywanie kolizji skrypt-34.py 1 class Box_A : # pierwsza klasa nadrz ę dna def add (self, item ): 3 print (" Add A") self. content. append ( item ) 5 class Box_B : # druga klasa nadrz ę dna 7 def add (self, item ): print (" Add B") 9 self. content. append ( item ) 11 class Box ( Box_A, Box_B ): def init ( self ): 13 self. content = [] 15 box = Box () box. add (" item ") # jeżeli nast ę puje kolizja spowodowana wykorzystaniem takich samych nazw, to dziedziczenie pól lub metod nast ę puje z tej klasy przekazanej jako argument bardziej po lewej stronie

Dziedziczenie - funkcja super skrypt-35.py class Box ( object ): # dziedziczenie po object nie jest 2 # wymagane w pythonie3, aby kod był # zgodny z nowym stylem pythona 4 def init ( self ): 6 self. content = [] 8 def add (self, item ): print (" Add in Box ") 10 self. content. append ( item ) 12 class BetterBox ( Box ): def add (self, item ): 14 print (" Add in BetterBox ") super ().add ( item ) 16 bbox = BetterBox () 18 bbox. add ("rę kawiczki ") print ( bbox. content )

Złe (??) użycie pola skrypt-36.py class Contener : 2 def add (self, item ): self. content. append ( item ) def print_content ( self ): 4 print ( self.name, ":", self. content ) 6 class BadBox ( Contener ): content = [] # pole bę dzie wsp ó lne dla wszystkich 8 # instancji BadBox ( objekt ów klasy BadBox ) def init ( self, name ): self. name = name 10 bbox1, bbox2 = BadBox (" czerwony "),BadBox (" niebieski ") 12 bbox1. add (" czerwone rę kawiczki ") 14 bbox1. add (" czerwona czapka ") bbox2. add (" niebieski szalik ") 16 bbox1. print_content () 18 bbox2. print_content () 20 class GoodBox ( Contener ): # deklaracja klasy może wyst ąpić def init ( self, name ): # właś ciwie w dowolnej części 22 self. content = [] # skryptu self. name = name

Polimorfizm na przykładzie skrzynek skrypt-37.py class Box : 2 def init ( self ): self. content = [] def add (self, item ): self. content. append ( item ) 4 def print_content ( self ): print ( self. content ) 6 class DoubleBox : def init ( self ): 8 self. content_1, self. content_2 = [],[] def print_content ( self ): 10 print ( self. content_1 + self. content_2 ) def add (self, item, nr =1) : 12 if nr ==1: self. content_1. append ( item ) elif nr ==2: self. content_2. append ( item ) 14 # lista róż nych typ ów skrzynek : 16 Boxes = [ Box (), DoubleBox (), Box ()] Items = [" szalik ", " czapka ", " mazak ", " klawiatura ", " kubek "] 18 from random import randint 20 for item in Items : # polimorfizm, gdy dodajemy do skrzynki Boxes [ randint (0,2) ]. add ( item ) 22 for box in Boxes : box. print_content () # oraz przy wyś wietlaniu

Funkcje specjalne w Pythonie - len() class Box : 2 def init ( self ): self. content = [] skrypt-38.py 4 def add (self, item ): 6 self. content. append ( item ) 8 # ta metoda zostanie wywo łana, gdy # interpreter wykona funkcj ę len (): 10 def len ( self ): print (" Checking len... ") 12 return len ( self. content ) 14 box = Box () print ( len ( box )) 16 box. add (" Asia ") 18 box. add (" Ula ") box. add (" Ola ") 20 print ( len ( box ))

Funkcje specjalne w Pythonie - konstruktor i dekonstruktor 1 class Box : skrypt-39.py 3 # konstruktor to ró wnie ż metoda specjalna : def init ( self ): 5 self. content = [] print (" Nowa skrzynka... ") 7 # dekonstruktor jest wywo ł ywany zawsze, 9 # gdy obiekt jest usuwany z pami ęci def del ( self ): 11 print (" Niszczenie skrzynki... ") 13 box1 = Box () del ( box1 ) 15 box2 = Box () print (" Komunikat... ")

Porównywanie obiektów Do implementacji sposobu porównywania dwóch obiektów służy następująca grupa funkcji specjalnych: cmp (self, inny), lt (self, inny), le (self, inny), eq (self, inny), ne (self, inny), gt (self, inny), ge (self, inny). Można zdefiniować sposoby konwersji obiektu do znanego typu przy pomocy takich funkcji specjalnych: int (self), str (self), float (self), complex (self)... Słowo kluczowe is służy do sprawdzenia czy dwie referencje odwołują się do tego samego obiektu. skrypt-40.py 1 class Box : 3 def init ( self ): self. content = [] 5 def add (self, item ): 7 self. content. append ( item ) 9 def eq (self, obj ): if not hasattr (obj, " content "): 11 return False elif len ( self. content ) == len ( obj. content ): 13 return True else : 15 return False

Porównywanie obiektów box1, box2 = Box (), Box () 2 box3 = box2 skrypt-40.py 4 box1. add (" telefon ") 6 if box1 is box3 : print (" box1 i box3 to ten sam box ") else : print (" box1 i box3 to inne boxy ") 8 if box2 is box3 : print (" box2 i box3 to ten sam box ") 10 else : print (" box2 i box3 to inne boxy ") 12 if box1 == box3 : print (" box1 i box2 maj ą po tyle samo przedmiot ów") else : print (" box1 i box2 nie maj ą po tyle samo przedmiot ów") 14 box3. add (" plakat ") 16 if box1 == box3 : print (" box1 i box2 maj ą po tyle samo przedmiot ów") 18 else : print (" box1 i box2 nie maj ą po tyle samo przedmiot ów")

Symulacja wielomodułowego urządzenia skrypt-41.py 1 class Dev : # klasa bazowa wszystkich modu łów def init (self, name ): 3 self. _name = str ( name ) print (" New dev, called ", self. _name ) 5 self. _output = None 7 self. _input = None self. _buffer = [] 9 def len ( self ): 11 return len ( self. _buffer ) 13 def connect (self, dev ): if not isinstance (dev, Dev ): 15 print ( self. _name, " Wrong type, cannot connect... ") else : 17 self. _output = dev dev. _input = self 19 print ( self. _name, " ->", dev. _name, " conected... ") 21 def run ( self ): pass

Symulacja wielomodułowego urządzenia skrypt-41.py 1 from random import random class Generator ( Dev ): # przyk ład klasy generatora 3 def run ( self ): self. _buffer. append ( random () -0.5) 5 class Converter ( Dev ): # przyk ład klasy konwertera def run ( self ): 7 while len ( self. _input ) >1: x = self. _input. _buffer. pop () 9 y = self. _input. _buffer. pop () self. _buffer. append ( complex (x,y)) 11 gen = Generator (" gen ") 13 conv = Converter (" conv ") gen. connect ( conv ) 15 # symulacja pracy modu łów 17 for n in range (5) : gen. run () conv. run () 19 print ( gen. _buffer ) 21 print ( conv. _buffer )

Dodatkowe informacje Strona domowa autora tej prezentacji: http://eti.pg.edu.pl/af0526ca00 krzysztof.czarnecki http://pta.eti.pg.gda.pl/people/krzycz/ Dodatkowe skrypty wykorzystane w tej prezentacji: http://pta.eti.pg.gda.pl/people/krzycz/dydaktyka/sks-2014/ Zachęcam do zapoznania się z innymi materiałami dydaktycznymi: http://pta.eti.pg.gda.pl/people/krzycz/dydaktyka/ Data utworzenia tej prezentacji: 21 października 2014