A Jupyter notebookokban lehetőség van sor és cella magic-ekkel néhány, a pythonon ( vagy az épp aktuális notebook kernelen ) túlmutató segéd művelet elvégzésére.
A sor magic-ek hatása a kód cella egyetlen sorában érvényesül míg a cella magic-ek hatása a teljes cellára kiterjednek. Egy darab %
-al jelöljük a sor illetve %%
-al a cella meagiceket.
A félév során már rendszeresen használtuk a % pylab inline
konstrukciót mely a notebook környezetet úgy állította be, hogy a matplotlib
és numpy
csomagokból betöltötte a leggyakrabban használt függvényeket, továbbá a matplotlib által generált ábrákat beágyazta a notebookba.
%pylab inline
%lsmagic
A magic-ek-et tartalmazó sorokba ne írjunk kommenteket. Ezekbe a sorokba írt kommentek hibát fognak okozni! Az alábbiakban tekintsünk át néhány hasznos magic-et a fenti listából.
# definiáljunk pár dolgot
one = "for the money"
two = "for the show"
three = "to get ready now go cat go"
szam1 = 1.0
szam2 = 3
szam3 = 4.0
%who
Ha csak bizonyos típusú objektumokra vagyun kiváncsiak akkor a típus megadásával szűkíthetjük a listát:
%who str
A %time
és %timeit
sor magic-ek egy kódsor futási idejéről nyújtanak információt. Mind a két magic sor és cella magic ként is működik.
A %time
az adott kódrészletet egyszer futtatja le és kiírja, hogy ezalatt mennyi idő telt. Az alábbi példában 0 és 10000 közötti számokból generálunk egy listát és megnézzük hogy ehez mennyi időre volt szükség:
%time a=[ i for i in range(100000) ]
A %timeit
magic egy adott kódrészletet többször is lefuttat és a futások végén a leggyorsabb futások átlagát írja ki.
%timeit a=[ i for i in range(100000) ]
A fenti konstrukció, amint azt ki is írja, 100-szor futtatja le a megmérendő kódrészletet és a legjobb három futás átlagát írja ki.
A magic-ek lehetséges opcióiról notebookban szokásos ?
-el tudunk tájékozódni.
?timeit
A %%writefile
cella magic seegítségével az adott cella tartalmát tudjuk egy file-ba kiírni.
%%writefile kicsiadat.dat
1 2
2 3
3 1
4 6
5 7
A magic-ek egyik talán legérdekesebb felhasználási módja, hogy segítségükkel egy python
nyelven írt notebook-ba más nyelveken írt kód cellákat is használhatunk. Ezen más nyelveken írt kód részletek definiálhatnak függvényeket, illetve kölcsönhathatnak a python
-os részletekben definiált változókkal.
Nézzünk egy pár példát arra, hogy hogyan lehet más nyelveken íródott kódrészleteket használni.
Először is egy egyszerű bash
nyelven íródott kis script-et nézünk meg, ami kiírja a számokat 1-től 5-ig:
%%bash
for i in `seq 5`;
do
echo "i is $i"
done
A fenti kódcella első sora hatására egy bash
értelmező fordítja le a kód cella mardék részét.
A következő két példában fortran
és R
nyelveken íródott kódrészleteket fogunk használni. Először is a %load_ext
sor magic segítségével a fortran
és R
cella magic-eket be kell tölteni hogy aztán később használni tudjuk:
# R cell magic betöltése
%load_ext rpy2.ipython
# fortran cell magic betöltése
%load_ext fortranmagic
Definiáljunk most pár változót python
-ban:
# ez it két változó ezeket fogjuk az alábbi példákban használni
x=linspace(0,pi,100)
y=sin(x)
Ábrázoljuk most az y
változót az x
függvényében az R
nyelv ggplot
csomagjában található qplot
függvény segítségével:
%%R -i x,y
# Így kell az R magic-nek megmondani hogy a pythonban definiált x és y változókat használja
require(ggplot2) # R-ban így töltjük be az ábrázolásért felelős csomagot
qplot(x,y) # Ez egy egyszerű ábrázolás
Az alábbi kódrészletben pedig fortran
nyelven definiálunk egy függvényt aminek három változója van , két bemeneti (u és v) és egy kimeneti (w). A kimeneti érték a bemeneti értékek összegének a sinus-a:
%%fortran
subroutine fort_funct(u, v, w)
real, intent(in) :: u(:), v(:) !ezek bemeno valtozok
real, intent(out) :: w(size(u)) !ez lesz a kimeno valtozo
! using vector operations
w(:) = sin(u(:) + v(:))
end subroutine
Most a fent definiált fortran
függvényt használjuk a python-ban definiált x
és y
array-kel:
fort_funct(x,y) # Ezt a függvényt Fortranban definiáltuk!!!