Giriş

Bu doküman, Python programlama diline ve temel veri analizi kavramlarına sağlam bir başlangıç yapmak isteyenler için hazırlanmıştır. Konular, bol örnek ve detaylı açıklamalarla zenginleştirilerek yeni başlayanların dahi kolayca takip edebileceği bir akışla sunulmuştur.

1. Python’a Giriş ve Çalışma Ortamları

Python, okunabilirliği yüksek ve yazımı basit sözdizimi sayesinde öğrenmesi en kolay dillerden biridir. Onu veri bilimi, yapay zeka, web geliştirme ve otomasyon gibi alanlarda bu kadar popüler yapan şey, adeta bir “İsviçre çakısı” gibi çok yönlü olması ve devasa bir topluluk tarafından desteklenen binlerce kütüphaneye sahip olmasıdır.

Python kodlarımızı yazmak ve çalıştırmak için çeşitli Entegre Geliştirme Ortamları (IDE) kullanırız:

  • Jupyter (Notebook / Lab): Hücre hücre kod çalıştırma mantığı sayesinde özellikle veri analizi ve görselleştirme için idealdir. Deney yapmak ve çıktıları anında görmek için harikadır.

  • Google Colab: Kurulum gerektirmeyen, tarayıcı üzerinden çalışan ve Google’ın ücretsiz sunduğu güçlü bilgisayarları (GPU dahil) kullanmanızı sağlayan bir Jupyter Notebook versiyonudur. Başlangıç için en pratik seçenektir.

  • Visual Studio Code / PyCharm: Daha büyük ve profesyonel projeler geliştirmek için tasarlanmış, kod tamamlama, hata ayıklama gibi gelişmiş özellikler sunan güçlü IDE’lerdir.

  • Anaconda: Python ve veri bilimi için en popüler yüzlerce kütüphaneyi (Pandas, NumPy, Matplotlib vb.) ve ortam yönetim aracı olan Conda’yı bir arada sunan bir dağıtımdır. Projelerinizin kütüphane versiyonlarının birbirine karışmasını engellemek için sanal ortamlar (environment) oluşturmanıza olanak tanır. Veri bilimi için endüstri standardı sayılır.

2. Temel Sözdizimi (Syntax) ve Ekrana Yazdırma

Kodlarımızın okunabilirliğini artırmak için yorum satırları kullanırız. Python bu satırları görmezden gelir.

# Tek satırlık yorumlar için kare (#) işareti kullanılır.

"""
Birden fazla satıra yayılan
uzun açıklamalar için üç tırnak
kullanılabilir.
"""
## '\nBirden fazla satıra yayılan\nuzun açıklamalar için üç tırnak\nkullanılabilir.\n'
# print() fonksiyonu ile ekrana çıktı göndeririz.
print("Merhaba Python!")
## Merhaba Python!

Değişkenleri Metin İçinde Gösterme (String Formatting)

Değişkenlerin değerlerini bir metin içinde dinamik olarak göstermenin en modern ve tavsiye edilen yolu f-string yöntemidir.

isim = "Ayşe"
yas = 28
boy = 1.68

# f-string kullanımı (En modern ve okunaklı yöntem)
print(f"{isim}, {yas} yaşında ve {boy} metre boyundadır.")
## Ayşe, 28 yaşında ve 1.68 metre boyundadır.
# f-string içinde basit işlemler de yapabilirsiniz.
print(f"{isim}, 5 yıl sonra {yas + 5} yaşında olacak.")
## Ayşe, 5 yıl sonra 33 yaşında olacak.
# % formatlama (Eski Python versiyonlarından kalma bir yöntem, eski kodlarda görebilirsiniz)
print("%s, %d yaşında ve %.2f metre boyundadır." % (isim, yas, boy))
## Ayşe, 28 yaşında ve 1.68 metre boyundadır.

3. Değişkenler (Variables) ve Veri Tipleri

Değişkenleri, verileri geçici olarak sakladığımız etiketli kutular gibi düşünebiliriz. = atama operatörü, sağdaki değeri soldaki değişkenin içine koyar.

Temel Veri Tipleri

Python’da her değişkenin bir tipi vardır.

# Integer (Tam Sayı)
sayi1 = 150

# Float (Ondalıklı Sayı)
ortalama_not = 85.75

# String (Karakter Dizisi / Metin)
mesaj = "Python öğrenmek çok keyifli!"

# Boolean (Mantıksal Değer)
giris_yapildi_mi = True # Sadece True veya False olabilir.

# Bir değişkenin tipini öğrenmek için type() fonksiyonunu kullanırız.
print(f"'mesaj' değişkeninin tipi: {type(mesaj)}")
## 'mesaj' değişkeninin tipi: <class 'str'>
print(f"'ortalama_not' değişkeninin tipi: {type(ortalama_not)}")
## 'ortalama_not' değişkeninin tipi: <class 'float'>

Tip Dönüşümü (Type Casting)

Bazen bir veri tipini diğerine dönüştürmemiz gerekir. Örneğin, kullanıcıdan alınan bir metni (string) matematiksel bir işlemde kullanmak için sayıya (integer/float) çevirmeliyiz.

yas_metni = "30" # Bu bir metindir, sayı değil.

# print(yas_metni + 5) # Bu satır hata verir: TypeError: can only concatenate str (not "int") to str

# Metni tam sayıya dönüştürelim.
yas_sayisi = int(yas_metni)
print(f"5 yıl sonraki yaş: {yas_sayisi + 5}")
## 5 yıl sonraki yaş: 35
# Bir sayıyı metne dönüştürme
rakam = 100
rakam_metni = str(rakam)
print(f"Metin olarak rakam: {rakam_metni}")
## Metin olarak rakam: 100

4. Veri Yapıları: Veri Koleksiyonları

Tek bir değişkende birden fazla veriyi saklamamızı sağlayan yapılardır.

4.1. Listeler (Lists)

En temel ve en çok kullanılan veri yapısıdır. Sıralıdır, elemanları değiştirilebilir ve her tipten veriyi bir arada tutabilir. [] ile oluşturulur.

# Farklı veri tiplerini içeren bir liste
karisik_liste = ["Elma", 35, True, 3.14]

# Liste üzerinde temel işlemler
sayilar = [10, 20, 30, 40, 50]
print(f"Listenin ilk hali: {sayilar}")
## Listenin ilk hali: [10, 20, 30, 40, 50]
# Bir elemana erişme (İndeksler 0'dan başlar!)
print(f"Listenin ilk elemanı (indeks 0): {sayilar[0]}")
## Listenin ilk elemanı (indeks 0): 10
print(f"Listenin son elemanı (indeks -1): {sayilar[-1]}")
## Listenin son elemanı (indeks -1): 50
# Bir elemanı değiştirme (5. elemanı, yani indeksi 4 olanı 99 yapalım)
# DÜZELTME: Değişkenin tamamı yerine sadece ilgili indeksteki eleman güncellendi.
sayilar[4] = 99
print(f"Değiştirilmiş liste: {sayilar}")
## Değiştirilmiş liste: [10, 20, 30, 40, 99]
# Listeye eleman ekleme (Bu satırlar artık hata vermeyecektir)
sayilar.append(200) # .append() sona ekler
print(f"Sona eleman eklenmiş liste: {sayilar}")
## Sona eleman eklenmiş liste: [10, 20, 30, 40, 99, 200]
sayilar.insert(1, 55) # .insert(indeks, eleman) araya ekler
print(f"Araya eleman eklenmiş liste: {sayilar}")
## Araya eleman eklenmiş liste: [10, 55, 20, 30, 40, 99, 200]
# Listeden eleman silme
sayilar.pop() # .pop() sondaki elemanı siler
## 200
print(f"Sondan eleman silinmiş liste: {sayilar}")
## Sondan eleman silinmiş liste: [10, 55, 20, 30, 40, 99]
sayilar.remove(40) # .remove() değere göre ilk bulduğunu siler
print(f"40 değeri silinmiş liste: {sayilar}")
## 40 değeri silinmiş liste: [10, 55, 20, 30, 99]

Listelerde Dilimleme (Slicing)

Listenin belirli bir aralığını kopyalamak için kullanılır. [başlangıç:bitiş:adım]

harfler = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(f"2. indeksten 5'e kadar: {harfler[2:5]}") # 5. indeks dahil değil!
## 2. indeksten 5'e kadar: ['c', 'd', 'e']
print(f"Baştan 3. indekse kadar: {harfler[:3]}")
## Baştan 3. indekse kadar: ['a', 'b', 'c']
print(f"4. indeksten sona kadar: {harfler[4:]}")
## 4. indeksten sona kadar: ['e', 'f', 'g']
print(f"Tüm listeyi 2'şer atlayarak: {harfler[::2]}")
## Tüm listeyi 2'şer atlayarak: ['a', 'c', 'e', 'g']
print(f"Listeyi tersten yazdırma: {harfler[::-1]}")
## Listeyi tersten yazdırma: ['g', 'f', 'e', 'd', 'c', 'b', 'a']

4.2. Sözlükler (Dictionaries)

Listeler gibi değil, anahtar-değer (key-value) çiftleri şeklinde veri saklarlar. Bir adres defteri gibidir; kişiye (anahtar) bakarak telefon numarasına (değer) ulaşırsınız. Sırasızdırlar ve {} ile oluşturulurlar.

ogrenci = {
    "isim": "Ahmet",
    "numara": 123,
    "bolum": "Mühendislik",
    "notlar": [85, 90, 78]
}

print(f"Öğrencinin bölümü: {ogrenci['bolum']}")
## Öğrencinin bölümü: Mühendislik
# Bir değeri güncelleme
ogrenci["bolum"] = "Bilgisayar Mühendisliği"
print(f"Güncel bölüm: {ogrenci['bolum']}")
## Güncel bölüm: Bilgisayar Mühendisliği
# Yeni bir anahtar-değer çifti ekleme
ogrenci["sehir"] = "Ankara"
print(f"Tüm bilgiler: {ogrenci}")
## Tüm bilgiler: {'isim': 'Ahmet', 'numara': 123, 'bolum': 'Bilgisayar Mühendisliği', 'notlar': [85, 90, 78], 'sehir': 'Ankara'}
# Anahtarları, değerleri veya tüm elemanları görme
print(f"Anahtarlar: {ogrenci.keys()}")
## Anahtarlar: dict_keys(['isim', 'numara', 'bolum', 'notlar', 'sehir'])
print(f"Değerler: {ogrenci.values()}")
## Değerler: dict_values(['Ahmet', 123, 'Bilgisayar Mühendisliği', [85, 90, 78], 'Ankara'])
print(f"Tüm çiftler: {ogrenci.items()}")
## Tüm çiftler: dict_items([('isim', 'Ahmet'), ('numara', 123), ('bolum', 'Bilgisayar Mühendisliği'), ('notlar', [85, 90, 78]), ('sehir', 'Ankara')])

4.3. Demetler (Tuples) ve Kümeler (Sets)

  • Demetler (Tuple): Listelere çok benzerler ama en önemli farkları değiştirilemez (immutable) olmalarıdır. () ile oluşturulurlar. Program içinde yanlışlıkla değiştirilmemesi gereken veriler (örn: koordinatlar, ayarları) için kullanılırlar.

  • Kümeler (Set): Sadece benzersiz (unique) elemanları barındıran, sırasız koleksiyonlardır. Bir listedeki tekrar eden elemanları temizlemek için çok pratik bir yöntemdir.

# Tuple Örneği
koordinatlar = (10, 20)
# koordinatlar = 15 # Bu satır TypeError verir çünkü demetler değiştirilemez.

# Set Örneği
rakamlar = [1, 2, 2, 3, 4, 4, 4, 5, 6, 5]
benzersiz_rakamlar = set(rakamlar)
print(f"Tekrar edenleri temizlenmiş küme: {benzersiz_rakamlar}")
## Tekrar edenleri temizlenmiş küme: {1, 2, 3, 4, 5, 6}

5. Operatörler

Programlamanın temel yapı taşlarıdır.

  • Aritmetik: +, -, *, /, ** (Üs alma), % (Mod - bölmeden kalan), // (Taban bölme - sonucu aşağı yuvarlar)

  • Atama: +=, -=, *= (örn: x += 1 demek x = x + 1 demektir)

  • Karşılaştırma: == (Eşit mi?), != (Eşit değil mi?), >, <, >=, <=

  • Mantıksal: and (ve), or (veya), not (değil)

  • Üyelik (Membership): in, not in (Bir elemanın bir koleksiyonda olup olmadığını kontrol eder)

# Üyelik Operatörü Örneği
harfler = ['a', 'b', 'c']
print(f"'a' harfi listede var mı? {'a' in harfler}")
## 'a' harfi listede var mı? True
print(f"'x' harfi listede var mı? {'x' in harfler}")
## 'x' harfi listede var mı? False

6. Koşullu İfadeler ve Döngüler

Programlarımızın belirli koşullara göre farklı yollar izlemesini veya belirli işlemleri tekrar etmesini sağlarlar.

6.1. Koşullu İfadeler (if, elif, else)

“Eğer bu şart doğruysa, şunu yap; değilse, diğer şartı kontrol et; hiçbiri değilse, bunu yap” mantığıyla çalışır.

hava_durumu = "güneşli"
sicaklik = 25

if hava_durumu == "yağmurlu":
    print("Şemsiyeni almayı unutma!")
elif sicaklik > 28:
    print("Çok sıcak bir gün, bol su için.")
elif hava_durumu == "güneşli" and sicaklik > 20:
    print("Harika bir gün, dışarı çık!")
else:
    print("Hava durumu normal.")
## Harika bir gün, dışarı çık!

6.2. Döngüler (for ve while)

for Döngüsü

Bir koleksiyondaki (liste, sözlük, metin vb.) her bir eleman için belirli bir kod bloğunu tekrar eder.

# Liste üzerinde gezinme
meyveler = ["elma", "çilek", "kiraz"]
for meyve in meyveler:
    print(f"Sevdiğim bir meyve: {meyve.capitalize()}")
## Sevdiğim bir meyve: Elma
## Sevdiğim bir meyve: Çilek
## Sevdiğim bir meyve: Kiraz
# Sayı aralığında gezinme (range fonksiyonu)
# range(5) -> 0, 1, 2, 3, 4 sayılarını üretir.
for sayi in range(5):
    print(f"{sayi}'nin karesi: {sayi ** 2}")
## 0'nin karesi: 0
## 1'nin karesi: 1
## 2'nin karesi: 4
## 3'nin karesi: 9
## 4'nin karesi: 16

while Döngüsü

Belirli bir koşul True olduğu sürece dönmeye devam eder. Koşulun bir noktada False olacağından emin olmalısınız, yoksa sonsuz döngü oluşur.

sayac = 5
while sayac > 0:
    print(f"Geri sayım: {sayac}")
    sayac -= 1 # sayac = sayac - 1
## Geri sayım: 5
## Geri sayım: 4
## Geri sayım: 3
## Geri sayım: 2
## Geri sayım: 1
print("Başlat!")
## Başlat!

break ve continue

Döngülerin akışını kontrol etmemizi sağlar. * break: Döngüyü tamamen sonlandırır. * continue: Döngünün o anki adımını atlar ve bir sonraki adıma geçer.

for num in range(1, 10):
    if num == 3:
        continue # num 3 ise bu adımı atla, ekrana yazdırma
    if num == 7:
        break # num 7 ise döngüyü tamamen kır
    print(num)
## 1
## 2
## 4
## 5
## 6

7. Fonksiyonlar (Functions)

Belirli bir işi yapmak için tasarladığımız, tekrar tekrar kullanabileceğimiz kod bloklarıdır. def anahtar kelimesi ile tanımlanırlar.

Temel Fonksiyon Tanımlama

# Parametre almayan, sadece işlem yapan bir fonksiyon
def selamla():
    print("Merhaba, hoş geldiniz!")

# Fonksiyonu çağırma
selamla()
## Merhaba, hoş geldiniz!
# Parametre alan ve bir değer döndüren (return) fonksiyon
def alan_hesapla(kenar1, kenar2):
    """
    Verilen iki kenara göre dikdörtgenin alanını hesaplar ve döndürür.
    Bu üç tırnak arasındaki metin 'docstring' olarak adlandırılır ve fonksiyonun ne işe yaradığını anlatır.
    """
    alan = kenar1 * kenar2
    return alan

# Fonksiyonu çağırıp dönen değeri bir değişkene atama
dikdortgen_alani = alan_hesapla(10, 5)
print(f"Dikdörtgenin alanı: {dikdortgen_alani}")
## Dikdörtgenin alanı: 50

Varsayılan Parametre Değerleri

Fonksiyonu çağırırken bir parametre için değer girilmezse, varsayılan olarak belirlediğimiz bir değeri kullanmasını sağlayabiliriz.

def kullanici_olustur(kullanici_adi, aktif=True, sehir="Bilinmiyor"):
    print(f"Kullanıcı Adı: {kullanici_adi}, Durum: {aktif}, Şehir: {sehir}")

kullanici_olustur("ahmet123")
## Kullanıcı Adı: ahmet123, Durum: True, Şehir: Bilinmiyor
kullanici_olustur("zeynep456", aktif=False, sehir="İstanbul")
## Kullanıcı Adı: zeynep456, Durum: False, Şehir: İstanbul

8. Kütüphaneler (Libraries) ve Modüller

Python’ın gücü, başkaları tarafından yazılmış ve bizim projelerimize dahil edebileceğimiz hazır kod paketlerinden (kütüphaneler/modüller) gelir. import anahtar kelimesi ile bir kütüphaneyi projemize dahil ederiz.

# 'math' kütüphanesini 'mt' kısaltmasıyla projemize dahil edelim.
import math as mt

pi_sayisi = mt.pi
print(f"Pi sayısı: {pi_sayisi}")
## Pi sayısı: 3.141592653589793
print(f"5'in karekökü: {mt.sqrt(25)}")
## 5'in karekökü: 5.0
# 'random' kütüphanesi ile rastgele işlemler yapalım
import random

rastgele_sayi = random.randint(1, 100) # 1 ile 100 arasında rastgele bir tam sayı seç
print(f"Rastgele seçilen sayı: {rastgele_sayi}")
## Rastgele seçilen sayı: 81

Veri Biliminin Temel Kütüphanelerine Bakış

Python ile veri analizine devam ederken karşınıza sürekli çıkacak üç temel kütüphane vardır:

  • NumPy: Sayısal ve matematiksel işlemler, özellikle çok boyutlu diziler (matrisler) üzerinde çalışmak için temel kütüphanedir. Çok hızlıdır.

  • Pandas: Veriyi tablolar (Excel gibi) halinde okuma, işleme, temizleme ve analiz etme konusunda endüstri standardıdır. DataFrame adı verilen veri yapısı ile çalışır.

  • Matplotlib / Seaborn: Veriyi görselleştirmek, yani grafikler (çizgi, bar, pasta grafikleri vb.) çizmek için kullanılan kütüphanelerdir.

Bu kütüphaneler sisteminizde yüklü değilse, terminal veya Jupyter hücresine pip install numpy pandas matplotlib yazarak kurmanız gerekir.