Takip et

Python 3’te Değişkenler Nasıl Kullanılır?

Python 3’te Değişkenler Nasıl Kullanılır? Giriş: Programlamanın Temel Taşı – Değişkenler Programlama dünyasında, veri işleme ve depol

Python 3’te Değişkenler Nasıl Kullanılır?

Giriş: Programlamanın Temel Taşı – Değişkenler

Programlama dünyasında, veri işleme ve depolama merkezi bir rol oynar. Bir yazılımın çalışabilmesi için sayıları, metinleri, listeleri veya daha karmaşık yapıları geçici olarak hafızada tutması ve bu verilere erişebilmesi gerekir. İşte tam bu noktada “değişkenler” devreye girer. Değişkenler, bilgisayar belleğinde belirli bir değeri saklamak için kullanılan adlandırılmış depolama alanlarıdır. Bir nevi, üzerine etiket yapıştırılmış kutular gibidirler; kutunun içindeki içerik (değer) değişebilir, ancak kutunun adı (değişkenin adı) genellikle aynı kalır.

Python, modern, yüksek seviyeli ve yorumlamalı bir programlama dili olarak, değişken kullanımını son derece esnek ve sezgisel hale getirmiştir. Diğer bazı programlama dillerinin aksine, Python’da değişken tanımlarken veri tipini önceden belirtmenize gerek yoktur. Python’ın dinamik tipli yapısı sayesinde, bir değişkene atadığınız değerin tipi otomatik olarak algılanır. Bu özellik, kodu daha hızlı yazmanıza ve daha okunabilir hale getirmenize olanak tanır.

Bu makalede, Python 3’te değişkenlerin ne olduğunu, nasıl tanımlandığını, farklı veri tipleriyle nasıl kullanıldığını, değişkenlerin bellek yönetimiyle ilişkisini, kapsamlarını ve iyi kullanım pratiklerini detaylı bir şekilde inceleyeceğiz. Amacımız, Python’da değişkenleri etkili ve doğru bir şekilde kullanmanız için kapsamlı bir rehber sunmaktır.

Değişken Tanımlama ve Atama

Python’da bir değişken tanımlamak ve ona bir değer atamak oldukça basittir. Temel sözdizimi aşağıdaki gibidir:

değişken_adı = değer

Burada değişken_adı, değişkene verdiğiniz isimdir ve değer ise değişkende saklamak istediğiniz bilgidir. Eşittir (=) sembolü, “atama operatörü” olarak bilinir ve sağdaki değeri soldaki değişkene atar.

Örnekler:

# Bir tam sayı değeri atama
yas = 30

Bir metin (string) değeri atama

isim = "Ayşe"

Bir ondalıklı sayı (float) değeri atama

boy = 1.75

Bir boolean (mantıksal) değer atama

aktif_kullanici = True

Bir liste değeri atama

urunler = ["Elma", "Armut", "Muz"]

Değişkenleri ekrana yazdırma

print(yas) print(isim) print(boy) print(aktif_kullanici) print(urunler)

Değişken Adlandırma Kuralları ve Önerileri

Değişkenlere isim verirken belirli kurallara uymak ve genel kabul görmüş önerileri takip etmek önemlidir. Bu, kodunuzun başkaları (ve gelecekteki siz) tarafından daha kolay anlaşılmasını sağlar.

* Geçerli Karakterler: Değişken adları harfler (a-z, A-Z), rakamlar (0-9) ve alt çizgi (_) içerebilir.
* Başlangıç Karakteri: Değişken adları bir harf veya alt çizgi ile başlamalıdır. Bir rakamla başlayamaz.
* 1sayi = 10 (Hatalı)
* sayi1 = 10 (Doğru)
* _sayi = 10 (Doğru, ancak genellikle özel durumlar için kullanılır)
* Büyük/Küçük Harf Duyarlılığı: Python büyük/küçük harf duyarlıdır. Yani sayi, Sayi ve SAYI üç farklı değişkeni temsil eder.
* Ayrılmış Kelimeler (Keywords): Python’ın kendi içinde özel anlamları olan ve dilin yapısını oluşturan kelimeler (örneğin if, else, while, for, def, class, import, True, False, None vb.) değişken adı olarak kullanılamaz.
* PEP 8 Kuralları (Öneriler): Python kodlama stil rehberi olan PEP 8, değişken adları için aşağıdaki önerileri sunar:
* Küçük harf ve alt çizgi ile ayrılmış kelimeler kullanın (snake_case). Bu, okunabilirliği artırır.
* kullanici_adi = "Ali" (Önerilen)
* kullaniciAdi = "Ali" (CamelCase, bazı dillerde kullanılır, Python’da fonksiyonlar ve değişkenler için önerilmez)
* Sabitler (değeri program boyunca değişmeyecek değişkenler) için tüm harfleri büyük ve alt çizgi ile ayrılmış kelimeler kullanın.
* MAX_DENEME_SAYISI = 3
* Anlamlı isimler seçin. Değişkenin ne işe yaradığını açıkça belirten isimler kullanın. x veya temp gibi genel isimlerden kaçının, ancak döngü sayaçları gibi kısa ömürlü değişkenler için kabul edilebilir olabilirler.

Çoklu Atama

Python, tek bir satırda birden fazla değişkene değer atama yeteneği sunar. Bu, kodunuzu daha kısa ve öz hale getirebilir.

* Aynı Değeri Birden Fazla Değişkene Atama:

x = y = z = 100
    print(x, y, z) # Çıktı: 100 100 100

* Farklı Değerleri Birden Fazla Değişkene Atama:

ad, soyad, yas = "Ahmet", "Yılmaz", 25
    print(ad)    # Çıktı: Ahmet
    print(soyad)  # Çıktı: Yılmaz
    print(yas)   # Çıktı: 25

Bu yöntem, özellikle fonksiyonlardan birden fazla değer döndüğünde veya koleksiyonları açarken (unpacking) çok kullanışlıdır.

Değişkenlerin Yeniden Atanması (Reassignment)

Bir değişkene bir kez değer atadıktan sonra, programın ilerleyen aşamalarında bu değeri değiştirebilirsiniz. Python’ın dinamik tipli yapısı sayesinde, yeni atanan değerin farklı bir veri tipinde olması bile mümkündür.

mesaj = "Merhaba Dünya"
print(mesaj) # Çıktı: Merhaba Dünya

mesaj = "Python öğreniyorum" # Değeri değiştirildi
print(mesaj) # Çıktı: Python öğreniyorum

mesaj = 123 # Tipi de değiştirildi (string'den integer'a)
print(mesaj) # Çıktı: 123

Değişken Türleri (Veri Tipleri)

Python’da bir değişkene atadığınız her değerin bir tipi vardır. Python, bu tipleri otomatik olarak algılar ve yönetir. type() fonksiyonunu kullanarak bir değişkenin veya değerin tipini öğrenebilirsiniz.

sayi = 10
metin = "Python"
liste = [1, 2, 3]

print(type(sayi))  # Çıktı: 
print(type(metin)) # Çıktı: 
print(type(liste)) # Çıktı: 

Python’da en sık kullanılan yerleşik veri tiplerini inceleyelim:

Sayısal Tipler (Numeric Types)

Sayısal verileri temsil etmek için kullanılırlar.

* int (Tam Sayı): Pozitif veya negatif tam sayıları temsil eder. Python’daki int tipi, belleğinizin izin verdiği ölçüde sınırsız büyüklükte olabilir.

tam_sayi = 12345
    buyuk_sayi = 12345678901234567890
    print(type(tam_sayi))
    print(type(buyuk_sayi))

* float (Ondalıklı Sayı): Ondalıklı sayıları veya bilimsel gösterimdeki sayıları temsil eder.

ondalikli_sayi = 3.14
    bilimsel_sayi = 1.2e-5 # 0.000012 anlamına gelir
    print(type(ondalikli_sayi))
    print(type(bilimsel_sayi))

* complex (Karmaşık Sayı): Gerçek ve sanal kısımları olan karmaşık sayıları temsil eder. j veya J ile sanal kısım belirtilir.

karma_sayi = 3 + 4j
    print(type(karma_sayi))

Metin Tipi (String Type)

* str (Karakter Dizisi): Metinleri temsil eder. Tek tırnak ('...'), çift tırnak ("...") veya üçlü tırnak ('''...''' veya """...""") içine alınarak tanımlanır. Üçlü tırnaklar çok satırlı metinler için veya belge dizeleri (docstrings) için kullanılır.

tek_tirnak = 'Bu bir metindir.'
    cift_tirnak = "Bu da bir metindir."
    cok_satirli = """Bu
    çok
    satırlı bir metindir."""
    print(tek_tirnak)
    print(cok_satirli)

    # String birleştirme
    ad = "Ali"
    soyad = "Can"
    tam_ad = ad + " " + soyad
    print(tam_ad)

    # String tekrarı
    tekrar = "Merhaba " * 3
    print(tekrar) # Çıktı: Merhaba Merhaba Merhaba

Stringler değişmez (immutable) veri tipleridir; yani bir string oluşturulduktan sonra içeriği değiştirilemez. Değiştirmeye çalıştığınızda aslında yeni bir string oluşturulur.

Liste Tipi (List Type)

* list: Sıralı ve değiştirilebilir (mutable) eleman koleksiyonudur. Köşeli parantezler [] arasına virgülle ayrılarak tanımlanır. Farklı veri tiplerindeki elemanları içerebilir.

sayilar = [1, 2, 3, 4, 5]
    karisik_liste = ["Elma", 10, True, 3.14]
    print(sayilar[0]) # İlk elemana erişim (indeks 0'dan başlar)
    print(karisik_liste[2]) # Çıktı: True

    # Eleman ekleme
    sayilar.append(6)
    print(sayilar) # Çıktı: [1, 2, 3, 4, 5, 6]

    # Eleman değiştirme
    sayilar[0] = 100
    print(sayilar) # Çıktı: [100, 2, 3, 4, 5, 6]

Tuple Tipi (Tuple Type)

* tuple: Sıralı ve değiştirilemez (immutable) eleman koleksiyonudur. Parantezler () arasına virgülle ayrılarak tanımlanır. Listelere benzer ancak oluşturulduktan sonra elemanları değiştirilemez, eklenemez veya silinemez.

koordinatlar = (10, 20)
    renkler = ("kırmızı", "yeşil", "mavi")
    print(koordinatlar[0]) # Çıktı: 10

    # koordinatlar[0] = 30 # Hata verir: TypeError: 'tuple' object does not support item assignment

Tuple’lar, genellikle bir fonksiyonun birden fazla değer döndürmesi veya sabit veri koleksiyonları için kullanılır.

Küme Tipi (Set Type)

* set: Sırasız ve değiştirilebilir (mutable) benzersiz eleman koleksiyonudur. Süslü parantezler {} arasına virgülle ayrılarak tanımlanır. Tekrar eden elemanları otomatik olarak kaldırır.

benzersiz_sayilar = {1, 2, 3, 2, 1, 4}
    print(benzersiz_sayilar) # Çıktı: {1, 2, 3, 4} (Sıra garanti edilmez)

    # Eleman ekleme
    benzersiz_sayilar.add(5)
    print(benzersiz_sayilar)

    # Küme operasyonları
    set1 = {1, 2, 3}
    set2 = {3, 4, 5}
    print(set1.union(set2)) # Birleşim: {1, 2, 3, 4, 5}
    print(set1.intersection(set2)) # Kesişim: {3}

Sözlük Tipi (Dictionary Type)

* dict: Anahtar-değer çiftlerinden oluşan sırasız ve değiştirilebilir (mutable) bir koleksiyondur. Süslü parantezler {} arasına anahtar:değer şeklinde tanımlanır. Anahtarlar benzersiz olmalı ve genellikle string veya sayı gibi değiştirilemez tiplerden olmalıdır.

kullanici = {
        "ad": "Deniz",
        "soyad": "Kara",
        "yas": 28,
        "aktif": True
    }
    print(kullanici["ad"]) # Anahtar ile değere erişim: Çıktı: Deniz

    # Yeni anahtar-değer çifti ekleme
    kullanici["email"] = "deniz.kara@example.com"
    print(kullanici)

    # Değer güncelleme
    kullanici["yas"] = 29
    print(kullanici)

Boolean Tipi (Boolean Type)

* bool: Sadece iki değeri olabilen mantıksal bir veri tipidir: True veya False. Genellikle koşullu ifadelerde ve mantıksal operasyonlarda kullanılır.

dogru = True
    yanlis = False
    print(type(dogru)) # Çıktı: 

    if dogru:
        print("Bu ifade doğru.")

None Tipi (None Type)

* None: Bir değerin yokluğunu veya boş olduğunu temsil eden özel bir veri tipidir. Diğer dillerdeki null veya nil kavramına benzer.

bos_deger = None
    print(bos_deger)
    print(type(bos_deger)) # Çıktı: 

    if bos_deger is None:
        print("Değişkenin değeri yok.")

Değişken Kapsamı (Scope)

Değişken kapsamı, bir değişkenin programın hangi bölgelerinden erişilebilir olduğunu belirler. Python’da temel olarak üç ana kapsam düzeyi vardır: yerel (local), global ve iç içe fonksiyonların yerel kapsamı (enclosing). Python, değişken kapsamını LEGB kuralı (Local, Enclosing function locals, Global, Built-in) ile yönetir.

Yerel Kapsam (Local Scope)

Bir fonksiyon veya metod içinde tanımlanan değişkenler yerel kapsamdadır. Bu değişkenlere yalnızca tanımlandıkları fonksiyonun içinden erişilebilir. Fonksiyon sona erdiğinde, yerel değişkenler genellikle bellekten silinir.

def fonksiyon_ornegi():
    yerel_degisken = "Ben yerel bir değişkenim"
    print(yerel_degisken)

fonksiyon_ornegi()

print(yerel_degisken) # Hata verir: NameError: name 'yerel_degisken' is not defined

Global Kapsam (Global Scope)

Bir modülün (dosyanın) en üst seviyesinde, yani herhangi bir fonksiyonun veya sınıfın dışında tanımlanan değişkenler global kapsamdadır. Bu değişkenlere programın herhangi bir yerinden erişilebilir.

global_degisken = "Ben global bir değişkenim"

def baska_fonksiyon():
    print(global_degisken) # Global değişkene erişim

baska_fonksiyon()
print(global_degisken)

global Anahtar Kelimesi

Bir fonksiyon içinde global bir değişkenin değerini değiştirmek isterseniz, o değişkeni global anahtar kelimesiyle belirtmeniz gerekir. Aksi takdirde, Python fonksiyon içinde aynı isimde yeni bir yerel değişken oluşturur.

sayac = 0 # Global değişken

def artir():
    global sayac # Global sayac değişkenini kullanacağımızı belirtiyoruz
    sayac += 1
    print(f"Fonksiyon içi sayac: {sayac}")

print(f"Başlangıç sayac: {sayac}")
artir() # Fonksiyon içi sayac: 1
artir() # Fonksiyon içi sayac: 2
print(f"Fonksiyon dışı sayac: {sayac}") # Fonksiyon dışı sayac: 2

Eğer global sayac kullanmasaydık:

sayac = 0 # Global değişken

def artir_hatali():
    sayac = 0 # Yeni bir yerel 'sayac' değişkeni oluşturulur
    sayac += 1
    print(f"Fonksiyon içi sayac: {sayac}") # Her zaman 1 olur

print(f"Başlangıç sayac: {sayac}") # Başlangıç sayac: 0
artir_hatali() # Fonksiyon içi sayac: 1
artir_hatali() # Fonksiyon içi sayac: 1
print(f"Fonksiyon dışı sayac: {sayac}") # Fonksiyon dışı sayac: 0 (Global sayac değişmedi)

nonlocal Anahtar Kelimesi

İç içe (nested) fonksiyonlarda, dıştaki bir fonksiyonun yerel değişkenine içteki fonksiyondan erişmek ve onu değiştirmek için nonlocal anahtar kelimesi kullanılır. Bu, global kapsamdaki bir değişkeni değil, hemen dıştaki fonksiyonun yerel kapsamındaki bir değişkeni hedefler.

def dis_fonksiyon():
    mesaj = "Merhaba" # Dış fonksiyonun yerel değişkeni

    def ic_fonksiyon():
        nonlocal mesaj # Dış fonksiyonun 'mesaj' değişkenini kullanacağımızı belirtiyoruz
        mesaj = "Dünya"
        print(f"İç fonksiyon: {mesaj}")

    ic_fonksiyon()
    print(f"Dış fonksiyon: {mesaj}") # Çıktı: Dış fonksiyon: Dünya

dis_fonksiyon()

Değişkenlerin Bellekte Saklanması

Python’da değişkenler doğrudan değerleri tutmazlar; bunun yerine, bellek adreslerini (referanslarını) tutarlar. Bir değişken bir değere atandığında, Python bellekte o değer için bir nesne oluşturur ve değişken o nesneye referans eder.

id() fonksiyonu, bir nesnenin bellekteki benzersiz kimliğini (adresini) döndürür.

a = 10
b = 10
c = 20

print(id(a))
print(id(b))
print(id(c))

Yukarıdaki örnekte, a ve b aynı değere sahip olduğu için genellikle Python aynı bellek nesnesine referans etmelerini sağlar (küçük tam sayılar ve bazı stringler için optimizasyon). c farklı bir değere sahip olduğu için farklı bir bellek adresine sahip olacaktır.

Değişmez (Immutable) ve Değişebilir (Mutable) Tipler

Python’da veri tipleri iki ana kategoriye ayrılır:

* Değişmez (Immutable) Tipler: Bir kez oluşturulduktan sonra içeriği değiştirilemeyen nesnelerdir. Eğer bir immutable değişkene yeni bir değer atarsanız, aslında bellekte yeni bir nesne oluşturulur ve değişken bu yeni nesneye referans etmeye başlar.
* Örnekler: int, float, str, tuple, bool, NoneType.

x = 10
    print(id(x)) # Bellek adresi 1

    x = x + 1 # x'in değeri 11 oldu
    print(id(x)) # Bellek adresi 2 (Yeni bir int nesnesi oluşturuldu)

    s = "hello"
    print(id(s)) # Bellek adresi 3

    s = s + " world" # s'in değeri "hello world" oldu
    print(id(s)) # Bellek adresi 4 (Yeni bir str nesnesi oluşturuldu)

* Değişebilir (Mutable) Tipler: Bir kez oluşturulduktan sonra içeriği değiştirilebilen nesnelerdir. Bir mutable değişkenin içeriğini değiştirdiğinizde, değişkenin referans ettiği bellek adresi genellikle aynı kalır, sadece o adresteki nesnenin içeriği değişir.
* Örnekler: list, dict, set.

liste = [1, 2, 3]
    print(id(liste)) # Bellek adresi 1

    liste.append(4) # Listeye yeni eleman eklendi
    print(id(liste)) # Bellek adresi hala 1 (Nesnenin içeriği değişti)
    print(liste) # Çıktı: [1, 2, 3, 4]

    liste2 = liste # liste2, liste ile aynı nesneye referans eder
    liste2.append(5)
    print(liste) # Çıktı: [1, 2, 3, 4, 5] (liste de değişti!)

Mutable tiplerle çalışırken bu referanslama davranışı önemlidir. Özellikle fonksiyonlara mutable nesneler geçirdiğinizde veya bir listeyi başka bir listeye atadığınızda dikkatli olunmalıdır, çünkü beklenmedik yan etkilere yol açabilir. Eğer mutable bir nesnenin kopyasını oluşturmak istiyorsanız, list.copy(), dict.copy() veya dilimleme ([:]) gibi yöntemleri kullanmalısınız.

Operatörler ve Değişkenler

Değişkenler üzerinde çeşitli işlemler yapmak için operatörler kullanılır.

Aritmetik Operatörler: +, -, , / (bölme, float sonuç), // (tam sayı bölme), % (mod alma), (üssü).

a = 10
    b = 3
    print(a + b) # 13
    print(a / b) # 3.333...
    print(a // b) # 3
    print(a % b) # 1
    print(a  b) # 1000

Atama Operatörleri: = (atama), +=, -=, =, /=, %=, =, //= (kısa yazım).

x = 5
    x += 3 # x = x + 3 yani x = 8
    print(x)

* Karşılaştırma Operatörleri: == (eşit mi), != (eşit değil mi), > (büyük mü), < (küçük mü), >= (büyük veya eşit mi), <= (küçük veya eşit mi). Sonuçları True veya False olan boolean değerlerdir.

print(5 == 5) # True
    print(5 != 10) # True
    print(10 > 5) # True

* Mantıksal Operatörler: and, or, not. Boolean değerler üzerinde mantıksal işlemler yapar.

print(True and False) # False
    print(True or False)  # True
    print(not True)       # False

* Kimlik Operatörleri: is, is not. İki değişkenin aynı bellek nesnesine mi referans ettiğini kontrol eder (değerlerinin aynı olup olmadığını değil).

liste1 = [1, 2, 3]
    liste2 = [1, 2, 3]
    liste3 = liste1

    print(liste1 == liste2) # True (değerleri aynı)
    print(liste1 is liste2) # False (farklı bellek nesneleri)
    print(liste1 is liste3) # True (aynı bellek nesnesi)

* Üyelik Operatörleri: in, not in. Bir değerin bir koleksiyon (liste, tuple, string, set, dictionary anahtarları) içinde olup olmadığını kontrol eder.

meyveler = ["elma", "armut", "kiraz"]
    print("elma" in meyveler)    # True
    print("muz" not in meyveler) # True

İyi Değişken Kullanımı Pratikleri

Temiz ve sürdürülebilir kod yazmak için iyi değişken kullanım pratiklerini benimsemek çok önemlidir.

* Anlamlı İsimler Kullanın: Değişkenin amacını ve tuttuğu veriyi açıkça belirten isimler seçin. x, y, temp gibi genel isimlerden kaçının, ancak basit döngü sayaçları (i, j) gibi kısa ömürlü değişkenler için kabul edilebilir olabilirler.
* Kötü: a = 100
* İyi: maksimum_hiz = 100
* PEP 8 Kurallarına Uyun: Python topluluğunun kabul ettiği adlandırma standartlarını (snake_case) takip edin. Bu, kodunuzun tutarlı ve okunabilir olmasını sağlar.
* Sabitleri Büyük Harfle Yazın: Değeri program boyunca değişmeyecek olan sabitler için tüm harfleri büyük ve kelimeler arasına alt çizgi koyarak adlandırın. Bu, kodunuzu okuyanlara o değerin bir sabit olduğunu görsel olarak belirtir.
* PI = 3.14159
* VERGI_ORANI = 0.18
* Gereksiz Değişkenlerden Kaçının: Her zaman bir değişkene ihtiyaç duyup duymadığınızı düşünün. Bazen bir ifadeyi doğrudan kullanmak, ara bir değişkene atamaktan daha temiz olabilir.
* Kapsamı Dar Tutun: Mümkün olduğunca değişkenleri en dar kapsamda tanımlayın (yani yerel değişkenleri tercih edin). Global değişkenler, kodun beklenmedik yerlerde değişmesine neden olabileceği için hata ayıklamayı zorlaştırabilir.
* Değişkeni Tanımlamadan Kullanmayın: Python, tanımlanmamış bir değişkene erişmeye çalıştığınızda NameError hatası verir. Her zaman bir değişkene değer atamadan önce onu kullanmadığınızdan emin olun.

Sonuç

Python 3'te değişkenler, herhangi bir programın temel yapı taşlarıdır. Verileri depolamamızı, işlememizi ve program akışını kontrol etmemizi sağlarlar. Python'ın dinamik tipli yapısı, değişken tanımlamayı son derece esnek hale getirirken, mutable ve immutable tipler arasındaki farkı anlamak, bellek yönetimi ve program davranışını doğru bir şekilde kavramak için kritik öneme sahiptir.

Bu makalede ele aldığımız gibi, değişken adlandırma kurallarına uymak, kapsamlarını doğru anlamak ve iyi pratikleri uygulamak, sadece çalışan değil, aynı zamanda okunabilir, sürdürülebilir ve hata ayıklaması kolay kodlar yazmanıza yardımcı olacaktır. Python'da ustalaşmanın yolu, değişkenleri ve onların nasıl çalıştığını derinlemesine anlamaktan geçer. Bu bilgilerle, daha karmaşık veri yapılarını ve algoritmaları güvenle uygulayabilir, Python yolculuğunuzda sağlam bir temel oluşturabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.