Ek: C’den Python’a geçiş kartı
C’den Python’a geçiş kartı
Bu tablo, Programlama Temelleri’ni C ile almış öğrenciler için bir hatırlatma kartıdır. Her satır C’de bildiğiniz bir yapıyı Python’daki yaygın karşılığıyla eşleştirir. Bu karşılıklar her zaman aynı işi yapmaz. İki dilin nerede farklı davrandığını üçüncü sütunda bulursunuz.
| C’de bildiğiniz yapı | Python’daki yaygın karşılığı | Dikkat |
|---|---|---|
int x = 5; |
x = 5 |
Python’da ada tür bildirilmez. Tür değere aittir: 5’in türü inttir. Aynı ad daha sonra başka türden bir değere bağlanabilir. |
printf("%d", x); |
print(x) / print(f"{x}") |
f-string, değeri biçimlendirip metnin içine yerleştirir. print çıktının sonuna kendiliğinden yeni satır ekler. |
scanf("%d", &x); |
x = int(input(...)) |
input() her zaman str döndürür. Metin sayıya çevrilemezse ValueError oluşur. |
{ ... } blokları |
girinti | Python’da bloğun nerede başlayıp bittiğini süslü parantez değil girinti belirler. Tutarsız girinti söz dizimi hatasına ya da çalışma zamanı hatasına yol açar. |
if (x > 0) |
if x > 0: |
Koşulu paranteze almak gerekmez. Satır : ile biter. |
else if |
elif |
Koşullar yukarıdan aşağıya sınanır ve koşulu doğru çıkan ilk dal çalışır. |
&&, \|\|, ! |
and, or, not |
Bu operatörler sözcükle yazılır. Koşulda yalnız True/False değerlendirilmez: sıfır, boş metin ve boş liste gibi değerler yanlış (falsy), öteki değerlerin çoğu doğru (truthy) sayılır. |
for (i=0; i<n; i++) |
for i in range(n): |
Python’da koleksiyonlar çoğunlukla indeksle değil, for ile doğrudan öğe öğe dolaşılır. range bitiş değerini kapsamaz. |
while (kosul) |
while kosul: |
Koşulu bir noktada False yapacak güncellemeyi yine sizin yazmanız gerekir. |
break, continue |
break, continue |
Anlamları C’dekine benzer. while içinde continue güncelleme satırını atlarsa döngü hiç bitmeyebilir. |
sabit boyutlu int a[3] |
çoğu başlangıç probleminde list |
Python list’i büyüyüp küçülebilir, farklı türden öğeleri bir arada tutabilir ve öğelerin kendisini değil onlara referansları saklar. Bu yüzden C dizisinin birebir aynısı değildir. |
struct Ogrenci |
sözlük veya kullanıcı tanımlı class |
Sözlük yalnız veri tutar. Sınıf ise veriyi, bu veriyle çalışan metotları ve nesnenin her an uyması gereken kuralları, yani değişmez koşulları (invariant) bir arada tutar. struct ile class aynı şey değildir. |
| yapı/değer ataması | b = a |
Python’da b = a nesneyi kopyalamaz, b adını da aynı nesneye bağlar. Nesne değiştirilebilir (mutable) ise b ile yapılan değişiklik a’da da görünür. Bu duruma aynı nesneye referans verme (aliasing) denir. |
memcpy / elle kopya |
a.copy(), list(a), dilim vb. |
Bunların çoğu sığ kopya (shallow copy) çıkarır: dıştaki koleksiyon kopyalanır, ama içindeki mutable nesneler iki kopyada ortak kalır. |
char[] / char * metinleri |
str |
Python’da str Unicode metin tutar ve değiştirilemez (immutable). metin[0] = ... ile bir karakteri yerinde değiştiremezsiniz. |
NULL |
None |
None, “değer yok” anlamına gelen tek bir nesnedir. Bir adın None olup olmadığı çoğunlukla x is None ile sınanır. |
| pointer kimliği | ad/nesne referansı + is |
Python’da adlar nesnelere bağlanır ve pointer aritmetiği yoktur. is iki adın aynı nesneyi gösterip göstermediğine, == değerlerin eşit olup olmadığına bakar. |
| tamsayı bölme | / ve // |
/ ondalıklı bölme yapar ve float sonuç verir. // tam bölmedir ve sonucu aşağı yuvarlar (floor division). C sıfıra doğru kestiği için negatif sayılarda sonuç farklı çıkabilir: -7 // 2 == -4. |
% kalan |
% |
Negatif sayılarda kalan, // sonucuyla uyumlu olacak biçimde hesaplanır. Bu yüzden C’dekinden farklı işaretli bir sonuç 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’deki gibi başlık (header) dosyasına prototip yazılmaz. Fonksiyon, def satırı çalıştığında oluşur. Bu yüzden def satırının çağrıdan önce çalışmış olması gerekir. |
.h + .c dosyaları |
modül/paket (.py) |
import, C’deki #include gibi dosyanın metnini araya kopyalamaz. Modülü yükler ve bir ada bağlar. |
| dönüş türü zorunluluğu | return + isteğe bağlı type hint |
Tip ipucu (type hint) program çalışırken çoğunlukla denetlenmez. Kodu okuyana ve denetim araçlarına hangi türün beklendiğini söyler. |
hata kodu / errno / dönüş değeri |
dönüş değeri veya istisna | Python’da bir işlem başarısız olunca ya da beklenmeyen bir durum çıkınca çoğunlukla raise ile istisna yükseltilir. Bu istisna, ne yapılacağına karar verilebilecek bir yerde try/except ile yakalanır. |
FILE *, fopen, fclose |
with open(...) as dosya: |
with bloğu bitince dosya, arada hata çıksa bile kapanır. Metin dosyası açarken encoding="utf-8" değerini açıkça yazmayı alışkanlık edinin. |
Geçişte en sık yapılan üç hata
1. Atama kopya oluşturmaz
a = [1, 2]
b = a
b.append(3)
print(a) # [1, 2, 3]2. /, // ve % C’deki gibi davranmaz
print(7 / 2) # 3.5
print(7 // 2) # 3
print(-7 // 2) # -4
print(-7 % 2) # 13. Pointer yoktur, ama referans vardır
a = [1]
b = a
print(a is b) # TruePython’da pointer aritmetiği de, C’deki pointer söz dizimi de yoktur. Buna karşılık her ad bir nesneye bağlanır ve aynı nesneye birden çok addan ulaşılabilir. Python’ın çalışma modeli büyük ölçüde bu kurala dayanır.
Python’da bir yapının adını ya da C’den farkını unuttuğunuzda karta bakın. C’de yazdığınız bir programı satır satır Python’a çevirirken karta dayanmayın. Python’da koleksiyonları dolaşmanın, istisnaları ele almanın, modülleri ve nesneleri kullanmanın kendine özgü, daha doğal yolları vardır. Bu yüzden iyi bir Python çözümü bazen C çözümünden farklı bir yapıyla kurulur.