TI/Programowanie dla Fizyków Medycznych:Testowanie, komentowanie i dobry styl

Z Brain-wiki
Wersja z dnia 13:29, 29 maj 2015 autorstwa Tgubiec (dyskusja | edycje) (Utworzono nową stronę "Do przeglądania sekwencji można wykorzystać pętlę for, przydatna bywa też funkcja enumerate(A), zwracająca listę krotek (indeks, A[indeks]), gdzie A to sekwencja...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Do przeglądania sekwencji można wykorzystać pętlę for, przydatna bywa też funkcja enumerate(A), zwracająca listę krotek (indeks, A[indeks]), gdzie A to sekwencja, a indeks przebiega od 0 do len(A) - 1 i funkcja zip, której podaje się kilka sekwencji i zwraca ona listę krotek, których kolejne elementy pochodzą z kolejnych sekwencji, długość wynikowej listy jest równa długości najkrótszej listy:

import numpy as np
import pylab as py
py.ion()
a=np.zeros((100,100))
def ile_sasiadow(x,y,macierz):
    return np.sum(macierz[max(0,x-1):min(macierz.shape[0],x+2),max(0,y-1):min(macierz.shape[1],y+2)].flatten())-macierz[x,y]

def nowy_stan_komorki(x,y,macierz):
    sasiadow=ile_sasiadow(x,y,macierz)
    if sasiadow==3: return 1
    if sasiadow==2 and macierz[x,y]==1: return 1
    return 0

def krok(macierz):
    wynik=macierz.copy()
    for x in range(wynik.shape[0]):
        for y in range (wynik.shape[1]):
            wynik[x,y]=nowy_stan_komorki(x,y,macierz)
    return wynik

lokomotywa=np.array([[1,1,1,0,1],[1,0,0,0,0],[0,0,0,1,1],[0,1,1,0,1],[1,0,1,0,1]])

a[45:50,45:50]=lokomotywa

for n in range(1000):
    py.imshow(a, cmap='Greys',  interpolation='nearest')
    a=krok(a)
    py.draw()

Na koniec parę słów o efektywności list. Dostęp do elementu po indeksie, wstawianie jak i usuwanie elementu z końca listy to operacje wykonywane w czasie stałym (niezależnym od długości listy), dzięki temu listy dobrze nadają się do implementowania stosu (kolejki FILO - First In Last Out, struktury danych w której elementy kładziemy na górze stosu i tylko z góry możemy je zdejmować). Z kolei dodawanie i usuwanie elementów z innych pozycji wymaga już przesunięcia wszystkich elementów występującym po danym, co sprawia, że listy nie nadają się do implementacji kolejek FIFO - First In First Out, do takich zadań można wykorzystać strukturę deque z biblioteki collections, w niej dodawanie i usuwanie z obu końców wykonywane jest w czasie stałym.