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) # 13. “Pointer yok” demek “referans yok” demek değildir
a = [1]
b = a
print(a is b) # TruePython 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.