TEKNİK YAZI / NOTLAR

Tuple: Değişmez Veri Koleksiyonlarının Gücü

Tuple nedir, ne zaman kullanılır? Python'da immutable veri yapılarının önemi ve tuple'ların gücü.

Python tuple, sıralı fakat öğe atamasıyla değiştirilemeyen bir koleksiyondur. Sabit yapılı kayıtlar, çoklu dönüş değerleri ve hashlenebilir bileşenlerden oluşan sözlük anahtarları için kullanışlıdır; değişmezlik gerekmeyen dinamik koleksiyonlarda list daha açık bir seçim olabilir.

Tuple Nedir? List’ten Farkı Ne?

Tuple, Python’da ordered (sıralı) ve immutable (değiştirilemez) bir veri yapısı. List’e çok benziyor ama kritik bir farkı var: Bir kere oluşturduktan sonra değiştiremiyorsunuz!

“E ne gerek var değiştirilemez bir şeye?” diye sorabilirsiniz. İşte tam da bu değiştirilemezlik tuple’ı güçlü yapıyor. Düşünün ki, kodunuzun bir yerinde önemli bir veri var ve bunun yanlışlıkla değiştirilmesini istemiyorsunuz. İşte tuple tam bu durumlar için!

Neden Tuple Kullanmalıyız?

Daha küçük bir temsil sunabilir: CPython’da tuple, büyüyebilir liste yapısına göre daha az ek kapasite taşır. Gerçek bellek ve iterasyon farkı Python sürümüne ve veri boyutuna bağlıdır; karar yalnızca mikro benchmark’a dayanmamalıdır.

Kapsayıcı değişmezdir: Tuple’ın hangi nesnelere işaret ettiği değiştirilemez; ancak içinde liste gibi değişebilir nesneler varsa bu nesnelerin içeriği yine değişebilir. Bu nedenle tuple kullanmak tek başına thread safety garantisi vermez.

Dictionary key olarak kullanılabilir: List’leri dictionary key olarak kullanamazsınız ama tuple’ları kullanabilirsiniz. Çünkü hashable!

Veri bütünlüğü: Bazı veriler vardır ki, bunların değişmemesi gerekir. Koordinatlar, veritabanı kayıtları, configuration değerleri… Tuple bunları korur.

Tuple Oluşturma Yöntemleri

# Basic tuple creation
coordinates = (10, 20)
rgb_color = (255, 128, 0)
empty_tuple = ()
single_element = (42,)  # Note the comma!

# Without parentheses (tuple packing)
point = 10, 20, 30
name, age, city = "Alice", 25, "Istanbul"  # Multiple assignment

# From list or other iterables
from_list = tuple([1, 2, 3, 4])
from_string = tuple("hello")  # ('h', 'e', 'l', 'l', 'o')
from_range = tuple(range(5))  # (0, 1, 2, 3, 4)

# Nested tuples
matrix = ((1, 2), (3, 4), (5, 6))
complex_data = ("user", (2024, 11, 16), {"active": True})

Tuple Unpacking - Python’un En Güzel Özelliklerinden Biri

Tuple unpacking, sıralı değerleri açık değişkenlere ayırmayı sağlar:

# Basic unpacking
point = (3, 7)
x, y = point  # x=3, y=7

# Function return values
def get_user_info():
    return "John", 30, "Engineer"  # Returns tuple

name, age, job = get_user_info()

# Swap values elegantly
a, b = 10, 20
a, b = b, a  # Now a=20, b=10

# Extended unpacking with *
numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers  # first=1, middle=[2,3,4], last=5

# Ignore values with _
data = ("important", "skip", "also_skip", "needed")
important, _, _, needed = data

Named Tuples - Tuple’ların Steroid’li Hali

Collections modülündeki namedtuple, tuple’lara isimlendirilmiş field’lar eklemenizi sağlıyor:

from collections import namedtuple

# Define a Point type
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, 22)
print(p.x, p.y)  # Access by name
print(p[0], p[1])  # Still works with index

# Real world example: User data
User = namedtuple('User', ['id', 'username', 'email', 'created_at'])
user = User(1, "alice", "alice@example.com", "2024-01-01")

# Database record representation
Record = namedtuple('Record', 'id name age salary')
employee = Record(101, "Bob", 35, 75000)

Tuple’ların Pratik Kullanım Alanları

Fonksiyonlardan birden fazla değer döndürme:

def calculate_statistics(numbers):
    return min(numbers), max(numbers), sum(numbers)/len(numbers)

minimum, maximum, average = calculate_statistics([1, 2, 3, 4, 5])

Dictionary’lerde composite key:

# Grid coordinates as keys
grid = {}
grid[(0, 0)] = "origin"
grid[(1, 0)] = "east"
grid[(0, 1)] = "north"

# Date-based caching
cache = {}
cache[("2024", "11", "16")] = "today's data"

Enumerate ile index ve değer almak:

fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

Zip ile birden fazla liste üzerinde iterasyon:

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["Istanbul", "Ankara", "Izmir"]

for name, age, city in zip(names, ages, cities):
    print(f"{name} is {age} years old and lives in {city}")

Tuple vs List: Ne Zaman Hangisini Kullanmalı?

Tuple kullanın eğer:

List kullanın eğer:

Sonuç

Tuple, verinin sırasını ve alan sayısını sabit bir sözleşme olarak ifade etmek istediğinizde iyi bir seçimdir. Koleksiyonun büyümesi veya öğe değiştirmesi bekleniyorsa list; alan adları ve daha zengin davranış gerekiyorsa NamedTuple ya da dataclass daha okunabilir olabilir. Değişmezlik ve performans iddialarını içteki nesnelerden ve gerçek çalışma yükünden bağımsız değerlendirmeyin.