Ek Çalışma — C’den Python’a Hızlı Geçiş Kartı

C’den Python’a hızlı geçiş kartı

Bu tablo C ile programlama görmüş geçiş grubu için hatırlatma kartıdır. Satırlar birebir dil eşdeğerliği iddia etmez; üçüncü sütun özellikle iki dilin davranışının nerede ayrıldığını gösterir.

C’de tanıdığınız fikir Python’da yaygın karşılık Dikkat
int x = 5; x = 5 Python’da isim için ayrı tür bildirimi yapılmaz; 5 değerinin türü inttir. Aynı ad sonra başka türden değere bağlanabilir.
printf("%d", x); print(x) / print(f"{x}") f-string biçimlendirme yapar; print varsayılan olarak satır sonu ekler.
scanf("%d", &x); x = int(input(...)) input() her zaman str döndürür; dönüşüm başarısızsa ValueError oluşabilir.
{ ... } blokları girinti Python’da blok sınırı süslü parantez değil girintidir; tutarsız girinti sözdizimi/çalışma hatası doğurur.
if (x > 0) if x > 0: Parantez zorunlu değildir; satır sonunda : vardır.
else if elif Koşullar yukarıdan aşağı değerlendirilir; ilk doğru dal çalışır.
&&, \|\|, ! and, or, not Operatörler kelime biçimindedir; doğruluk değerlendirmesinde yalnız True/False değil truthy/falsy değerler de vardır.
for (i=0; i<n; i++) for i in range(n): Python’da çoğu koleksiyonda indeks yerine doğrudan değer üzerinde for tercih edilir. range bitişi dahil etmez.
while (kosul) while kosul: Döngünün koşulunu sonunda False yapacak güncelleme yine sizin sorumluluğunuzdadır.
break, continue break, continue Anlam benzerdir; continue özellikle while güncellemesini atlayıp sonsuz döngü oluşturabilir.
sabit boyutlu int a[3] çoğu başlangıç probleminde list Python list dinamik, heterojen öğe taşıyabilen ve nesne referansları saklayan bir koleksiyondur; C dizisiyle birebir aynı yapı değildir.
struct Ogrenci sözlük veya kullanıcı tanımlı class Sözlük yalnız veri tutabilir; sınıf veri + davranış + invariant için daha zengin bir modeldir. struct == class değildir.
yapı/değer ataması b = a Python’da b = a nesneyi kopyalamaz; yeni adı aynı nesneye bağlar. Mutable nesnelerde aliasing kritik farktır.
memcpy / elle kopya a.copy(), list(a), dilim vb. Bunların çoğu sığ kopyadır; iç içe mutable nesneler paylaşılabilir.
char[] / char * metinleri str Python str Unicode ve immutable’dır; karakteri metin[0] = ... ile yerinde değiştiremezsiniz.
NULL None None “değer yok”u temsil eden tekil nesnedir; kontrol çoğunlukla x is None ile yapılır.
pointer kimliği ad/nesne referansı + is Python adları nesnelere bağlanır; pointer aritmetiği yoktur. is kimliği, == eşitliği sorar.
tamsayı bölme / ve // / gerçek bölme yapar ve float sonuç verir. // floor division’dır; negatiflerde C’deki sıfıra doğru kesmeden farklı olabilir: -7 // 2 == -4.
% kalan % Negatif sayılarda sonuç // ile tutarlı olacak biçimde hesaplanır; C’den farklı işaret sonucu görebilirsiniz: -7 % 2 == 1.
x++ / x-- x += 1 / x -= 1 Python’da ++ ve -- artırma/azaltma operatörü yoktur.
fonksiyon prototipi + tanım def ...: Python’da C tarzı header prototipi yoktur; fonksiyon nesnesi çalışma sırasında tanımlanır ve çağrıdan önce yürütülmüş olmalıdır.
.h + .c dosyaları modül/paket (.py) import, C #include’unun metinsel kopyası değildir; modül yükleme ve ad bağlama davranışıdır.
dönüş türü zorunluluğu return + isteğe bağlı type hint Type hint çoğunlukla çalışma zamanı zorlaması yapmaz; araçlara ve okuyucuya niyet bildirir.
hata kodu / errno / dönüş değeri dönüş değeri veya istisna Python’da beklenmeyen/başarısız durumlar sıkça raise ile istisna üretir, try/except ile anlamlı sınırda ele alınır.
FILE *, fopen, fclose with open(...) as dosya: with bloğu dosyanın kapanmasını güvenli biçimde yönetir. Metin dosyalarında encoding="utf-8" açık yazmak iyi pratiktir.

Üç kritik geçiş tuzağı

1. Atama = kopyalama değildir

a = [1, 2]
b = a
b.append(3)
print(a)  # [1, 2, 3]

2. /, // ve negatif sayılar farklı düşünülmelidir

print(7 / 2)    # 3.5
print(7 // 2)   # 3
print(-7 // 2)  # -4
print(-7 % 2)   # 1

3. “Pointer yok” demek “referans yok” demek değildir

a = [1]
b = a
print(a is b)   # True

Python pointer aritmetiğini ve C pointer sözdizimini sunmaz; fakat programın çalışma modelinde adların nesnelere bağlanması ve aynı nesnenin birden çok ad üzerinden görülmesi temel bir konudur.

ImportantBu kart ne için değildir?

C kodunu satır satır mekanik biçimde Python’a çevirmek için değildir. Python’da daha doğal koleksiyon dolaşımı, istisna yönetimi, modül sistemi ve nesne modeli bulunduğu için iyi Python kodu bazen C çözümünün yapısını değiştirmelidir.

Back to top