Python'la 'Merhaba Dünya!'
Dr. Emre S. Taşcı, emre.tasci@hacettepe.edu.tr
Fizik Mühendisliği Bölümü
Hacettepe Üniversitesi
Python dili 1990 yılında, Guido van Rossum tarafından geliştirilmiştir. Yüksek seviye bir dil olup, işlemci tarafında pek çok zahmetli işlem (örn. hafıza ayarlamaları, çöp toplama) sistem tarafından otomatik olarak halledilmektedir. Ayrıca nesne tabanlı bir yapıya sahiptir (daha da ileri gidersek: Python'da hemen hemen her şey bir nesnedir).
Dil, ismini İngiliz anarşist komedi topluluğu Monty Python'dan almaktadır (hatta, bizzat van Rossum'un örneklerde kullanılacak değişken ve durumların da grubun skeçlerinden seçilmesi konusunda ricası vardır).
Yaygın kütüphane desteği ve internetin doğrudan işletim sistemlerinde kaynak olarak kullanımının önünün açılması sonucu 2000'li yıllardan itibaren "en çok kullanılan diller" listelerinde hep üst sıraya yerleşmiştir. Bu listelerde kriter sayılan TIOBE endeksinde Python, Java (%17.8) ve C'den (%16.3) sonra %10.1'lik kullanımla 3. sırada yer almaktadır ve yükselişini kararlı bir biçimde sürdürmektedir. GitHub ve Stack Overflow istatistiklerinden yola çıkılarak hazırlanan bir diğer endeks olan RedMonk sıralamasında ise Ocak 2020 itibarı ile JavaScript ile birinciliğe başabaş oynamaktadır. İnternette en çok başlangıç ve tanıtımları ziyaret edilen diller üzerinden sıralama yapan PYPL endeksinde ise açık ara ile (Python: %30.1; Java: %18.8) birinci sıradadır. (Bütün istatistikler 2020 Mart ayı açıklamalarına dairdir)
Temel olarak Python yorumlanarak çalışan ("interpreted") bir dil olduğundan, bir yorumcuya ("interpreter") ihtiyaç duyar. Python'ın kendisi ile gelen IDLE IDE'si temelde iş görse de, yaşamı kolaylaştırıcı pek çok özellikten mahrumdur. Bu nedenle, zorunlu durumlar dışında pek kullanılmaz.
Python'da program geliştirmek için yoğun olarak PyCharm ve IPython IDE'lerini kullanmaktadırlar. Anaconda ise, IPython IDE'sini (Jupyter üzerinden) ve pek çok popüler sayısal analiz kütüphanesini içinde barındıran bir yazılım paketi olup, kullanım kolaylığı açısından benim de tavsiye ettiğim IDE'dir.
Jupyter yoluyla bir web tarayıcısında yazılan Jupyter defterleri (ipynb - IPython Notebooks) gerek görsel, gerekse kullanım açısından gerçekten de akıcı bir geliştirmeye olanak tanır (bu uygulama notları da bizzat Jupyter ile hazırlanmaktadır 8).
Jupyter'ı bir kelime işlemci (örn: MS Word) belgesi olarak düşünebilirsiniz: bu dökümanın bazı yerlerine açıklamalar yazıp, aralara da resimler eklediğiniz gibi, bir Jupyter defterinin istediğiniz kısımlarına yazı yazıp, istediğiniz kısımlarında da programınızı yazıp çalıştırabilirsiniz -- tıpkı şu anda yapmakta olduğum gibi. Python'da basit bir işlem yapalım:
5 + 7
Yukarıdaki işlemin olduğu kısım, şu anda bu satırların olduğu kısım gibi, çalışmamızın bir parçası olup, "hücre" (cell) adıyla anılırlar. Bir hücre şu üç çeşitten biri olabilir:
Hücrelerle ilgili çok kullanacağınız birkaç diğer kısayol tuşu ise şunlardır:
Bütün defteri çalıştırmak için ise Kernel menüsünden "Restart & Run All" diyebilirsiniz - bu durumda, defteri yeni açmışsınız gibi çekirdek (kernel) baştan yüklenir ve her şey sıfırdan çalıştırılır; Cell menüsünden "Run All" seçeneği ise, hücreleri en tepeden aşağıya doğru sırayla çalıştırır fakat daha önce çalıştırdığınızda edinilen (değişken değerleri gibi) bilgileri de kullanır. Kod hücrelerinin sol başlarındaki sayılar hücrelerin hangi sırayla çalıştırıldıklarını işaret eder (beklemediğiniz bir çıktı almanız halinde gidişatı kolayca takip edip, durumu anlayabilmeniz için).
Python, çeşitli işlere özgü (örn: matris hesabı, grafik çizimi, veritabanı, konumsal işlemler, görüntüleme, ses işleme, yapay zeka vs.) metotları barındıran pek çok kütüphane ile desteklenir; zaten bu kadar geniş kullanıcı sayısına ulaşmasında da bu çeşitliliğin büyük katkısı vardır. Python'da kütüphaneler modül (module) olarak adlandırılır.
Sayısal hesap işlemlerinde yoğun olarak kullanacağımız üç adet kütüphane:
Python'da istediğimiz kütüphaneyi:
import <kütüphane-adı> as <kütüphane-adı-kısaltması>
veya
from <kütüphane-adı> import <istenilen-metotlar>
biçimiyle çağırabiliriz. İki kullanım biçimi birbirinden farklıdır: İlkinde kütüphane elemanlarını çağırırken kütüphanenin kısa adıyla işaret ederiz (bu tür aidiyete "isimuzayı" (namespace) denir); ikinci türde ise kütüphane elemanları doğrudan ana isimuzayına eklenir, ilgili kütüphaneyi işaret etmemiz gerekmez. İkinci yaklaşım daha pratik gelse de birden fazla kütüphanenin aktarıldığı durumlarda karışıklığa yol açabilir, bu nedenle mümkün mertebe ilk yaklaşımı kullanmak gerekir.
Not: ikinci yaklaşımla sadece bir tek metot eklense bile, Python yine de bütün kütüphaneyi yükleyecektir. import numpy as np
ile from numpy import pi
arasında performans bakımından hiçbir fark yoktur: iki durumda da bütün NumPy modülü yüklenir - ikinci durumda sadece pi'nin kullanımı mümkün olsa bile!
# Örnek:
print(pi) # tanımlı olmadığından hata gelecektir
# Kütüphaneyi 'np' kısaltmasıyla aktaralım:
import numpy as np
print(np.pi) # pi de tanımlı,
print(np.e) # e de...
# Kütüphaneden sadece pi'yi aktarıp, öyle çağıralım:
from numpy import pi
print(pi) # pi tanımlı,
print(e) # fakat e değil...
Jupyter'da hazırladığınız sayfalar otomatik olarak sıklıkla kaydedilir (bunun yanısıra, siz de sol üstteki ikondan veya <CTRL>+s kestirmesinden dilediğiniz zaman kaydedebilirsiniz).
Dosyanızı bir başkasına doğrudan veya farklı bir biçimde göndermek içinse File menüsünden "Download as..." seçeneğini kullanabilirsiniz. Bu menüde çıkan seçeneklerden başlıcaları: