Ana içeriğe atla

Python Veri Sınıfları: Kapsamlı Bir Öğretici

Python veri sınıfları ve bunların pratikte nasıl kullanılacağı üzerine yeni başlayanlar için uygun bir öğretici
Güncel 22 Nis 2026  · 9 dk. oku

Veri sınıfları, Python’da keşfettikten sonra eski yönteme asla geri dönmek istemeyeceğiniz özelliklerden biridir. Şu sıradan sınıfı düşünün:

class Exercise:
   def __init__(self, name, reps, sets, weight):
       self.name = name
       self.reps = reps
       self.sets = sets
       self.weight = weight

Bana göre bu sınıf tanımı oldukça verimsiz — __init__ metodunda her bir parametreyi en az üç kez tekrar ediyorsunuz. Bu çok da büyük bir sorun gibi gelmeyebilir, ancak hayatınız boyunca çok daha fazla parametreye sahip sınıflar yazdığınız sıklığı düşünün.

Karşılaştırma için, yukarıdaki kodun veri sınıfları ile alternatifine bir bakın:

from dataclasses import dataclass


@dataclass
class Exercise:
   name: str
   reps: int
   sets: int
   weight: float  # Weight in lbs

Bu mütevazı görünen kod parçası, sıradan bir sınıfa göre katbekat daha iyidir. Küçücük @dataclass dekoratörü perde arkasında __init__, __repr__, __eq__ gibi metotları uygular; bunları elle yazmak en az 20 satır kod alırdı.

Ayrıca, karşılaştırma operatörleri, nesne sıralama ve değişmezlik (immutability) gibi birçok özellik de tek satırlık ayarlarla sınıfımız için sihirli bir şekilde oluşturulabilir.

Dolayısıyla bu öğreticinin amacı, nesne yönelimli programlamayı seviyorsanız veri sınıflarının Python’a gelmiş en güzel şeylerden biri olduğunu göstermek.

Hadi başlayalım!

Python Veri Sınıflarının Temelleri

Veri sınıflarını bu kadar kullanışlı kılan temel kavramlardan bazılarını ele alalım.

Veri sınıflarında bazı metotlar otomatik olarak üretilir

Tüm özelliklerine rağmen, veri sınıfları aynı işlevselliği çok daha az kodla sağlayan sıradan sınıflardır. İşte Exercise sınıfı tekrar:

from dataclasses import dataclass


@dataclass
class Exercise:
   name: str
   reps: int
   sets: int
   weight: float


ex1 = Exercise("Bench press", 10, 3, 52.5)

# Verifying Exercise is a regular class
ex1.name
'Bench press'

Şu anda Exercise sınıfında __repr__ ve __eq__ metotları zaten uygulanmış durumda. Doğrulayalım:

repr(ex1)
"Exercise(name='Bench press', reps=10, sets=3, weight=52.5)"

Bir nesnenin gösterimi olan repr, kendisini yeniden yaratabilecek kodu döndürmelidir ve ex1 için tam olarak böyle olduğunu görebiliyoruz.

Karşılaştırma için, eski yöntemle tanımlanan Exercise şöyle görünürdü:

class Exercise:
   def __init__(self, name, reps, sets, weight):
       self.name = name
       self.reps = reps
       self.sets = sets
       self.weight = weight


ex3 = Exercise("Bench press", 10, 3, 52.5)

ex3
<__main__.Exercise at 0x7f6834100130>

Oldukça kötü ve işe yaramaz görünüyor!

Şimdi eşitlik operatörü olan __eq__’nun varlığını doğrulayalım:

# Redefine the class
@dataclass
class Exercise:
   name: str
   reps: int
   sets: int
   weight: float


ex1 = Exercise("Bench press", 10, 3, 52.5)
ex2 = Exercise("Bench press", 10, 3, 52.5)

Sınıfı kendisiyle ve aynı parametrelere sahip başka bir sınıf örneğiyle karşılaştırmak True döndürmelidir:

ex1 == ex2
True
ex1 == ex1
True

Ve öyle de oluyor! Sıradan sınıflarda bu mantığı yazmak zahmetli olurdu.

Veri sınıfları tür ipuçları (type hint) gerektirir

Fark etmiş olabileceğiniz gibi, alanları tanımlarken veri sınıfları tür ipuçları gerektirir. Aslında veri sınıfları, typing modülündeki herhangi bir türü kabul eder. Örneğin, Any veri türünü kabul eden bir alan şöyle oluşturulur:

from typing import Any


@dataclass
class Dummy:
   attr: Any

Ancak Python’un tuhaflıklarından biri, veri sınıfları tür ipuçları gerektirse bile türlerin fiilen zorunlu olmamasıdır.

Örneğin, tamamen yanlış veri türleriyle bir Exercise örneği oluşturmak hatasız çalışabilir:

silly_exercise = Exercise("Bench press", "ten", "three sets", 52.5)

silly_exercise.sets

“Three sets”

Türleri zorunlu kılmak isterseniz, Mypy gibi tip denetleyicileri kullanmalısınız.

Veri sınıfları alanlarda varsayılan değerleri destekler

Şimdiye kadar sınıflarımıza hiçbir varsayılan değer eklemedik. Bunu düzeltelim:

@dataclass
class Exercise:
   name: str = "Push-ups"
   reps: int = 10
   sets: int = 3
   weight: float = 0


# Now, all fields have defaults
ex5 = Exercise()
ex5
Exercise(name='Push-ups', reps=10, sets=3, weight=0)

Varsayılanı olmayan alanların, varsayılanı olan alanlardan sonra gelemeyeceğini unutmayın. Örneğin, aşağıdaki kod hata verir:

@dataclass
class Exercise:
   name: str = "Push-ups"
   reps: int = 10
   sets: int = 3
   weight: float  # NOT ALLOWED


ex5 = Exercise()
ex5
TypeError: non-default argument 'weight' follows default argument

Pratikte, varsayılanları name: type = value sözdizimiyle tanımlamanız nadir olacaktır.

Bunun yerine, her alan tanımı üzerinde daha fazla denetim sağlayan field fonksiyonunu kullanırsınız:

from dataclasses import field


@dataclass
class Exercise:
   name: str = field(default="Push-up")
   reps: int = field(default=10)
   sets: int = field(default=3)
   weight: float = field(default=0)


# Now, all fields have defaults
ex5 = Exercise()
ex5
Exercise(name='Push-up', reps=10, sets=3, weight=0)

field fonksiyonunun şu gibi daha fazla parametresi vardır:

  • repr
  • init
  • compare
  • default_factory

vb. Bunları ilerleyen bölümlerde ele alacağız.

Veri sınıfları bir fonksiyonla da oluşturulabilir

Veri sınıflarının temelleriyle ilgili son bir not: Tanımları make_dataclass fonksiyonu kullanılarak daha da kısaltılabilir:

from dataclasses import make_dataclass

Exercise = make_dataclass(
   "Exercise",
   [
       ("name", str),
       ("reps", int),
       ("sets", int),
       ("weight", float),
   ],
)

ex3 = Exercise("Deadlifts", 8, 3, 69.0)
ex3
Exercise(name='Deadlifts', reps=8, sets=3, weight=69.0)

Ancak okunabilirlikten ödün verirsiniz; bu yüzden bu fonksiyonu kullanmanızı önermem.

İleri Düzey Python Veri Sınıfları

Bu bölümde, daha fazla fayda sağlayan gelişmiş veri sınıfı özelliklerini tartışacağız. Bu özelliklerden biri varsayılan üreticilerdir (default factory).

Varsayılan üreticiler

Varsayılan üreticileri açıklamak için, iki alan kabul eden WorkoutSession adlı başka bir sınıf oluşturalım:

from dataclasses import dataclass
from typing import List


@dataclass
class Exercise:
   name: str = "Push-ups"
   reps: int = 10
   sets: int = 3
   weight: float = 0


@dataclass
class WorkoutSession:
   exercises: List[Exercise]
   duration_minutes: int

List türünü kullanarak, WorkoutSession’ın Exercise örneklerinden oluşan bir liste kabul ettiğini belirtmiş oluyoruz.

# Define the Exercise instances for HIIT training
ex1 = Exercise(name="Burpees", reps=15, sets=3)
ex2 = Exercise(name="Mountain Climbers", reps=20, sets=3)
ex3 = Exercise(name="Jump Squats", reps=12, sets=3)
exercises_monday = [ex1, ex2, ex3]

hiit_monday = WorkoutSession(exercises=exercises_monday, duration_minutes=30)

Şu anda her antrenman oturumu örneğinin başlatılırken egzersizlere sahip olması gerekiyor. Ama bu, insanların spor yapma biçimini yansıtmıyor — önce bir oturum başlatırlar (muhtemelen bir uygulamada), sonra egzersizleri eklerler.

Dolayısıyla, egzersiz ve süre olmadan oturum oluşturabilmeliyiz. exercises için varsayılan değer olarak boş bir liste ekleyerek bunu yapalım:

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = []
   duration_minutes: int = None


hiit_monday = WorkoutSession("25-02-2024")
ValueError: mutable default <class 'list'> for field exercises is not allowed: use default_factory

Ancak bir hata aldık — meğer veri sınıfları değiştirilebilir (mutable) varsayılan değerlere izin vermiyormuş.

Neyse ki bunu bir varsayılan üretici kullanarak düzeltebiliriz:

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=list)  # PAY ATTENTION
   duration_minutes: int = 0


hiit_monday = WorkoutSession()
hiit_monday
WorkoutSession(exercises=[], duration_minutes=0)

default_factory parametresi, bir veri sınıfı alanı için başlangıç değeri döndüren bir fonksiyon kabul eder. Bu, keyfi herhangi bir fonksiyonu kabul edebileceği anlamına gelir:

  • tuple
  • dict
  • set
  • Kullanıcı tanımlı herhangi bir özel fonksiyon

Fonksiyonun sonucunun değiştirilebilir olup olmamasından bağımsız olarak bu geçerlidir.

Şimdi düşünürsek, çoğu insan antrenmanına genellikle her tür antrenman için benzer olan ısınma hareketleriyle başlar. Dolayısıyla, egzersiz olmadan oturum başlatmak bazıları için istenen bir şey olmayabilir.

Bunun yerine, üç ısınma Exercise’ı döndüren bir fonksiyon oluşturalım:

def create_warmup():
   return [
       Exercise("Jumping jacks", 30, 1),
       Exercise("Squat lunges", 10, 2),
       Exercise("High jumps", 20, 1),
   ]

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5  # Increase the default duration as well


hiit_monday = WorkoutSession()
hiit_monday

WorkoutSession(exercises=[Exercise(name='Jumping jacks', reps=30, sets=1, weight=0), Exercise(name='Squat lunges', reps=10, sets=2, weight=0), Exercise(name='High jumps', reps=20, sets=1, weight=0)], duration_minutes=5)

Artık her oturum oluşturduğumuzda, bazı ısınma egzersizleri önceden kaydedilmiş olarak gelir. WorkoutSession’ın yeni sürümünde buna karşılık varsayılan süre beş dakikadır.

Veri sınıflarına metot ekleme

Veri sınıfları sıradan sınıflar olduğundan, onlara metot ekleme şekli değişmez. WorkoutSession veri sınıfımıza iki metot ekleyelim:

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5

   def add_exercise(self, exercise: Exercise):
       self.exercises.append(exercise)

   def increase_duration(self, minutes: int):
       self.duration_minutes += minutes

Bu metotları kullanarak artık bir oturuma yeni bir etkinliği kaydedebiliriz:

hiit_monday = WorkoutSession()

# Log a new exercise
new_exercise = Exercise("Deadlifts", 6, 4, 60)

hiit_monday.add_exercise(new_exercise)
hiit_monday.increase_duration(15)

Ama bir sorun var:

hiit_monday

WorkoutSession(exercises=[Exercise(name='Jumping jacks', reps=30, sets=1, weight=0), Exercise(name='Squat lunges', reps=10, sets=2, weight=0), Exercise(name='High jumps', reps=20, sets=1, weight=0), Exercise(name='Deadlifts', reps=6, sets=4, weight=60)], duration_minutes=20)

Oturumu yazdırdığımızda, varsayılan gösterimi yeniden oluşturma kodunu içerdiği için çok fazla ayrıntılı ve okunması güç. Bunu düzeltelim.

__repr__ ve __str__ veri sınıflarında

Veri sınıfları __repr__’ı otomatik uygular ama __str__’ı uygulamaz. Bu nedenle print çağırdığımızda sınıf __repr__’a geri döner.

Öyleyse bu davranışı kendi __str__ metodumuzu tanımlayarak geçersiz kılalım:

@dataclass
class Exercise:
   name: str = "Push-ups"
   reps: int = 10
   sets: int = 3
   weight: float = 0

   def __str__(self):
       base = f"{self.name}: {self.reps}/{self.sets}"
       if self.weight == 0:
           return base
       return base + f", {self.weight} lbs"


ex1 = Exercise(name="Burpees", reps=15, sets=3)
ex1
Exercise(name='Burpees', reps=15, sets=3, weight=0)

__repr__ aynı kalsa da, print çağırdığımızda:

print(ex1)
Burpees: 15/3

Sınıfın yazdırma çıktısı çok daha hoş. Şimdi WorkoutSession’ı da düzeltelim:

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5  # Increase the default duration as well

   def add_exercise(self, exercise: Exercise):
       self.exercises.append(exercise)

   def increase_duration(self, minutes: int):
       self.duration_minutes += minutes

   def __str__(self):
       base = ""

       for ex in self.exercises:
           base += str(ex) + "\n"
       base += f"\nSession duration: {self.duration_minutes} minutes."

       return base


hiit_monday = WorkoutSession()
print(hiit_monday)

Jumping jacks: 30/1
Squat lunges: 10/2
High jumps: 20/1

Session duration: 5 minutes.

Not: Kodun satır satır açıklamasını almak için parçacığın altındaki “Kod Açıkla” düğmesini kullanın.

Artık okunabilir ve derli toplu bir çıktı elde ettik.

Veri sınıflarında karşılaştırma

Birçok sınıf için, nesnelerini belirli bir mantığa göre karşılaştırmak anlamlıdır. Antrenmanlar için bu, antrenman süresi, egzersiz yoğunluğu veya ağırlık olabilir.

Önce, mevcut durumda iki antrenmanı karşılaştırmayı denersek ne olduğuna bakalım:

hiit_wednesday = WorkoutSession()

hiit_wednesday.add_exercise(Exercise("Pull-ups", 7, 3))
print(hiit_wednesday)

Jumping jacks: 30/1
Squat lunges: 10/2
High jumps: 20/1
Pull-ups: 7/3

Session duration: 5 minutes.

hiit_monday > hiit_wednesday
TypeError: '>' not supported between instances of 'WorkoutSession' and 'WorkoutSession'

TypeError alıyoruz çünkü veri sınıfları karşılaştırma operatörlerini uygulamaz. Ancak order parametresini True yaparak bunu kolayca düzeltebiliriz:

@dataclass(order=True)
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5

   ...

hiit_monday = WorkoutSession()
# hiit_monday.add_exercise(...)
hiit_monday.increase_duration(10)

hiit_wednesday = WorkoutSession()

hiit_monday > hiit_wednesday

True

Bu kez karşılaştırma çalışıyor, ama neyi karşılaştırıyoruz?

Veri sınıflarında karşılaştırma, alanların tanımlandığı sıraya göre yapılır. Şu anda sınıflar, ilk alan olan exercises standart dışı nesneler içerdiğinden, antrenman süresine göre karşılaştırılıyor.

Bunu Çarşamba oturumunun süresini artırarak doğrulayabiliriz:

hiit_monday = WorkoutSession()
# hiit_monday.add_exercise(...)

hiit_wednesday = WorkoutSession()
hiit_wednesday.increase_duration(10)

hiit_monday > hiit_wednesday
False

Beklendiği gibi False aldık.

Peki Workout’un ilk alanı, örneğin bir string olsaydı ne olurdu? Deneyip görelim:

@dataclass(order=True)
class WorkoutSession:
   date: str = None  # DD-MM-YYYY
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5

   ...

hiit_monday = WorkoutSession("25-02-2024")
hiit_monday.increase_duration(10)

hiit_wednesday = WorkoutSession("27-02-2024")

hiit_monday > hiit_wednesday
False

Pazartesi oturumu daha uzun sürmesine rağmen, karşılaştırma onun Çarşamba’dan küçük olduğunu söylüyor. Bunun nedeni, Python’daki string karşılaştırmasında “25”in “27”den önce gelmesidir.

Peki alanların sırasını koruyup yine de oturumları antrenman süresine göre nasıl sıralarız? Bu field fonksiyonuyla kolaydır:

@dataclass(order=True)
class WorkoutSession:
   date: str = field(default=None, compare=False)
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5

   ...

hiit_monday = WorkoutSession("25-02-2024")
hiit_monday.increase_duration(10)

hiit_wednesday = WorkoutSession("27-02-2024")

hiit_monday > hiit_wednesday
True

compare’ı herhangi bir alan için False yaparak onu sıralamadan hariç tutarız; yukarıdaki sonuç bunu gösteriyor.

Başlatma sonrası alan işleme

Şu anda ısınma egzersizlerini hesaba katmak için varsayılan oturum süremiz beş dakika. Ancak bu sadece kullanıcı bir oturuma ısınmayla başlarsa mantıklı. Ya başka egzersizlerle başlarlarsa:

new_session = WorkoutSession([Exercise("Diamond push-ups", 10, 3)])

new_session.duration_minutes
5

Tek bir egzersiz için toplam sürenin beş dakika olması mantıksız. Her oturum, her egzersizin set sayısına göre süresini dinamik olarak tahmin etmelidir. Yani duration_minutes alanını exercises alanına bağımlı yapmalıyız.

Bunu uygulayalım:

@dataclass
class WorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = field(default=0, init=False)

   def __post_init__(self):
       set_duration = 3
       for ex in self.exercises:
           self.duration_minutes += ex.sets * set_duration

   ...

Bu kez, duration_minutes’ı başlatmayı geciktirmek için init’i False olarak ayarlayarak tanımlıyoruz.

Ardından özel __post_init__ metodunun içinde, her Exercise’taki toplam set sayısına göre değerini güncelliyoruz.

Artık WorkoutSession başlatıldığında, duration_minutes her egzersizdeki her set için üç dakika artırılarak dinamikleşiyor.

# Adding an exercise with three sets
hiit_friday = WorkoutSession([Exercise("Diamond push-ups", 10, 3)])

hiit_friday.duration_minutes
9

Genel olarak, veri sınıfınızda diğer alanlara bağlı bir alan tanımlamak istiyorsanız __post_init__ mantığını kullanabilirsiniz.

Veri Sınıflarında Değişmezlik (Immutability)

WorkoutSession veri sınıfımız neredeyse hazır; sadece korunmaya ihtiyacı var. Şu anda kolayca bozulabilir:

hiit_friday.duration_minutes = 1000

hiit_friday.duration_minutes
1000

del hiit_friday.exercises

Sınıflarımızın tüm alanlarını yalnızca istediğimiz şekilde değiştirilebilecek şekilde korumak istiyoruz. Bunu başarmak için @dataclass dekoratörü kullanışlı bir frozen argümanı sunar:

@dataclass(frozen=True)
class FrozenExercise:
   name: str
   reps: int
   sets: int
   weight: int | float = 0


ex1 = FrozenExercise("Muscle-ups", 5, 3)

Artık herhangi bir alanı değiştirmek istersek hata alırız:

ex1.sets = 5
FrozenInstanceError: cannot assign to field 'sets'

frozen’ı True yapmak, başlatmadan sonra silme veya güncellemelere karşı korunmaları için her alan için otomatik olarak __deleteattr__ ve __setattr__ metotları ekler. Ayrıca başkaları yeni alanlar da ekleyemez:

ex1.new_field = 10
FrozenInstanceError: cannot assign to field 'new_field'

Geleneksel sınıflarla uğraşsaydık bu işlevsellik onlarca satır kod gerektirirdi.

Ancak, sınıflarımızı gerçekten değişmez yapamayacağımızı lütfen unutmayın. Örneğin, WorkoutSession’ı frozen’ı True yaparak yeniden yazalım:

@dataclass(frozen=True)
class ImmutableWorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5


session1 = ImmutableWorkoutSession()

Beklendiği gibi, egzersiz listesini doğrudan değiştiremeyiz:

session1.exercises = [Exercise()]

Ancak exercises bir listedir ve tamamen değiştirilebilirdir; bu da aşağıdaki işlemi mümkün kılar:

# Listedeki öğelerden birini değiştirmek

# Changing one of the elements in a list
session1.exercises[1] = FrozenExercise("Totally new exercise", 5, 5)

print(session1)

ImmutableWorkoutSession(exercises=[Exercise(name='Jumping jacks', reps=30, sets=1, weight=0), FrozenExercise(name='Totally new exercise', reps=5, sets=5, weight=0), Exercise(name='High jumps', reps=20, sets=1, weight=0)], duration_minutes=5)

Bu nedenle, yanlışlıkla değişiklikleri önlemek için alan değerlerinde tuple gibi değişmez nesneleri kullanmanız önerilir.

Veri sınıflarında kalıtım

Ele alacağımız son nokta, ebeveyn ve çocuk sınıflardaki alanların sırasıdır.

Veri sınıfları sıradan sınıflar olduğundan, kalıtım her zamanki gibi çalışır:

@dataclass(frozen=True)
class ImmutableWorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5


@dataclass(frozen=True)
class CardioWorkoutSession(ImmutableWorkoutSession):
   pass

Ancak, ebeveyn sınıftaki (ImmutableWorkoutSession) son alanın varsayılan bir değeri olduğundan, çocuk sınıflardaki tüm alanların da varsayılan değeri olması gerekir.

Örneğin, bu kabul edilmez:

@dataclass(frozen=True)
class ImmutableWorkoutSession:
   exercises: List[Exercise] = field(default_factory=create_warmup)
   duration_minutes: int = 5


@dataclass(frozen=True)
class CardioWorkoutSession(ImmutableWorkoutSession):
   intensity_level: str  # Not allowed, must have a default

TypeError: non-default argument 'intensity_level' follows default argument

Veri Sınıflarının Dezavantajları ve Ek Kaynaklar

Veri sınıfları Python 3.7’den beri istikrarlı biçimde gelişiyor (başlangıçta da gayet iyiydiler) ve sınıf yazmanız gereken birçok kullanım senaryosunu kapsıyor. Ancak aşağıdaki durumlarda dezavantajlı olabilirler:

  • Özel __init__ metotları
  • Özel __new__ metotları
  • Çeşitli kalıtım desenleri

Ve daha fazlası, şu harika Reddit başlığında tartışıldığı gibi. Veri sınıflarının neden tanıtıldığına ve neden sıradan sınıf tanımlarının bire bir ikamesi olmadıklarına dair daha ayrıntılı bir gerekçe istiyorsanız PEP 557’yi okuyun.

Genel olarak nesne yönelimli programlamayla ilgileniyorsanız, yolculuğunuza devam etmek için işte bir kurs:

Temelde, veri sınıfları veriyi daha verimli tutmak ve almak için daha süslü yapılardır. Ancak Python’da bu işi az çok benzer şekilde yapan başka veri yapıları da var. Örneğin, sayaçlar (counter), defaultdict’ler ve namedtuple’lar hakkında Veri Bilimi için Veri Tipleri kursunun son bölümünde bilgi edinebilirsiniz.


Bex Tuychiev's photo
Author
Bex Tuychiev
LinkedIn

2 yılı aşkın deneyime sahip bir veri bilimi içerik üreticisiyim ve Medium'da en büyük takipçi kitlelerinden birine sahibim. Yapay zeka ve makine öğrenimi üzerine, biraz da alaycı bir üslupla, ayrıntılı yazılar yazmayı seviyorum; çünkü bu konuları biraz olsun sıkıcılıktan çıkarmak gerekiyor. 130'dan fazla makale ve bir DataCamp kursu hazırladım; bir diğeri de yolda. İçeriklerim 5 milyondan fazla kişi tarafından görüntülendi; bunların 20 bini Medium ve LinkedIn'de takipçim oldu. 

Konular

Python Öğrenmeye Devam Edin

Program

Python Veri Temelleri

28 sa
Veri becerilerinizi geliştirin, verileri nasıl manipüle edeceğinizi ve görselleştireceğinizi keşfedin ve veri odaklı kararlar almak için gelişmiş analitik uygulayın.
Ayrıntıları GörRight Arrow
Kursa Başla
Devamını GörRight Arrow