1.2. Değişkenler ve Basit Hesaplamalar

Kayıt Tarihi:

Son Güncelleme:

Özet:

Bu derste Python ile program yazarken değişkenleri kullanmaya başlıyoruz, bu sayede karmaşık hesaplamaları daha basit kod parçaları ile yapabiliriz.

Anahtar Kelimeler: biçimleyiciler · değişkenler · printf · qnew · tam sayı bölmesi

Basit Bir Hesaplama

Yerden $v_0$ ilk hızla havaya atılan bir topun bir $t$ anındaki düşey konumunu veren $y(t)$ fonksiyonu $$y(t)=v_0t-\frac{1}{2}gt^2$$ ile verilir ($g\approx 9.81\;\text{m/sn}^2$ yerçekimi sabiti). Şimdi Python programlama dili yardımı ile bilgisayarı bir hesap makinesi gibi kullanarak bu formülü $v_0$ ve $t$'nin farklı değerleri için hesaplatacağız. Örnek olarak $v_0=10 \text{ m/sn}^2$ ilk hızla fırlatılan nesnenin $t=0.3$ sn zamanındaki konumunu hesaplatıp ekrana yazdıran bir program yazalım, Bunu Python da tek satırlık bir kod ile aşağıdaki gibi yapabiliriz.


print 10*0.3 - 0.5*9.81*0.3**2

Gördüğünüz gibi yukarıdaki formülde $v_0$, $t$ ve $g$ değerlerine yerine yazdık ve print ifadesiyle bunu ekrana yazdırdık. Python burada ekrana belirtilen işlemin sonucunu doğrudan yazdırır. Bu kodları hesap1.py olarak kaydedip çalıştırırsak aşağıdaki çıktıyı alırız.


Terminal > python hesap1.py
2.55855

Aynı hesabı $v_0 = 2$ ve $t=0.1$ için yapalım, hesap2.py olarak kaydedip çalıştıralım.


print 2*0.1 - 0.5*9.81*0.1**2

Çıktısı aşağıdaki gibi olcaktır.


Terminal > python hesap2.py
0.15095

Şimdi bu yazdığımız programı analiz edelim. Burada kullandığımız ilk ifade print, bu ifade kendinden sonra gelen nesneyi ekrana yazdırmaya yarar. Daha sonra da ekrana yazdırılmasını istediğimiz ifadeyi Python dilinde yazdık. Cebirsel işlemler Python'da yazılırken günlük matematik yazımına benzer bir söz dizimi uygularız. Toplama, çıkarma, çarpma, bölme ve kuvvet alma işlemlerini sırasıyla +, -, *, /, ** sembolleriyle kodlarız. Burada $(1/2)\cdot9.81\cdot0.1^2$ sayısını kodlarken 1/2 sayısını 0.5 olarak yazmamızın özel bir sebebi var, az sonra değineceğiz. Python ile kodlama yaparken cebirsel işlem önceliği matematikte olduğu gibidir. Ayrıca bu temel işlemler dışında işlemler yapmamızı sağlayan farklı cebirsel işlem operatörleri de vardır, zamanı geldikçe öğreneceğiz. Bu programda boşlukların kullanımına da değinelim, - işaretinin boşluklarla ayrıldığı dikkatinizi çekmiş olabilir. Aynı satırda olduktan sonra boşlukların sayısı Python için fark oluşturmaz, print 2*0.1-0.5*9.81*0.1**2 komutu da aynı sonucu verir. Fakat okunaklı olması açısından programımıza gerekli yerlerde boşluklar bırakabiliriz, matematiksel işlemlerde + ve - işaretlerini boşluklarla ayırmak, diğer işlemlerde boşluk kullanmamak işlemi daha kolay okunur yapacaktır.

Python Değişkenleri

Bir program yazarken genelde tüm sayıları yukarıda yaptığımız gibi işleme sokarak sonuca gitmeyiz, bunlara birer isim verip birer değişken haline getirip formülde isimleriyle kullanırız.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - 0.5*g*t**2
print y

Yukarıdaki programda v0, g, t ve y isimli dört tane yeni değişken tanımladık. Bunlardan ilk üçüne birer değer atadık, dördüncüsünün de değerini Python'a nasıl hesaplayacağını tarif ettik. Daha sonra bu son değişkenin değerini ekrana yazdırdık. Python'da yeni bir değişken tanımlama işlemi degisken_ismi = deger komutuyla yapılır. Bu programı kaydedip çalıştırırsak öncekiyle aynı çıktıyı alırız, bu program sadece daha okunaklı. Yazacağımız programların olabildiğince okunaklı olmasını sağlamalıyız, bu sayede daha sonra mevcut hataları düzeltmek veya programı geliştirmek için yapacağımız güncellemeler yapmak daha kolay olacaktır. Değişkenleri isimlendirirken olabildiğince kısa ve amacına uygun isimler seçmeliyiz, bu da programın okunaklı olmasına katkıda bulunacaktır. Yukarıdaki programı şimdi de bir interaktif Python oturumunda çalıştıralım.


Terminal > python
Python 2.7.13 (default Apr 4 2017, 8:46:44)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> v0 = 2
>>> g = 9.81
>>> t = 0.1
>>> y = v0*t - 0.5*g*t**2
>>> print y
0.15095

Değişken tanımlarken dikkat etmemiz gereken önemli bir nokta var. Bazı kelimeler Python tarafından rezerve edilmiştir ve programlarımızda bu kelimeleri değişkenlere isim olarak atayamayız. Bu kelimeler and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, with, while, yield kelimeleridir. Bunların Python için özel anlamları vardır ve bu kelimeleri görünce Python bu anlamlarına göre hareket eder, bunların anlamlarını karşılaştıkça öğreneceğiz.

Yorumlar ve Metin Biçimleyiciler

Şimdi yukarıdaki programı daha okunaklı yapmak için kodların içine bazı notlar ekleyelim.

v0 = 2                 #baslangic hizi
g = 9.81               #yercekimi ivmesi
t = 0.1                #zaman degiskeni
y = v0*t - 0.5*g*t**2  #konum hesaplamasi
print y

Python # karakteri ile karşılaştığında o satırın geri kalanını değerlendirmeden bir alt satıra atlar. Bu sayede programımıza bazı yorumlar ekleyebiliriz. Bu notlar program çıktısına etki etmez, sadece kodları daha okunaklı yapar. Burada yorumları yazarken Türkçe karakterler kullanmadığımız dikkatinizi çekmiştir, Python varsayılan olarak ASCII karakterlerle çalışır, eğer farklı bir karakter seti kullanmak istiyorsak bunu belirtmeliyiz. Örneğin Türkçe karakterler için UTF-8 karakterlere ihtiyacımız var bunun için programın ilk satırına # -*- coding: utf-8 -*- yazmalıyız. Bu satır # karakteriyle başlasa da Python tarafından yorum olarak kabul edilmez ve değerlendirilir. Ayrıca bu satırın programımızın ilk satırı olması zorunludur. Bu şekilde Türkçe karakterler sorunsuz bir şekilde kullanılabilir olsa da yukarıdaki örnekte yaptığımız gibi programımızı tamamen ASCII karakterlerle yazmanız önerilir. Bu metinde bundan sonra türkçe kelimeler sadece ASCII karakterler kullanılarak yazılacaktır.


# -*- coding: utf-8 -*-
v0 = 2                 #baslangıç hızı
g = 9.81               #yerçekimi ivmesi
t = 0.1                #zaman değişkeni
y = v0*t - 0.5*g*t**2  #konum hesaplaması
print y

Programımızın kodlarını yeterince okunaklı yapmak sadece programcının yararınadır, kullanıcı için de programın çıktısını daha anlaşılır yapmalıyız. Şu anda programımız sadece ekrana bir sayı yazdırıyor, bu sayının anlamlı bir cümle içinde yazılması daha uygun olacaktır. Bunun için en sık kullanılan yöntem printf yöntemi olarak adlandırılır ve aşağıdaki gibi kullanılır.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - 0.5*g*t**2
print "t=%g sn zamaninda topun yuksekligi %5.2f metredir." % (t, y)

Bu programı çalıştırırsanız çıktısı aşağıdaki gibi olacaktır.


Terminal > python hesap6.py
t=0.1 sn zamaninda topun yerden yuksekligi 0.15 metredir.

Bu çıktı kullanıcı açısından yeteri kadar açıktır. Şimdi bu programda print ifadesinde metni nasıl biçimlendirdiğimizi açıklayalım. Bu yöntemde önce ekrana yazdıracağımız metni hazırlarız ve değişkenlerin yerleşeceği bölümleri belirleriz. Bu örnekte ekrana yazdırmak istediğimiz metin "t=X sn zamaninda topun yerden yuksekligi Y metredir." biçimindedir ve X ile Y kısımlarına bazı değişkenlerin değerlerinin yazılmasını istiyoruz. Python'da bu şekilde çift tırnak işareti içinde yazılan her şey bir saf metin olarak algılanır, bu tür nesnelere string nesneleri denir. Nesne konusunu daha sonra detaylı olarak ele alacağız ama birkaç söz söyleyelim şimdi. Python'da herşey bir nesnedir, metinler, sayılar, formüller, fonksiyonlar, vb.. Bu bölümde metinlerin dışında sıklıkla kullandığımız tamsayılar int nesneleridir (integer), ondalıklı sayılar ise float nesneleridir. String nesneleri tek tırnak içinde de yazılabilir, `t=X sn zamaninda topun yerden yuksekligi Y metredir.' ifadesi de aynı anlamdadır. Şimdi bu string nesnesini biçimlendireceğiz, yani X ve Y yazan yerlere sırasıyla programımızda tanımladığımız t ve y değişkenlerinin değerlerini yazdıracağız. Bunun için bu karakterlerin olduğu yere % sembolüyle başlayan bir biçimleyici yerleştiririz. % karakterinden sonra buraya yerleştirilecek verinin formatını belirten kısaltmalar kullanırız. %s ile buraya bir string formatında, %d ile tamsayı formatında ve %f ile de 6 ondalık basmaklı olmak üzere bir float veri yazılacağı belirtilir. Eğer %.2f biçiminde girersek virgülden sonra iki ondalık basamaklı biçimlendirmesini istemiş oluruz, benzer şekilde %5.2f yazarsak virgülden sonra iki basamak olmak üzere toplam beş karakterlik bir biçimlendirme yaptırırız. Bilimsel formatta biçimlendirme çeşitleri de %e ve %E biçimindedir. %g veya %G ile mümkün olan en kompakt biçimde sayıları biçimlendiririz. Biçimleyicileri yerleştirdikten sonra metnin sonuna tekrar % işareti koyup bu biçimleyicilerin alacakları değişkenleri sırasıyla belirtiriz, tek bir değişken kullandıysak parantez kullanmadan da yazabiliriz. Eğer birden fazla satır kaplayan bir metin yazdırmak istersek bunu üç tane tırnak işareti arasında yazarız.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - 0.5*g*t**2
print """
v0=%f m/sn ilk hizla firlatilan bir topun
t=%g sn zamaninda yerden yuksekligi %.2e metredir.
g=%3.2f m/sn^2 alinmistir.
""" % (v0, t, y, g)

Bu programın çıktısı aşağıdaki gibi olacaktır.


Terminal > python hesap7.py

v0=2.000000 m/sn ilk hizla firlatilan bir topun
t=0.1 sn zamaninda yerden yuksekligi 1.51e-1 metredir.
g=9.81 m/sn^2 alinmistir.

Tam Sayı Bölmesi

Şimdi bu programda kullandığımız fomülü yeniden ele alalım. Bu formülü y = v0*t - 0.5*g*t**2 yerine y = v0*t - (1/2)*g*t**2 biçiminde değiştirelim.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - (1/2)*g*t**2
print y

Programı çalıştırırsak beklemediğimiz bir çıktı alırız.


Terminal > python hesap8.py
0.2

Gördüğünüz gibi yanlış hesaplama yapıldı. Bunun sebebi şudur, Python 2'de tamsayı nesneleri bölme işlemine alınınca sonuç yine bir tamsayı olarak döndürülür. Dolayısıyla bölme işlemi sonucu ondalıklı oluyorsa virgülden sonraki kısmı silinerek bu sayı bir integer nesnesine döndürülür. Bu örnekte parantez içinde bulunan 1/2 işlemi 0.5 değerine eşit olduğu için virgülden sonra gelen kısım silinince 0 tam sayısı elde edilir, hatanın kaynağı budur. Bu hatanın önüne geçmenin birkaç yolu vardır. İlk yöntem programımızın ilk satırına from __future__ import division satırını eklemektir. Bundan sonra programdaki tüm bölmeler tamsayı bölmesi yerine ondalıklı bölme işlemi olacaktır.


from __future__ import division
v0 = 2
g = 9.81
t = 0.1
y = v0*t - (1/2)*g*t**2
print y

Şimdi tekrar kontrol edersek işlemin hatasız yapıldığını görürüz.


Terminal > python hesap9.py
0.15095

Tam sayı bölmesini engellemenin bir diğer yolu da programı çalıştırırken komut istemcisinde -Qnew parametresini girmektir.


Terminal > python -Qnew hesap8.py
0.15095

Tam sayı bölmesini engellemenin önerilen yöntemi ise şudur, programımızda float bölmesi yapacaksak kullanacağımız sayıları birer float nesnesine çevirmeliyiz. Python'da bir float ve bir int nesnesinin toplamı, farkı, çarpımı ve bölümü her zaman bir float sonuç üretir, dolayısıyla böleceğimiz sayılardan sadece bir tanesini float yaparsak sorunu çözeriz. Bir int nesnesini float nesnesine çevirmenin en basit yolu sayıyı virgülden sonraki kısmı 0 olacak şekilde ondalıklı yazmaktır. Yani programımızda 1 yerine 1.0 yazarsak problem çözülür.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - (1.0/2)*g*t**2
print y

Bu programı çalıştırırsak yine doğru hesaplama yapıldığını görürüz. Float dönüşümünün bir diğer yolu da float() fonksiyonunu kullanmaktır, bu fonksiyon aldığı argümanı mümkünse bir float nesnesine çevirir. Dolayısıyla aşağıdaki program da hatasız işlem yapacaktır.


v0 = 2
g = 9.81
t = 0.1
y = v0*t - (1/float(2))*g*t**2
print y
Önceki Ders Notu:
1.1. Başlarken
Dersin Ana Sayfası:
Python ve Bilimsel Hesaplama
Sonraki Ders Notu:
1.3. Matematiksel Fonksiyonlar