Python Programlama Ders 6. Döngüler - while döngüsü

Yineleme (Döngü)

Bilgisayarlar sıklıkla tekrarlayan görevleri otomatikleştirmek için kullanılmaktadır. Aynı veya benzer görevleri hatasız bir şekilde tekrarlama işlemi bilgisayarların iyi yaptığı, insanların ise zorlandığı bir şeydir.

Bir komutlar kümesinin tekrar tekrar yürütülmesi işlemine yineleme (iteration) adı verilir. Yineleme çok yaygın olduğu için, Python bunu kolaylaştırmak için birkaç özellik sağlar. Daha önceki bölümlerde for deyimini gördük. for deyimi en sık kullanacağınız döngü komutu olacaktır. Fakat bu bölümde while deyimine bakacağız. Bu, azıcık farklı durumlarda yineleme yapmanın başka değişik yoludur.

Devamı...

Python Programlama Ders 5. Değer döndüren fonksiyonlar

5.1 Geri dönüş değerleri

Şimdiye kadar kullandığımız abs, pow ve max benzeri içsel olarak tanımlı fonksiyonlar sonuç ürettiler, yani bir değer döndürdüler. Her bu fonksiyonları çağırmamız bir değer üretmektedir, bu üretilen değeri genellikle bir değişkene atama veya bir deyimin parçası haline getirdik.

Devamı...

Python Programlama Ders 4.1 Turtle Modülü ve Kullanımı

Kendi programlarımız içinde kullanabileceğimiz Python modülleri, oldukça fazladır ve birçok önemli özellikler sunar. E-posta veya bir ev sayfasının içeriğini indirmek gibi. Bu bölümde bakacağımız modül, bize ekranda kaplumbağalar yaratmamamızı; bu kaplumbağaları kullanarak ekranda şekiller ve desenler çizmemizi sağlayacak.

Kaplumbağalar oldukça eğlendiricidir, fakat bu bölümün gerçek amacı: Biraz daha Python öğrenmek, hesaplamalı düşünmeyi geliştirmek veya “bir bilgisayar bilimcisi gibi düşünmeyi” öğrenmektir. Bu bölümde işlenen Python’un büyük bir kısmı daha sonra derinlemesine tekrar incelenecektir.

İlk kaplumbağa programımız

Bir kaplumbağa yaratan ve bununla bir dikdörtgen çizen birkaç satırlık Python programı yazalım. (İlk yarattığımız kaplumbağaya atayacağımız değişkeni ahmet olarak adlandıracağız. Daha önceki bölümdeki değişken isimlendirme kurallarını kullanarak eğer istersek farklı bir isimde seçebiliriz.)

Devamı...

Python Programlama Ders 3. Fonksiyonlar

3.1 Tanımlar ve kullanım

Programlama bağlamın, bir fonksiyon (işlev) belli bir işlemi gerçekleştirmek üzere isimlendirilmiş cümle (komut) serisidir. Bu işlem fonksiyon tanımında belirlenmiştir. Python’da, fonksiyon tanımı için sözdizimi şu şekildedir:

Devamı...

Python Programlama Ders 2. Değişkenler, deyimler ve cümleler

2.1 Değerler ve tipler

Değer programın işlediği temel şeylerden - harf veya rakam gibi - biridir. Şimdiye kadar gördüğümüz değerler 2 (1 + 1 işleminin sonucu), ve "Merhaba, Dünya!".

Bu değerler farklı tiplere aittir: 2 bir tamsayı (integer)dır, ve "Merhaba, Dünya!" bir karakter dizisi (string)dir, çünkü karakterlerden oluşan bir dizidir. Siz (ve yorumlayıcı) karakter dizilerini ayırtedebilir, çünkü tırnak işaretleri arasında yazılmıştır. Şimdilik sınıf (class) ve type (tür) kelimelerini birbirinin yerine kullanabilirsiniz. Sınıfın ne olduğunu daha iyi anlamak için ileriki bölümlerde geri döneceğiz.

Devamı...

Python Programlama Ders 1. Programlama Yolu

Bu derslerin amacı size bir bilgisayar bilimcisi gibi düşünmeyi öğretmektir. Bu düşünme şekli matematiğin, mühendisliğin ve doğal bilimlerin bazı en iyi özelliklerini birleştirir. Matematikçiler gibi, bilgisayar bilimcileri fikirleri (özellikle hesaplamalar) göstermek için biçimsel dilleri kullanırlar. Mühendisler gibi şeyleri tasarlar, bileşenleri (parçaları) sistemler şeklinde birleştirir ve farklı alternatiflerin avantaj ve dezavantajlarını değerlendirirler. Bilim insanları gibi, karmaşık sistemlerin davranışlarını gözlemler, hipotezler oluşturur ve varsayımları (tahminleri) sınarlar.

Bir bilgisayar bilimcisi için tek ve en önemli yetenek problem çözmedir. Problem çözme problemleri formüle edebilme, çözümler hakkında yaratıcı düşünme ve bir çözümü açık ve kesin olarak ifade edebilme yeteneğidir. Görüleceği gibi, programlama öğrenme süreci problem çözme yeteneklerinin uygulamasını yapmak için mükemmel bir fırsattır. Bu bölüme bu yüzden, “Programlama yolu” adı verilmiştir.

Bir yönden programlamayı öğrenirken - ki kendisi yararlı bir yetenektir - bir başka yönden programlamayı sonuç için bir yol olarak kullanmayı öğreneceksiniz. İlerledikçe bu daha açık bir hale gelecektir.

1.1 Python programlama dili

Öğreneceğiniz programlama dili Python olacaktır. Python bir yüksek seviyeli dil örneğidir; yüksek seviyeli dillere örnek olarak daha önce duymuş olabileceğiniz C++, PHP ve Java verilebilir.

“Yüksek seviyeli dil” ifadesinden çıkarabileceğiniz gibi, ayrıca düşük seviyeli diller de vardır, bunlar bazı durumlarda “makine dili” veya “birleştirici dili” şeklinde isimlendirilir. Basitçe söylersek, bilgisayarlar sadece düşük seviyeli dillerde yazılmış programları çalıştırabilirler. Bu yüzden, yüksek seviyeli dillerde yazılmış programlar çalıştırılmadan önce bir işlemden geçmelidir. Bu ek işlem biraz zaman alır, bu da yüksek seviyeli dillerin dezavantajıdır.

Ancak avantajları oldukça fazladır. İlk olarak, yüksek seviyeli dillerde programlamak oldukça kolaydır. Yüksek seviyeli dilde yazılmış programlar daha az sürede yazılır, daha kısadır, okuması daha kolay ve doğru olma ihtimalleri daha yüksektir. İkinci olarak, yüksek seviyeli dillerdir, bunun anlamı farklı bilgisayarlarda az değişiklik veya değişiklik yapmadan çalıştırılabilirler. Düşük seviyeli programlar sadece tek bir bilgisayar çeşidinde çalışabilirler ve başka bir bilgisayarda çalışabilmesi için tekrar yazılmalıdır.

Yüksek seviyeli dilleri, düşük seviyeli dillere çevirmek için iki çeşit program kullanılmaktadır: yorumlayıcılar ve derleyiciler.Yorumlayıcılar yüksek seviyeli programı okur ve işletir, bunun anlamı program ne diyorsa onu yapar. Programı biraz biraz işler, satırları okur ve ilgili hesaplamaları gerekleştirir.

Derleyici programı okur ve programı çalıştırmadan önce tamamen başka bir şeye dönüştürür. Bu durumda yüksek seviyeli programa kaynak kod, çevrildiği programa ise hedef kod veya çalıştırılabilir denir. Program derlendikten sonra, daha fazla çevirme yapmadan tekrar tekrar çalıştırılabilir.

Çoğu modern dil her iki işlemi de kullanır. Programlar ilk önce daha düşük seviyeli bir dile derlenir, byte kod, ve daha sonra sanal makine adı verilen bir program tarafından yorumlanırlar. Python her iki işlemi de kullanır, ancak programcıların kendisiyle etkileşim yöntemi nedeniyle, daha çok yorumlamalı dil olarak kabul edilir.

Python yorumlayıcısının kullandığı iki yöntem vardır: kabuk modu ve betik modu. Kabuk modunda Python kabuğuna Python cümlelerini yazıp, yorumlayıcının hemen sonuçları üretmesi sağlanıyor:

Devamı...

Markdown kullanım kılavuzu

Markdown Kullanımı Türkçe

Markdown Nedir, Ne Amaçla Kullanılır?

Markdown, yazılarımızı düz metin olarak yazmamıza imkan veren işaretleme/biçimlendirme dilidir (markup language). Markdown’ın temel amacı, metnimizi kolayca hazırlamak ve düz metin haliyle bile metnin rahatça okunmasını sağlamaktır.

Devamı...

 Numpy Kütüphanesi Nedir? Nasıl Kullanılır?

NumPy, Python programlama diline ait çok boyutlu dizilerle ve matrislerle çalışmamıza yardım eden ileri düzey matematiksel işlemler yapabileceğimiz bir kütüphanedir. Günümüzde özellikle veri bilimi üzerine çalışanlar başta olmak üzere Numpy, Python programlayanlar tarafından çok sık kullanılan bir kütüphanedir.

Numpy Nedir?

  • Açık Kaynak ve numerik bir Python kütüphanesidir.
  • Çok boyutlu dizin ve matris veri yapılarını içerir
  • Numeric ve Numarray öğelerinin uzantısıdır.
  • Rastgele sayı üreteçlerine sahiptir.
  • Pandas nesneleri büyük ölçüde Numpy ile bağlantılıdır. Buna Pandas Numpy’i genişletir diyebiliriz.
  • Dizinler üzerinde matematiksel, cebirsel ve istatistiksel operasyonlar uygulamak için kullanılır.

Numpy Kullanımı

Öncelikle eğer bilgisayarınızda Numpy kütüphanesi kurulu değilse terminalden bu komut ile Numpy’ı indiriyoruz.

Devamı...

 Veri bilimciler için Python ekosistemi

Veri bilimi deyince bugün akla ilk gelen programlama dillerinden biri Python. Python 1996’da doğdu, ama uzun zaman bilimsel uygulamalarda diğer dillerin gölgesinde kaldı. Hakettiği yere son on yıl içinde ulaştı ancak. Son yıllarda programlama dillerinin yaygınlığı sıralamalarında düzenli olarak ilk üçe yerleşiyor.

Bu başarının kökünde Python’un çok kolay öğrenilen, kolay okunan bir dil olması yatıyor. Üstelik “çıplak” bir dil değil; çok zengin bir standart kütüphane ile birlikte geliyor. Matematik fonksiyonlarından düzenli ifadelere, süreç kontrolünden HTTP’ye, hatta Tkinter grafik arayüzüne kadar. Bu, Python’un “pilleri içindedir” sloganıyla özetlenen yaklaşımından kaynaklanıyor.

Python nesneye yönelik bir dil. Python’daki her şey, tamsayılar ve karakterler bile bir nesnedir. Ama nesneye yönelik programlama yapmanız gerekmiyor. En basit kullanımda, nesneleri kullandığınızın farkında bile olmazsınız. Prosedürel programlama ile başlayıp, sonra isterseniz kendi sınıflarınızı tanımlayıp nesneye yönelik programlama yapmaya geçebilirsiniz. Python’un çeşitli fonksiyon araçlarıyla fonksiyonel programlama da yapabilirsiniz.

Python’u mevcut programlarınızı otomatik olarak çalıştırmak için kullanabilirsiniz. Bir programın çıktısını alıp, bir diğerine uygun hale getiren bir program yazarak iş akışınızı otomatikleştirebilirsiniz. Böylelikle sık yaptığınız analizleri tek bir komutla tamamlayabilir, gerektiğinde kolaylıkla tekrar üretebilirsiniz.

Yorumlanan bir dil olan Python, derlenen dillere (C, Fortran, vs.) göre daha yavaş çalışır. Bu hız farkı 20-30 kata varabilir. Ama Python’un zaman açısından başka kozları da vardır; program geliştirme sürecini kolaylaştıran bir sadeliğe sahip olması gibi. Sözgelişi, bir düz metin dosyasını tarayıp, içindeki kelimelerin istatistiklerini çıkarmak, n-gramlar oluşturmak Python’da belki bir saatte yapılabilecek bir iştir. Ama bunu C ile yapmaya çalışmak birkaç gün, veya daha fazlasını alabilir. Ortaya çıkan Python programı işini diyelim 2 dakikada tamamlasın, C programı 10 saniyede. Hangisiyle işi daha çabuk bitirdik?

Tabii bu örnek bir kerelik işlemler için geçerli. Eğer bu işi binlerce kere tekrarlamamız gerekiyorsa C programı için yatırdığımız zaman kendini amorti edebilir. Ama bu durumda bile Python yardımımıza yetişiyor. Python/C uygulama arayüzü sayesinde C programları içinde Python veri yapıları ve fonksiyonlarına erişebilir, Python’un sağladığı yüksek seviyeli işlevlerden faydalanabiliriz. Veya Python programları içinde hesaplama yükü ağır olan kısımları C ile yazıp, bir Python modülü olarak derleyebiliriz. Nitekim Numpy, SciPy, Numba gibi yüksek performanslı paketlerin hızlı çalışması gereken kısımları C ile yazılmıştır.

Python’un başarısı sadece güzel tasarımından ve kullanım kolaylığından kaynaklanmıyor. Benzer kolaylıkta başka diller de var. Sözgelişi Ruby de sade, kolay öğrenilen ve güçlü bir dildir, ama Python kadar yaygınlaşamadı. Python’un sevilmesinin en büyük sebeplerinden biri, akla gelebilecek neredeyse her uygulama alanında çok kaliteli kütüphaneler ve API’lerin geliştirilmiş olması. Örneğin Web programlama çatısı Django, üç boyutlu veri görselleme için MayaVi, bilimsel hesaplama için SciPy, veri analizi için pandas, sembolik matematik için SymPy, dinamik web sayfalarından veri almak için Scrapy, görüntü işlemek için PIL, oyun geliştirmek için PyGame, grafik arayüz oluşturmak için wxWidgets ve pyQt, ve daha niceleri…

Bugün bir veri bilimci Python’u tek başına kullanmaz. Python çekirdeğinin çevresinde oluşan bir ekosistem içindeki modüller ve yazılımlar, veri bilimcilerin alet çantasının vazgeçilmez araçlarıdır. Hepsi açık kaynaklı olan bu araçların bazılarına göz atalım.

Python çekirdeği

Python olgunlaştıkça, dilin ilk tasarımını değiştirme ihtiyacı ortaya çıktı. Bir yerden sonra anlaşıldı ki, geriye dönük uyumluluğu kaldırmadan gerekli değişiklikleri yapmak mümkün değil. O yüzden 2.6 versiyonuyla beraber 3.0 versiyonu da geliştirildi ve birlikte yayınlandı. Yeni Python’un bazı değişiklikleri, 2.x dalına da geriye dönük uyumluluğu bozmayacak şekilde aktarıldı ve 2.7 versiyonu oluştu. Bu, 2.x dalının son versiyonu oldu. Bundan sonra dilin gelişimi sadece 3.x versiyonundan yürüdü.

Hangisini kullanmalısınız? Eğer programlamaya yeni başlıyorsanız düşünmeden 3.x dalındaki en yeni versiyonu kullanın. 2.x dalı artık sadece eski kodları çalıştırmak için gerekiyor.Eğer şimdiye kadar 2.x kullandıysanız endişe etmeyin. Sözdizimi açısından iki dil arasındaki farklar çok az. Eski Python kodlarınızı 3.x’e uyumlu hale getirmek için “Porting Python 2 Code to Python 3” sayfasındaki tavsiyeleri okuyabilirsiniz.

Geliştirme arayüzü (IDE)

Bir Python programı, Python ifadeleri içeren bir metin dosyasından ibarettir. Python programı yazmak için aslında bir metin editöründen başka bir şeye ihtiyacınız yok (Word olmaz!). Ancak, yorumlanan bir dil olan Python’u etkileşimli kullanmak, mesela kod yazarken bir yandan yorumlayıcıya bazı komutlar vermek, birçok durumda hayatı kolaylaştırır. Bir IDE kullandığınızda, program editörüyle entegre bir yorumlayıcıya ulaşırsınız; komut tamamlama özelliği ile sekme tuşuna bastığınızda bağlama uyumlu olan isimleri listeler; fonksiyon çağrılarının iç belgelerine (docstrings) ulaşıp çevrimiçi yardım alabilirsiniz; programdaki hataları bulmak için bir hata ayıklayıcı kullanabilirsiniz.

Python ile beraber gelen IDLE arayüzü çok sadedir; bu özelliklerin küçük bir kısmını sağlar. Spyder daha gelişkindir; bilimsel çalışma için geliştirilen IPython yorumlayıcını kullanabilir. Daha profesyonel ve karmaşık projeler için PyCharm veya Eclipse tercih edilebilir.Alternatif olarak, emacs veya atom editörleri için hazırlanmış bazı eklemelerle, bunları bir IDE haline getirebilirsiniz.

Jupyter notebook

Jupyter notebook bugün veri bilimcilerin en çok kullandığı araçlardan biridir. Bir notebook’un amacı ardışık komutları sırayla kaydetmek, komutların çıktısını kaydetmek ve gerektikçe bunları kolayca tekrar üretmektir. Özellikle etkileşimli çalışma için hazırlanırlar.

Jupyter notebook, bir çekirdek ile beraber çalışır. Bu çekirdek sadece Python olmak zorunda değildir; R, Julia, veya başka bir dille de çalışabilr. Jupyter, verilen komutu çekirdeğe yollar ve çekirdeğin gönderdiği cevabı ekrana yazar. Ayrıca, açıklamalar için kullanılabilecek düzyazı kısımları da tanımlanabilir. Bu kısımlara Markdown veya HTML formatında yazılabilir.LaTeX komutlarıyla matematiksel ifadeler  yazılabilir. Böylece yaptığımız işi ayrıntısıyla adım adım anlattığımız bir laboratuar defteri üretmiş oluruz. Bir Jupyter defteri HTML veya PDF olarak dışa aktarılabilir, veya etkileşimli bir sunum haline getirilebilir.

Numpy

Python dilindeki öntanımlı liste yapısı genel amaçlara uygundur, ama tam da bu yüzden nispeten yavaştır. Numpy özel bir dizi tipi (array) tanımlar. Bu dizilerde bütün elemanlar aynı tiptedir (sözgelişi int64 veya float64) ve fiziksel bellekte yanyana yer alırlar. Bu düzen sayesinde dizideki herhangi bir elemana ulaşmak çok daha hızlı olur. Numpy ile istediğiniz boyut ve büyüklükte dizi nesneleri tanımlayabilir, ve bunları hızlı şekilde düzenleyebilirsiniz. Numpy’ın özel matematiksel fonksiyonları, fonksiyonu her elemana ayrı ayrı uygulayacak şekilde hazırlanmışlardır. Söz gelişi, numpy.sqrt(a) çağrısı a’nın her elemanının karekökünü alır. Bu fonksiyonlar hızlı çalışmaları için C ile kodlanmışlardır. Numpy genel amaçlı bir kütüphanedir. Yoğun hesaplama gerektiren birçok paket kendi içinde Numpy dizilerini kullanır.

matplotlib

Python’un yarıresmi grafik ve görselleştirme paketi. Numpy üzerine kurulu. Yüksek kaliteli grafik üretmek çok kolay. matplotlib.pylab arayüzü ile Matlab benzeri komutlar kullanabilirsiniz. Çoğunlukla, ihtiyaç duyduğunuz işleri çok basit komutlarla üretebilirsiniz. Pylab arayüzünün yetersiz kaldığı durumlarda, çok daha geniş özelleştirme imkanı sunan nesne arayüzünü kullanabilirsiniz.

pandas

Veri analizi için en güçlü araçlardan biri. Numpy ve matplotlib üzerine kurulu. Veri tablosu bir DataFrame nesnesi olarak saklanır. Veri sütunlarının tipleri farklı olabilir (sayısal, dize, tarih, kategorik, vs.). Sütunlar ve satırlar üzerinden kolayca filtreleme yapılabilir, tablo biçimi değiştirilebilir, CSV, Excel veya başka formlardan veri alınabilir. Veri analizinin olmazsa olmazı.

 Bilimsel Programlamaya Kolay Başlangıç – 4

Yazı dizimizin bir önceki bölümünde  numpy kullanımına basit bir giriş yapmıştık, şimdi ise daha ileri matematiksel yöntemleri içeren scipy‘a bir göz atalım. Yapmaya çalıştığımız “ivmenin nümerik integrasyonu” işi, aslında bir “ikinci derece diferansiyel denklem çözümü” ile eşdeğer. Konumun zamana göre ikinci türevi olan ivme diferansiyel denklemini analitik olarak çözebilseydik, konum ve hız vektörlerinin geçmiş ve gelecekteki tüm değerlerini bulabilirdik. Lakin bunu analitik olarak çözmeye hiç niyetimiz yok – işi bilgisayar yapabilecekken biz niye uğraşalım ki?

scipy bu tür diferansiyel denklemleri çözmek için bize integrate paketi altında solve_ivp adlı kütüphaneyi sunuyor. Bu kütüphane altındaki metodlarla diferansiyel denklemleri sayısal olarak kolayca çözebiliriz. Ancak öncelikle denklemleri bu yöntemlerin anlayacağı halde yazmamız gerek, diğer bir deyişle ikinci derece diferansiyel denklemi iki tane birinci derece diferansiyel denklem haline getirmemiz gerekiyor. Öncelikle kullanacağımız ara değişkenleri belirleyelim:

$ \vec{y_1} = \frac{d\vec{r}}{dt} = \dot{\vec{r}} $

$ \vec{y_2} = \vec{r} $

Şimdi de ikinci derece diferansiyel denklemimizi bu yeni değişkenler cinsinden yazalım:

$ \dot{\vec{y_2}} = \frac{d\vec{y_2}}{dt} = \vec{y_1} $

$ \dot{\vec{y_1}} = \frac{d\vec{y_1}}{dt} = – \frac{\mu}{(y_2)^3} \vec{y_2} $

Böylece ikinci derece diferansiyel denklemimiz iki tane birinci derece diferansiyel denkleme indirgendi ve scipy‘ın çözebileceği hale geldi.

Yukarıda olan biteni kod halinde yazmak zor değil:

In [25]:

Devamı...

 Bilimsel Programlamaya Kolay Başlangıç – 3

Bilimsel Programlama’ya Kolay Başlangıç serisinin ilk yazısında Hazırlık, Hesaplama ve Sonuçları Görselleştirme adımlarından bahsetmiş ve bunları serbest düşüş problemine uygulamıştık. İkinci yazıda ise Hesaplama adımından sonra Veri/Hata Analizi adımını eklemiş ve eğik atış problemini Euler sayısal metodu ile hesaplayarak hatamızı incelemiştik. Lakin tüm bunları Python’un kendi matematik kütüphanesi olan math ile gerçekleştirdik.

Serinin üçüncü yazısında ise math‘a oranla (genellikle) daha hızlı ve çok daha yetenekli olan numpy ve sonrasında da bunun üstüne bir kat daha çıkarak scipy kütüphanelerine terfi edeceğiz ve kolay yoldan bir ikinci derece diferansiyel denklem çözeceğiz. Bunun için Eğik Atış problemi yerine, nonlineer bir problem olan “iki cisim problemini”, yani Dünya’nın çevresindeki uyduların dinamiğini kullanacağız.

İki cisim problemi en genel haliyle kütle çekiminden kaynaklanan ivmeden ibaret:

$ \ddot{\vec{r}} = – \frac{\mu}{r^3} \vec{r} $

Burada $\vec{r}$ konum vektörünü, $r$ konum vektörünün büyüklüğünü ve $ \ddot{\vec{r}} $ konum vektörünün zamana göre ikinci türevini, ya da daha bilindik adıyla ivmeyi gösteriyor. $\mu$ ise pek tanıdık değil, ama aslında Dünya’nın kütleçekim sabitini gösteriyor ve $G M_{Dünya}$’ya, yani evrensel kütleçekimi sabiti ile Dünya’nın kütlesinin çarpımına eşit. Örneğin Ay’ın ya da bir uydunun, Dünya’nın çevresinde dönerken gelecekteki konum ve hızını bulabilmek için, başlangıçtaki konum ve hızı bu ivmenin integralini alarak ilerleteceğiz. İntegral lafını duyunca tüyleriniz diken diken olduysa korkmayın; integrali biz almayacağız, bilgisayar alacak.

Matematiğe gelmeden önce, işin kalbindeki veri yapısı olan ZamanKonumHız sınıfının numpy kullanan yeni sürümüne bakalım:

In [18]:

Devamı...

 Bilimsel Programlamaya Kolay Başlangıç – 2

Bilimsel Programlamaya Kolay Başlangıç serisinin ilk yazısında sadece grafikler için matplotlib kütüphanesini kullanarak serbest düşüş problemini modellemiş ve sonuçları grafiklerle görselleştirmiştik. Vesileyle, “fonksiyonları ne zaman nerede kullanmak gerekir” sorusuna da bir başlangıç yapmıştık.

İlk yazıda Bilimsel Programlama 3 adımdan oluşur dedik, ama aslında birçok problemde dört adımdan bahsetmek mümkün:

  1. Hazırlık (Sabitleri başlatma, gerekirse veri yapılarını oluşturma vb.)
  2. Hesaplama
  3. Veri Analizi (Hesaplama sonuçlarını gerçek veriler ya da başka bir modelle karşılaştırma, diğer bir deyişle Hata ya da Fark Analizi)
  4. Sonuçları Görselleştirme

Bu yazıda öncelikle eğik atış problemini çözeceğiz ve sayısal yöntemlerin ne kadar başarılı olduğuna bakacağız. Elimiz değmişken sınıf (class) yapılarının nasıl kullanıldığına dair de basit bir örnek yapmış olacağız.

Eğik atış problemi iki eksende çözülüyor, yatay eksen x ve düşey eksen y.

İki eksendeki konum değişimi şu şekilde gösterilebilir:

$t$ anında yatay eksendeki konum: $ r_x(t) = r_x(0) + v_x(0) t $

$t$ anında düşey eksendeki konum: $ r_y(t) = r_y(0) + v_y(0) t – \frac{1}{2} g t^2 $

İki eksendeki hız değişimi ise şu şekilde gösterilebilir:

$t$ anında yatay eksendeki hız: $ v_x(t) = v_x(0) $

$t$ anında düşey eksendeki hız: $ v_y(t) = v_y(0) – g t $

Parametreler ise şöyle:

$r_x(t), r_y(t) = $ x ve y ekseninde konum vektörü bileşenleri ($m$)

$v_x(t), v_x(t) = $ x ve y ekseninde hız vektörü bileşenleri ($m/s$)

$g = $ yerçekimi sabiti (9.81 $m/s^2$)

$t = $ zaman ($s$)

Formüllerin bize anlatmak istediği şey şu:

  1. Cisim yatay eksende başlanıç hızında gitmeye devam eder
  2. Cisim düşey eksende başlangıç hızında başlar, hızı yerçekimi ivmesiyle orantılı olarak düşey yönde değişir ve sonuçta düşmeye başlar.

“Bu kadar matematik yeter” diyorsanız, kodlama işine başlayalım o zaman. Öncelikle basit bir vektör sınıfı oluşturalım. Bu sınıf zaman, yatay ve düşey konum ile yatay ve düşey hız bileşenlerinden oluşuyor.

In [1]:

Devamı...

 Bilimsel Programlamaya Kolay Başlangıç – 1

Bilimsel Programlamaya Kolay Başlangıç gibi bir seri oluşturma fikri, öğrencilerin bir problemi çözmek için yaklaşım geliştirmekte ne kadar zorlandıklarını gördükten sonra kafamda oluşmaya başladı. Veri Defteri’nde belli bir konuyu açıklamayı hedefleyen birçok faydalı yazı var, ama benim amacım, programlamayı araç olarak kullanmak; seri boyunca gitgide karmaşıklaşan problemleri buna uygun programlama araçlarıyla çözmek.

Bilimsel Programlama denilince akla şu ara yapay zeka, makine öğrenmesi gibi afili konular geliyor, ama aslında bilimsel programlama bazen bundan çok daha fazlası ve genellikle de çok daha azı. Aslında istediğimiz şey, basit ya da karmaşık bir problemi bilgisayar aracılığıyla çözülebilir hale getirmek, problemi bilgisayara çözdürmek ve sonuçları anlayıp değerlendirmekten ibaret.

Bilimsel Programlama her disiplin için farklı şeyler ifade etse de, öğrencilerden araştırmacılara birçokları için temel birkaç adımdan oluşuyor:

  1. Hazırlık (Sabitleri başlatma, gerekirse veri yapılarını oluşturma vb.)
  2. Hesaplama
  3. Sonuçları Görselleştirme

Olan biteni daha net anlatabilmek için son derece basit, lise seviyesinde bir problemi ele alalım: Serbest Düşüş Hareketi.

Problemin matematiksel modeli bu kadarcık:

Konum değişimi:

$ h(t) = h(t_0) – \frac{1}{2} g t^2 $

Hız değişimi:

$ v(t) = v(t_0) – g t $

Parametreler ise şöyle:

$h = $ yükseklik ($m$)

$v = $ hız ($m/s$)

$g = $ kütleçekimi sabiti (Dünya için 9.81 $m/s^2$)

$t = $ zaman ($s$)

$h(t_0) = $ başlangıçtaki yükseklik ($m$)

$v(t_0) = $ başlangıçtaki hız ($m/s$)

Bu yazıda sadece yukarıdaki formül ile “gerçek” değerler üzerinden ilerleyeceğiz, sonraki yazıda ise yatay atış hareketi ve bunun sayısal yöntemlerle modellenmesi konusunda değineceğiz. Amacımız, başlangıçtan itibaren 10 saniye içinde düşen cismin yükseklik değişiminin grafiğini çizebilmek. Bunun için 1 saniye aralıkla yüksekliği hesaplayacağız.

İlk adım olarak, hazırlık aşamasında yerçekimi sabitini ve çıktı alacağımız zaman listesi ile daha sonra dolduracağımız konum ve hız listelerini oluşturuyoruz:

In [9]:

Devamı...

Python Programlamaya Giriş 23 – Modüller ve paketler

Her programlama dilinde olduğu gibi Python’da da tekrar tekrar kullanılabilen fonksiyon ve sınıfların bir kütüphane şeklinde ayrı dosyalarda saklanması ve yeni yazılan programlara entegre edilmesi için bir mekanizma vardır. Standart kütüphaneler, SciPy ve benzeri paketler, veya kendi kişisel fonksiyon kütüphaneniz bu modül sistemiyle inşa edilir.

Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz.

Modüller

Python’da bir modül yaratmak için özel bir işleme gerek yoktur. Python kodu içeren, .py uzantılı herhangi bir dosya bir modül olabilir. Sözgelişi, aşağıdaki kodu basitmodul.py isimli bir dosyaya yazıp kaydettiğinizde, bir modül yaratmış olursunuz.

In [1]:

Devamı...

Python Programlamaya Giriş 22 – Hata yakalama, try/except

Hata yakalama (exception handling) beklenmedik durumlarda programınızın bir hata mesajı vermesi ve çalışmayı durdurması yerine, hataya kendi istediğimiz şekilde cevap vermesini sağlamanın bir yoludur. Hata yakalama Python programcılığının önemli bir parçasıdır, kaynak kodunu çok karışık hale getirmeden programınızın güvenilir bir şekilde çalışmasını sağlar.

Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz.

Hatalı girdiyi yakalamak

Bir örnekle başlayalım: Etkileşimli çalışarak kullanıcıdan sayılar alan ve aldığı sayıların karesini ekrana basan bir program yazalım. Boş satır okuduğunda program sonlansın.

In [ ]:

Devamı...

Python Programlamaya Giriş 21 – Dinamik kod üretme

Python dinamik tabir edilen dillerden biridir; programdaki nesneleri önceden bildirmeniz gerekmez, program çalıştıkça işlenen komutlar o anda yeni nesneler üretir. Bu dinamiklik sayesinde, dize olarak verilmiş Python komutlarını da işleyebilir, hatta program yazan programlar yazabiliriz.

Bu işlemi yapmak için iki Python fonksiyonu vardır: eval() ve exec()

Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz.

eval

Bu fonksiyon, Python komutları içeren bir dizeyi yorumlayıcıya gönderir ve sonucu geri verir.

In [1]:

Devamı...

Python Programlamaya Giriş 20 – Dosya Okuma ve Yazma

Yazı dizimizin bu bölümünde, dosya okuma ve yazma yöntemlerinden bahsedeceğiz. Önce herhangi bir özel şekilde yapılanmamış olan düz metin dosyalarını işlemeyi göreceğiz. Ardından csv modülüyle CSV biçiminde yapılanmış dosyaları okuyup yazmayı inceleyeceğiz. JSON, ZIP, PDF, Word, Excel, HTML dosyalarının işlenmesine kısaca değineceğiz. Son olarak, Python oturumunda yarattığımız nesneleri ikili (binary) formda dosyaya kaydetmemizi ve sonra dosyadan tekrar yüklememizi sağlayan pickle modülünün kullanımını özetleyeceğiz.

Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz.

Genel dosya okuma/yazma

Dosya okumak

Öncelikle, IPython sihirleriyle deneme.txt isimli bir dosya yaratalım (Jupyter kullanmıyorsanız aşağıdaki metni bir metin editörüne kopyalayıp deneme.txt ismiyle çalışma dizininize kaydedebilirsiniz).

In [1]:

Devamı...

Python Programlamaya Giriş 14 – Sözlük Metodları

Python’daki veri tiplerini daha önce kısaca ele almıştık; bir önceki bölümde de liste tipine ait metodların kullanımını örneklerle incelemiştik. Bu yazıda sözlük tipine ait olan metodları örneklerle açıklıyoruz. Bundan sonraki bölümlerde dize ve küme tiplerine ait metodları inceleyeceğiz.

Sözlükler, listeler gibi, birden fazla elemanı bir araya toplayan yapılardır. Listelerden farkları sıralı nesne olmamalarıdır. Bir listenin indeksleri üzerinden doğal bir sırası varken, sözlüklerin elemanlarında doğal bir sıralama mevcut değildir.

Bir sözlük birleşmeli dizi (associative array) olarak anılan bir veri yapısıdır. Bu yapıdaki her eleman bir anahtar-değer (key-value) çiftinden oluşur. Belli bir değere ulaşmak için o değere ait tekil anahtarı kullanmak gerekir. Bu anahtar bir sayı, dize veya çokuz olabilir.

Devamı...

Python Programlamaya Giriş 19 – Liste kurma, sözlük kurma, üreteç ifadeler

Diyelim mevcut bir listedeki her elemanı tek tek işleyip, işlemin sonuçlarını yeni bir listede toplamak istiyorsunuz. Bunun için boş bir listeyle başlayıp, bir döngü içinde append() metoduyla listeyi adım adım büyütebiliriz. Bu yazıda Python’da bu işlemi daha hızlı verimli olarak yapmamızı sağlayan özel liste kurma yazımını göreceğiz. Liste kurma, genel olarak bir üreteç ifadesi örneğidir. Liste kurma gibi sözlük ve kümeleri de hızlıca kurmak için benzer bir yazım kullanırız.

Yazı dizimizin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz.

Basit liste kurma

Basit bir örnekle başlayalım: Bir sayı listesi alalım, ve liste elemanlarının karelerinden oluşan yeni bir liste oluşturalım.

Şimdiye kadar gördüğümüz yöntemlerle bu işi yapmak için önce boş bir liste yaratırız, sonra bir for döngüsü içinde sayıları tek tek alırız, karelerini teker teker boş listeye ekleriz.

In [1]:

Devamı...