Ana Sayfa
Fizik

Python İle Bilimsel Kodlama 2. Bölüm

Bu bölümde Python listeleri ve demetleri, aritmetik ve mantıksal operatörler, koşullu ifadeler ve döngüler fizik örnekleri üzerinden ele alınmaktadır. Kinetik enerji hesabı ve örnek ölçüm verilerinin değerlendirilmesiyle bu yapıların birlikte kullanımı gösterilmekte; son olarak NumPy dizilerine kısa bir giriş yaptık

Yusuf Olçun•1 Kasım 2026•28 dk okuma süresi
Python İle Bilimsel Kodlama 2. Bölüm

Python ile Bilimsel Kodlama

2. Bölüm: Listeler, Operatörler ve Döngüler

İlk bölümde Python'a giriş yaptık; değişkenleri, temel işlemleri ve veri türlerini tanıdık. Bu bölümde ise birden fazla veriyi birlikte tutmayı, belirli koşullara göre işlem yapmayı ve aynı hesabı farklı değerler için tekrarlamayı öğreneceğiz.

Bir fizik deneyinde yalnızca tek bir ölçüm yapmayız. Farklı zamanlarda konum ölçebilir, aynı deneyin sonuçlarını karşılaştırabilir veya değişen hızlara karşılık gelen kinetik enerjileri hesaplayabiliriz. Her değer için ayrı bir değişken tanımlamak ve aynı işlemi tekrar tekrar yazmak, veri sayısı arttıkça zorlaşır.

Python'da listeler, koşullu ifadeler ve döngüler tam burada işimizi kolaylaştırır. Öyleyse kaldığımız yerden devam edelim.

1. Python'da Listeler

Bir deneyde yer çekimi ivmesi için beş ölçüm yaptığımızı düşünelim. Değerlerin birimi m/s2\mathrm{m/s^2} olsun. Her ölçüm için ayrı bir değişken tanımlamak yerine hepsini bir listede toplayabiliriz:

olcumler = [9.7, 9.8, 9.9, 9.8, 10.0]

print(olcumler)
print(len(olcumler))

Çıktımız:

[9.7, 9.8, 9.9, 9.8, 10.0]
5

Listeler köşeli parantezlerle oluşturulur ve elemanlar virgülle ayrılır. len() listenin kaç elemandan oluştuğunu verir.

Listeler elemanların sırasını korur, aynı değeri birden fazla kez içerebilir ve sonradan değiştirilebilir. Buradaki “sıralı” ifadesi, değerlerin küçükten büyüğe dizildiği anlamına gelmez; elemanların listede belirli konumlarının olduğunu anlatır.

Liste Elemanlarına Ulaşmak

Python'da elemanların konumunu belirten sayılara indeks denir. İndeksler sıfırdan başlar.

olcumler = [9.7, 9.8, 9.9, 9.8, 10.0]

print(olcumler[0])
print(olcumler[2])
print(olcumler[-1])

Çıktımız:

9.7
9.9
10.0

olcumler[0] ilk, olcumler[2] üçüncü elemanı verir. Negatif indeksler ise listenin sonundan başlayarak erişim sağlar; -1 son elemandır.

Beş elemanlı bu listenin pozitif indeksleri 0 ile 4 arasındadır. olcumler[5] yazarsak listenin dışında kalan bir elemana ulaşmaya çalıştığımız için IndexError alırız.

Listenin Bir Bölümünü Seçmek: Dilimleme

Bazen bütün ölçümler yerine yalnızca belirli bir aralıktakilerle çalışmak isteriz. Bunun için dilimleme kullanılır:

olcumler = [9.7, 9.8, 9.9, 9.8, 10.0]

print(olcumler[1:4])
print(olcumler[:3])
print(olcumler[::2])

Çıktımız:

[9.8, 9.9, 9.8]
[9.7, 9.8, 9.9]
[9.7, 9.9, 10.0]

Genel kullanım liste[baslangic:bitis:adim] şeklindedir. Başlangıç indeksi seçime dahildir, bitiş indeksi dahil değildir.

Bu yüzden [1:4], indeksleri 1, 2 ve 3 olan elemanları seçer. [:3] ilk üç elemanı, [::2] ise baştan sona iki indeks arayla elemanları alır.

Eleman Değiştirmek, Eklemek ve Çıkarmak

İlk ölçümü yanlış kaydettiğimizi ve doğru değerin 9.6 olduğunu düşünelim. Ardından yeni bir ölçüm ekleyelim:

olcumler = [9.7, 9.8, 9.9, 9.8, 10.0]

olcumler[0] = 9.6
olcumler.append(9.9)

print(olcumler)

Çıktımız:

[9.6, 9.8, 9.9, 9.8, 10.0, 9.9]

append() listenin sonuna bir eleman ekler. Son elemanı çıkarmak ve çıkardığımız değeri saklamak için pop() kullanabiliriz:

cikarilan = olcumler.pop()

print(cikarilan)
print(olcumler)

Çıktımız:

9.9
[9.6, 9.8, 9.9, 9.8, 10.0]

Bu örnek bir önceki kodun devamıdır. pop(2) yazsaydık üçüncü elemanı çıkarırdık. remove(9.8) ise indekse göre değil, değere göre çalışır ve listede karşılaştığı ilk 9.8 değerini kaldırır.

Listeyi Kopyalarken Dikkat

Ölçümler üzerinde değişiklik yapmadan önce bir kopyasını saklamak isteyebiliriz. Fakat aşağıdaki atama yeni bir liste oluşturmaz:

olcumler = [9.7, 9.8, 9.9]
yedek = olcumler

yedek[0] = 0

print(olcumler)

Çıktımız:

[0, 9.8, 9.9]

İki değişken de aynı listeyi gösterdiği için birinden yapılan değişiklik diğerinden de görülür. Bu örnekteki gibi sayılardan oluşan bir listeyi bağımsız kopyalamak için copy() kullanabiliriz:

olcumler = [9.7, 9.8, 9.9]
yedek = olcumler.copy()

yedek[0] = 0

print(olcumler)
print(yedek)

Çıktımız:

[9.7, 9.8, 9.9]
[0, 9.8, 9.9]

İç içe listelerde copy() yalnızca dış listeyi kopyalar. Şimdilik tek katmanlı sayısal listelerle çalıştığımız için bu yöntem yeterlidir.

2. Operatörler

Operatörler, değerler üzerinde işlem yapmamızı veya değerleri karşılaştırmamızı sağlayan işaret ve anahtar kelimelerdir.

Temel aritmetik operatörlerimizi bir tabloda toplayalım:

İşlemOperatörÖrnekSonuç
Toplama+7 + 29
Çıkarma-7 - 25
Çarpma*7 * 214
Bölme/7 / 23.5
Taban bölme//7 // 23
Kalan bulma%7 % 21
Üs alma**7 ** 249

// işlemi bölme sonucunu aşağıdaki tam sayıya yuvarlar. Bu nedenle negatif sayılarda yalnızca ondalık kısmı silmek gibi düşünmemeliyiz: -7 // 2 sonucu -4 olur.

% operatörü ise bir sayının çift olup olmadığını kontrol etmekte kullanılabilir. Bir tam sayının ikiye bölümünden kalan sıfırsa o sayı çifttir:

sayi = 8

print(sayi % 2 == 0)

Çıktımız:

True

Burada = ile == arasındaki farkı da hatırlayalım. = değer atar, == iki değerin eşitliğini kontrol eder.

Bir Değeri Güncellemek

Bir toplamı her adımda artırmak için şu işlemi yazabiliriz:

toplam = 10
toplam = toplam + 5

print(toplam)

Aynı işlemin kısa yazımı şöyledir:

toplam = 10
toplam += 5

print(toplam)

İki örneğin de sonucu 15 olur. Sayısal değişkenlerde benzer şekilde -=, *= ve /= kullanılabilir.

Mantıksal İşlemler ve Üyelik

Birden fazla koşulu bir arada değerlendirmek için and, or ve not kullanırız:

  • and: Her iki koşulun da doğru olmasını ister.
  • or: En az bir koşulun doğru olması yeterlidir.
  • not: Koşulun doğruluk değerini tersine çevirir.

Örneğin sıcaklığın belirlediğimiz çalışma aralığında olup olmadığını kontrol edelim:

sicaklik = 23

print(sicaklik >= 20 and sicaklik <= 25)
print(not (sicaklik > 25))

Çıktımız:

True
True

Bir değerin listede bulunup bulunmadığını ise in ile sorgulayabiliriz:

olcumler = [9.7, 9.8, 9.9]

print(9.8 in olcumler)
print(10.0 not in olcumler)

Her iki ifade de True sonucunu verir.

3. Koşullu İfadeler: if, elif ve else

Şimdi programımızın bir koşula göre farklı işlemler yapmasını sağlayalım.

Bir parçacığın tek bir eksendeki hız bileşenini değerlendirelim. Pozitif değer artı yönde, negatif değer eksi yönde hareketi göstersin:

hiz = -3.0

if hiz > 0:
    print("Parçacık pozitif yönde hareket ediyor.")
elif hiz < 0:
    print("Parçacık negatif yönde hareket ediyor.")
else:
    print("Parçacığın bu eksendeki hız bileşeni sıfır.")

Çıktımız:

Parçacık negatif yönde hareket ediyor.

Python önce if koşulunu kontrol eder. Yanlışsa elif koşuluna geçer. O da yanlışsa else bloğunu çalıştırır.

Burada girintiler kodun bir parçasıdır. Koşula bağlı çalışacak satırları, genelde dört boşlukla ve içeriye doğru yazarız. Koşul satırlarının sonundaki : işaretini de unutmamalıyız.

Bu karar sırasını Şekil 2 üzerinde izleyebiliriz.

4. for Döngüsü: Aynı İşlemi Farklı Verilere Uygulamak

Bir listenin elemanlarını sırayla işlemek için for döngüsü kullanabiliriz:

olcumler = [9.7, 9.8, 9.9]

for olcum in olcumler:
    print(olcum)

Çıktımız:

9.7
9.8
9.9

olcum değişkeni her turda listenin sıradaki değerini alır. Böylece aynı print() satırı bütün elemanlar için çalışır.

Örnek: Kinetik Enerji Hesabı

Kütlesi 2 kg olan bir cismin farklı süratlerdeki kinetik enerjilerini hesaplayalım. Klasik mekanikte kinetik enerji:

Ek=12mv2E_k = \frac{1}{2}mv^2

şeklinde verilir. Süratleri m/s cinsinden alırsak enerjileri joule cinsinden buluruz.

kutle = 2.0
hizlar = [0, 2, 4, 6]
enerjiler = []

for hiz in hizlar:
    enerji = 0.5 * kutle * hiz ** 2
    enerjiler.append(enerji)

print(enerjiler)

Çıktımız:

[0.0, 4.0, 16.0, 36.0]

Önce boş bir enerjiler listesi oluşturduk. Her turda bir sürat için enerji hesapladık ve sonucu listeye ekledik.

Buradan fiziksel bir sonuç da görebiliriz: Sürati 2 m/s'den 4 m/s'ye çıkardığımızda enerji 4 J'den 16 J'ye yükseldi. Sürat iki katına çıkarken kinetik enerji dört katına çıktı.

Şekil 3, bu karesel bağıntıyı ve hesaplanan değerleri birlikte gösterir.

range() ile Tekrar Sayısını Belirlemek

Elimizde hazır bir liste bulunmasa da belirli sayıda işlem yapmak isteyebiliriz:

for sayi in range(1, 6):
    print(sayi ** 2)

Çıktımız:

1
4
9
16
25

range(1, 6), 1 ile başlar ve 6 değerine ulaşmadan biter. Genel kullanım range(baslangic, bitis, adim) şeklindedir.

print(list(range(0, 10, 2)))

Çıktımız:

[0, 2, 4, 6, 8]

Burada değerleri iki artırarak ilerledik. list() kullanarak range içindeki değerleri liste halinde gösterdik. range() tam sayılarla çalışır; ondalıklı zaman aralıkları için ilerleyen bölümlerde başka yöntemler kullanacağız.

5. while Döngüsü: Koşul Sağlandıkça Devam Etmek

while döngüsü, verilen koşul doğru olduğu sürece çalışır. Birden beşe kadar olan tam sayıları toplayalım:

sayac = 1
toplam = 0

while sayac <= 5:
    toplam += sayac
    sayac += 1

print(toplam)

Çıktımız:

15

Her turda sayacı toplama ekledik ve ardından bir artırdık. Sayaç 6 olduğunda koşul yanlış oldu ve döngü sona erdi.

sayac += 1 satırını kaldırırsak sayaç sürekli 1 kalır. Böylece koşul hiç yanlış olmaz ve döngü kendiliğinden bitmez. while yazarken koşulun nasıl değişeceğini mutlaka düşünmeliyiz.

break ve continue

Döngüleri yönetmek için iki kullanışlı komutumuz daha var:

break, içinde bulunduğu döngüyü sonlandırır. Örneğin bir sıcaklık listesinde 80,∘C80,^{\circ}\mathrm{C}'yi aşan ilk değeri bulalım:

sicakliklar = [22, 35, 48, 83, 91]

for sicaklik in sicakliklar:
    if sicaklik > 80:
        print("Sınır aşıldı:", sicaklik)
        break

Çıktımız:

Sınır aşıldı: 83

83 bulunduğunda döngü biter; sonraki değer incelenmez.

continue ise döngüyü bitirmez, yalnızca mevcut turun kalanını atlayıp sonraki tura geçer. Bir sonraki uygulamada bunu kullanacağız.

6. Demetler: Tuples

Demetler de birden fazla değeri birlikte tutar. Listelerden temel farkları, oluşturulduktan sonra elemanlarının değiştirilememesidir.

Bir parçacığın metre cinsinden üç boyutlu konumunu demet olarak yazalım:

konum = (2.0, -1.0, 4.0)

print(konum[0])

x, y, z = konum
print(x, y, z)

Çıktımız:

2.0
2.0 -1.0 4.0

x, y, z = konum satırı demetin elemanlarını ayrı değişkenlere açar. Böylece her bileşeni kendi adıyla kullanabiliriz.

Bu demette konum[0] = 5.0 şeklinde bir atama yapamayız; Python TypeError verir. Yeni bir konumu temsil etmek istersek yeni bir demet oluşturabiliriz.

Tek elemanlı demet tanımlarken virgül önemlidir:

tek_deger = (5,)
sayi = (5)

print(type(tek_deger))
print(type(sayi))

Çıktımız:

<class 'tuple'>
<class 'int'>

Yalnızca parantez kullanmak demet oluşturmaya yetmez.

Ölçüm ekleyip çıkaracağımız bir veri koleksiyonu için liste; koordinat bileşenleri gibi birlikte taşıyacağımız bir kayıt için demet kullanabiliriz. Seçim, veriyi program içinde nasıl kullanmak istediğimize bağlıdır.

7. Birlikte Uygulayalım: Ölçümleri Değerlendirmek

Şimdi listeleri, koşulları ve döngüleri tek bir örnekte birleştirelim.

Yer çekimi ivmesinin büyüklüğünü ölçtüğümüz bir deneyde aşağıdaki değerlerin elde edildiğini varsayalım. Bu örnekte cihazın başarısız ölçümü -1.0 ile kaydettiğini ve sıfır ya da negatif kayıtları geçersiz kabul ettiğimizi özellikle belirtiyoruz. Bu, bütün fiziksel ölçümlere uygulanabilecek genel bir kural değildir.

olcumler = [9.72, 9.81, -1.0, 9.79, 9.88]
gecerli_olcumler = []

for olcum in olcumler:
    if olcum <= 0:
        continue

    gecerli_olcumler.append(olcum)

if len(gecerli_olcumler) > 0:
    ortalama = sum(gecerli_olcumler) / len(gecerli_olcumler)

    referans = 9.81
    yuzde_sapma = abs(ortalama - referans) / referans * 100

    print("Geçerli ölçüm sayısı:", len(gecerli_olcumler))
    print(f"Ortalama: {ortalama:.2f} m/s²")
    print(f"Referansa göre yüzde sapma: %{yuzde_sapma:.2f}")
else:
    print("Hesaplama için geçerli ölçüm bulunamadı.")

Çıktımız:

Geçerli ölçüm sayısı: 4
Ortalama: 9.80 m/s²
Referansa göre yüzde sapma: %0.10

Program önce geçersiz kaydı atladı, ardından kalan dört ölçümün ortalamasını hesapladı. Ortalama almadan önce listenin boş olmadığını kontrol ederek sıfıra bölme durumunu da önledik.

abs() bir sayının mutlak değerini verir. Burada ortalama ile seçtiğimiz referans arasındaki farkın büyüklüğünü bulmak için kullandık.

Yazdırma satırlarında tırnağın önündeki f, değişkenleri metnin içine yerleştirmemizi sağlar. {ortalama:.2f} ifadesi, değeri virgülden sonra iki basamakla gösterir. Bu biçimlendirme hesaplamada kullanılan değeri değiştirmez.

Bulduğumuz yüzde sapma, ortalamanın seçilen referanstan ne kadar uzak olduğunu anlatır. Tek başına deneyin ölçüm belirsizliğini göstermez; bunun için ölçümlerin dağılımı ve cihazın özellikleri gibi bilgiler de gerekir.

Şekil 4, ortalama referansa yakın olsa da tekil kayıtların farklı değerler aldığını gösterir.

8. NumPy'ye İlk Adım

Listelerle verileri sakladık ve döngülerle hesaplamalar yaptık. Ancak bilimsel çalışmalarda çok daha fazla sayıyla işlem yapmamız gerekebilir. NumPy, sayısal diziler üzerinde toplu hesaplamalar yapmamızı sağlayan bir kütüphanedir.

Önce küçük bir farkı görelim:

sayilar = [1, 2, 3]

print(sayilar * 2)

Çıktımız:

[1, 2, 3, 1, 2, 3]

Bir listeyi 2 ile çarpmak, her elemanı ikiyle çarpmaz; listeyi tekrarlar.

NumPy dizisinde ise sayısal çarpma elemanlara uygulanır. Aşağıdaki örnek için çalıştırdığımız Python ortamında NumPy'nin kurulu olması gerekir:

import numpy as np

sayilar = np.array([1, 2, 3])

print(sayilar * 2)

Çıktımız:

[2 4 6]

import numpy as np, NumPy'yi programımıza dahil eder ve ona kısa bir ad verir. np.array() ise verdiğimiz listeden bir NumPy dizisi oluşturur.

Kinetik enerji örneğimizi de şöyle yazabiliriz:

import numpy as np

kutle = 2.0
hizlar = np.array([0, 2, 4, 6])

enerjiler = 0.5 * kutle * hizlar ** 2

print(enerjiler)

Çıktımız:

[ 0.  4. 16. 36.]

Böylece aynı hesabı açıkça bir for döngüsü yazmadan dizinin bütün elemanlarına uyguladık.

Bu bölümde birden fazla veriyi saklamayı, koşullara göre işlem yapmayı ve hesaplamaları tekrarlamayı öğrendik. Artık tek bir sayının sonucunu bulmanın ötesine geçip küçük bir ölçüm grubunu değerlendirebiliyoruz.

Kendiniz denemek için kinetik enerji örneğindeki kütleyi değiştirin; ardından yalnızca 10 J'den büyük enerjileri ekrana yazdırmayı deneyin.

Bir sonraki bölümde fonksiyonlarla hesaplamalarımızı tekrar kullanılabilir hale getirecek, NumPy dizilerini daha yakından tanıyacak ve Matplotlib ile sonuçlarımızın grafiklerini çizeceğiz. Böylece yazdığımız kodlarla fiziksel davranışları görsel olarak da incelemeye başlayacağız.

Herkese esenlikler dilerim.

Kaynaklar ve İleri Okuma

  1. Yusuf Olçun, Python ile Bilimsel Kodlama 1. Bölüm, Biricik Bilim. https://biricikbilim.com/makale/python-ile-bilimsel-kodlama-bolum-1
  2. Python Software Foundation, Data Structures. https://docs.python.org/3/tutorial/datastructures.html
  3. Python Software Foundation, More Control Flow Tools. https://docs.python.org/3/tutorial/controlflow.html
  4. NumPy, The Absolute Basics for Beginners. https://numpy.org/doc/stable/user/absolute_beginners.html
Y

Yusuf Olçun

Yazar