Geçmiş bir yazıda bahsettiğimiz Jupyter arayüzünün özellikleri doğrudan doğruya IPython‘dan alınmış, ve yorumlanabilir herhangi bir dille çalışabilecek şekilde genelleştirilmiştir. Jupyter‘in devraldığı IPython özelliklerinden biri de sihirli ifadeler (line magics/cell magics) denen bazı kolaylaştırıcı, özelleşmiş komutlardır. Bu komutlar !
, %
veya %%
ile başlarlar. Sihirli ifadeler Python yorumlayıcısına aktarılmadan IPython tarafından işlenir.
Sihirli ifadeler IPython çekirdeğine özgü oldukları için sadece Python ile çalışırlar. Jupyter’in desteklediği diğer diller (R, Julia, vd.) şimdilik bu özelliğe sahip değiller.
Sihirli ifadelerle ilgili tam referans için resmi belgelere bakabilirsiniz. Bu yazıda bazı en yaygın kullanılan komutlara göz atacağız.
Sistem komutu çalıştırmak
İşletim sisteminin komut yorumlayıcısına doğrudan erişmek için !
sihrini kullanırız. Bu komutların cevabı ekrana yazılır. (Dikkat: Aşağıdaki örnekler bir Linux sisteminde çalışır. Windows veya MacOS’da çalışıyorsanız, sisteminizdeki kabuğa uygun komutlar denemelisiniz.)
Tarih ve saat:
!date
ls
ile \bin
dizininde b ile başlayan dosyaları görelim.
!ls /bin/b*
Bu komutların çıktılarını, daha sonra kullanmak için bir değişkene atayabiliriz. Bu şekilde, komut satırında kolayca yapılabilecek bir iş için kod yazmak zorunda kalmayız.
bindosyalar = !ls /bin/b*
bindosyalar
Yardım almak
Jupyter’in çevrimiçi yardımını hücre sihirleriyle de kullanabilirsiniz. Sihirli kelimeyi yazıp Shift-Tab
bastığınızda bir yardım balonu çıkar.
Kullanabileceğiniz bütün sihirli kelimelerin listesini %lsmagic
sihriyle görebilirsiniz.
%lsmagic
Sihirli ifadelerin kullanımının özeti ve her bir komutun kısa açıklaması için %quickref
komutunu kullanabilirsiniz.
%quickref # Jupyter ekranında ayrı bir alt pencere açar.
Bütün sihirli ifadelerin tam ve kapsamlı bir referansı için %magic
komutunu kullanabilirsiniz.
%magic # Jupyter ekranında ayrı bir alt pencere açar.
Satır sihirleri bir tek %
işaretiyle başlar, ve tek satırda bulunurlar. Hücrenin geri kalanında Python kodu bulunabilir. Hücre sihirleri ise çift %%
işaretiyle başlarlar. Hücrenin tamamı bu sihrin etkisinde kalır.
%time, %timeit: Süre ölçme
Bir komutun işletilmesinin ne kadar zaman aldığını ölçmek için %time
ve %timeit
sihirlerini kullanabiliriz. Bunlar standart kütüphanedeki time
ve timeit
modüllerini kullanır.
%time sum(range(1000))
%timeit
komutu, ardından gelen Python komutunu bir döngü içinde birçok defa çalıştırır, sonra ortalama süreyi bulur. Bunu birkaç defa tekrarlar ve elde ettiği sonucu ortalama ve standart sapma olarak verir. Bu şekilde bilgisayar sistemi içindeki çeşitli rastgele gecikmeleri kısmen bertaraf etmek mümkün olur.
%timeit sum(range(1000))
Döngü sayısı açıkça verilmediyse, otomatik olarak ayarlanır. Döngü sayısı, toplam çalışma süresi 0.2 saniyenin üstünde olacak şekilde 10’un kuvvetleri olarak belirlenir. Döngü sayısı ve tekrar sayısı istendiği gibi değiştirilebilir.
%timeit -n 250 -r 4 sum(range(1000))
Bazen süresini tutmak istediğimiz işlem birkaç satıra yayılmış olabilir. O zaman bütün hücrenin işleyiş süresini tutmak için, çift yüzde işaretiyle, %%timeit
hücre sihiri kullanırız.
Örnek olarak, bir listeyi append
ile genişletmek ve liste kurma arasındaki zaman farkına bakalım.
%%timeit -r 10
L = []
for i in range(1000):
L.append(i**2)
%timeit -r 10 [i**2 for i in range(1000)]
Dizin işlemleri
Yeni bir dizin yaratalım ve o dizine geçelim.
!mkdir deneme
%cd deneme
Yeni dizinde bir dosya yaratalım.
!touch dosya1
!ls
Üst dizine dönelim.
%cd ..
Yarattığımız dizini silelim.
!rm -r deneme/
Neden bütün işlemleri !
işleciyle yaparken, dizin değiştirmeyi %cd
ile yaptık? Eğer komutu !cd deneme
olarak verseydik, kabuk yorumlayıcı bunu işletir, ama hemen sonra kapanırdı. Sonraki her bir komut yeni bir kabuk yorumlayıcıyla yapılacağı için dizin değiştirme işlemi kalıcı olmazdı. IPython’un %cd
komutu dizinlerin çalıştığımız ortamda kalıcı olarak değiştirilmesini sağlar.
Örnek olarak, aşağıdaki komutlar sonucunda, /deneme
dizinine geçmiş olmuyoruz.
!mkdir deneme
!cd deneme
!pwd
Doğrusunu yaparak %cd
kullanırsak istediğimiz değişiklik geçerli olur.
%cd deneme
!pwd
Üst dizine geri çıkıp /deneme
dizinini silelim.
%cd ..
!rm -r deneme/
%%writefile: Bir metin dosyası yaratmak
Diyelim elle yazacağınız kısa bir metni bir dosyaya kaydetmek istiyorsunuz. Bunun için ayrı bir pencerede bir editör açabilirsiniz, veya Python’un dosya açma komutlarını kullanabilirsiniz. %%writefile
hücre sihri ise zahmetsiz kestirme bir yol sağlar.
deneme
isimli bir dosyaya iki telefon numarası yazalım:
%%writefile deneme
Kaan (111)-1234567
Meral (124)-9283759
%cat
ile dosyanın içeriğini ekrana dökerek istediğimizi yaptığını teyit edebiliriz.
%cat deneme
%%writefile -a
ile mevcut dosyanın altına ekleme yaparız. Yeni satırla başlamak için, satır başı vermemiz gerekir.
%%writefile -a deneme
Ziya (234)-8087955
%cat deneme
%rm deneme
%run: Python programı çalıştırmak
Ayrı bir dosyada bulunan Python kodunu çalıştırmak için %run
komutu kullanılır.
Basit bir Python programı hazırlayıp merhaba.py ismiyle kaydedelim.
%%writefile merhaba.py
isim = input("Adınız?")
print("Merhaba",isim)
%run merhaba.py
Çağırılan program mevcut yorumlayıcı tarafından işlendiği için, o program içinde yaratılan değişken isimleri kalıcı olur.
isim
%load: Bir dosyanın içeriğini yüklemek
%load
komutu, %run
gibi, bir Python dosyasındaki komutları okuyup çalıştırmaya yarar. Farkı, kodu önce mevcut hücreye kopyalaması, ama biz tekrar talep etmedikçe çalıştırmamasıdır.
%load merhaba.py
Yukarıdaki hücre çalıştırıldığında sihirli kelime yorum haline getirilir, dosyadaki kod aynı hücreye kopyalanır, ama çalıştırılmaz.
# %load merhaba.py
isim = input("Adınız?")
print("Merhaba",isim)
Hücrede tekrar Shift-Enter’e basıldığında kod çalışır.
# %load merhaba.py
isim = input("Adınız?")
print("Merhaba",isim)
%qtconsole: Yan terminal açmak
Defterinizin akışına müdahale etmeden bazı yan işlemler yapmak istediğinizde, ayrı bir pencerede bir IPython penceresi açabilirsiniz. (Bu komut her işletim sisteminde bulunmayabilir.)
%qtconsole
Her iki arayüz de aynı çekirdeğe bağlıdır. Birbirlerinin tanımlarını görebilirler. Konsol penceresini kapatmak, onu başlatan defteri etkilemez.
x
%pastebin: Github’a Gist yüklemek
GitHub sitesi, çok kaba bir özetle, programcıların yazdıkları kodları paylaştığı bir depo olarak tanımlanabilir. Bu sitenin altındaki GitHub Gist hizmeti, bir düz metin veya kod dosyasını hızlı ve formalitesiz şekilde paylaşmayı sağlar. Gist‘ler GitHub kullanıcı adınıza bağlı veya isimsiz, ve herkese açık veya gizli olabilirler.
%pastebin
sihri, bir dosyayı, veya mevcut oturumdan seçtiğiniz satırları isimsiz ve herkese açık bir Gist olarak yayınlar ve URL’sini döndürür.
Bu defterdeki In[1]
–In[11]
arası komutları Gist’e yüklemek için:
%pastebin -d "Deneme yüklemesi" 1-11
merhaba.py dosyasını Gist’e yüklemek için:
%pastebin -d "Deneme yüklemesi" merhaba.py
%who: Oturumda tanımlanmış değişkenler
Mevcut oturumda tanımlanmış değişken isimlerini gösterir.
%who
Değişken isimlerini bir liste olarak almak isterseniz %who_ls
kullanabilirsiniz.
%who_ls
%reset: Değişkenleri topluca silmek
Mevcut oturumda kullanıcı tarafından tanımlanmış değişkenleri siler. Modüllerde tanımlanmış isimlere dokunmaz.
%who
%reset
%who
Parametreler:
%reset -f :
Teyit istemeden sıfırlar.%reset -s :
Yumuşak sıfırlama: Komut geçmişi silinmez, sadece isim alanı temizlenir.%reset in :
Komut geçmişini sıfırlar.%reset out :
Çıktı geçmişini sıfırlar.%reset dhist :
Dizin geçmişini sıfırlar.%reset array :
Sadece NumPy dizi (array) değişkenlerini siler.
%macro: İşlemleri otomatik olarak tekrar etmek
Arka arkaya yazdığınız birkaç komutu daha sonra tekrar tekrar işletmek için bir kenara yazmak istediğinizde %macro
sihri işinize yarayacaktır. Bu işlem,de daha önce verdiğimiz komutları giriş sayılarını vererek bir seferde çalıştırabiliriz.
from random import randint
zar1 = randint(1,6)
zar2 = randint(1,6)
zar3 = randint(1,6)
a = 5
print(zar1 + zar2)
print(zar1, zar2, zar3, zar1+zar2+zar3)
Bu komutları kullanarak bir makro hazırlayalım. Girdi numaralarını hücrelerin yanından okuyabileceğimiz gibi, %hist -n
sihiriyle de görebiliriz.
%hist -n
%macro
sihirli kelimesinden sonra, makroya vereceğiniz isim ve komut numarası aralıkları gelmelidir. Aralıklar n1-n2 n3-n4 n5
şeklinde verilebilir. Aralıkların başı ve sonu dahil edilir. Araya virgül koyulmaz.
%macro zarat 41-43 46
zarat
%save: Komutları kaydet
Hazırladığınız bir makroyu veya girdi satırlarının bir kısmını sonraki bir oturumda kullanmak için sabit diske yazmak isterseniz %save
sihrini kullanabilirsiniz. Parametre olarak satır numaraları aralıkları veya numara listesi verilebilir.
%save deneme 40-43 46
Satır numaraları yerine daha önce hazırladığınız bir makro ismi de verebilirsiniz.
%save deneme zarat
%store: Değişkenleri sabit diske kaydet
Hesabınız sırasında ürettiğiniz bazı değişkenleri sonraki oturumlarda kullanmak için kaydetmek istediğinizde bu sihri kullanabilirsiniz.
L = [i*2 for i in range(10)]
%store L
Değişkenleri silelim:
%reset -f
Artık L listesini kaybettik.
print(L)
L değişkenini kaydedilen yerden geri yükleyelim.
%store -r L
print(L)
%store L > kareler.txt
%cat kareler.txt
!rm kareler.txt
matplotlib arayüzünü ayarlamak
matplotlib Python’un gayrıresmi görselleştirme kütüphanesidir. Özel %matplotlib
sihriyle, hangi arka yüzü kullanmak istediğinizi belirleyebilirsiniz.
%matplotlib -l
Bu arka yüzlerin hepsi her işletim sisteminde bulunmayabilir.
Birçok Jupyter defter kullanıcısı, defterin başında %matplotlib inline
komutunu vermeyi tercih eder. Bu sayede ürettiğiniz matplotlib grafikleri defterin içine gömülür ve tam bir belge oluşturmanızı sağlar.
%matplotlib inline
import matplotlib.pylab as plt
x = plt.linspace(-20,20,100)
y = plt.sin(x)/x
plt.plot(x,y)
Bunun yerine notebook
arka yüzü kullanmayı tercih ederseniz, fareyle etkileşebileceğiniz, kaydırıp zumlayabileceğiniz dinamik bir formda gösterilir.
Dikkat: matplotlib arka yüzünü bir oturum içinde sadece bir kere belirleyebilirsiniz. Aşağıdaki komutlar için çekirdeği tekrar başlatmanız gerekecektir. Çekirdeği, menü çubuğunda Kernel -> Kernel Restart seçerek, veya iki kere sıfıra basarak tekrar başlatabilirsiniz.
%matplotlib notebook
import matplotlib.pylab as plt
x = plt.linspace(-20,20,100)
y = plt.sin(x)/x
plt.plot(x,y)
Deftere gömülü olarak bir etkileşimli grafik arayüzü elde ederiz.
Grafiğin ayrı bir pencerede gösterilmesini istiyorsanız gtk
, qt
, agg
, ve türevlerini kullanabilirsiniz. O zaman en sonda matplotlib’in show()
komutunu vermelisiniz.
%matplotlib qt5
import matplotlib.pylab as plt
x = plt.linspace(-20,20,100)
y = plt.sin(x)/x
plt.plot(x,y)
plt.show()
Bu komutlardan sonra grafik şöyle bir pencerede gösterilir.
%%script: Herhangi bir yorumlayıcıyı çalıştır
Başka dillere ait yorumlayıcıları kullanmaya ne dersiniz? Belki bir sürü veri dosyasını hızlıca işlemek için birkaç kabuk komutu vereceksiniz. Belki Awk, Perl, ya da Ruby ile hızlı bir işlem yapmak istiyorsunuz. Sisteminize kurulu herhangi bir yorumlayıcıyı çalıştırıp ona komutlar vermek için %%script
hücre sihrini kullanabilirsiniz.
Hücrenin başına %%script
‘in ardından yorumlayıcı programın adını, ve gerekiyorsa bazı parametreleri yazın. Hücredeki alt satırlar yorumlayıcıya gönderilip işlenecek, gelen cevap ekrana basılacak.
%%script bash
for i in 1 2 3; do
echo $i
done
Programın çıktısını bir değişkende saklamak için --out <dosya adı>
parametresini kullanabilirsiniz.
%%script bash --out hede
for i in 1 2 3; do
echo $i
done
hede
%%html: HTML yorumlayıcı
Bulunduğu hücredeki HTML kodunu işler ve HTML belgesini ekrana verir.
%%html
<html>
<head>
<style>
table {
font-family: arial, sans-serif;
border-collapse: collapse;
widtd: 100%;
}
th, td {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
</style>
</head>
<body>
<h1> Çevrimiçi alışveriş veri kayıtları </h2>
<table class="table table-bordered table-hover table-condensed">
<thead><tr><th title="Field #1">InvoiceNo</th>
<th title="Field #2">StockCode</th>
<th title="Field #3">Description</th>
<th title="Field #4">Quantity</th>
<th title="Field #5">InvoiceDate</th>
<th title="Field #6">UnitPrice</th>
<th title="Field #7">CustomerID</th>
<th title="Field #8">Country</th>
</tr></thead>
<tbody><tr>
<td align="right">536365</td>
<td>85123A</td>
<td>WHITE HANGING HEART T-LIGHT HOLDER</td>
<td align="right">6</td>
<td>12/1/2010 8:26</td>
<td align="right">2.55</td>
<td align="right">17850</td>
<td>United Kingdom</td>
</tr>
<tr>
<td align="right">536365</td>
<td>71053</td>
<td>WHITE METAL LANTERN</td>
<td align="right">6</td>
<td>12/1/2010 8:26</td>
<td align="right">3.39</td>
<td align="right">17850</td>
<td>United Kingdom</td>
</tr>
<tr>
<td align="right">536365</td>
<td>84406B</td>
<td>CREAM CUPID HEARTS COAT HANGER</td>
<td align="right">8</td>
<td>12/1/2010 8:26</td>
<td align="right">2.75</td>
<td align="right">17850</td>
<td>United Kingdom</td>
</tr>
</tbody></table>
</body>
</html>
One comment