Fonksiyon nedir
Fonksiyon, birkaç satır kodu tek bir yerde toplayıp onlara bir ad vermek ve o andan itibaren satırları tekrarlamak yerine o adı çağırmak demektir. Asıl değeri yazmaktan tasarruf etmek değil; içinde verdiğiniz her kararın artık tek bir yerde yaşamasıdır.
- Ders 7 / 14
- Başlangıç
- Ücretsiz, kayıt yok
Bir fonksiyonu oluşturan dört parça
-
Girdi
Tekrarlanan kopyalar arasında farklılaşan şey. Hiçbir şey farklı değilse parametre gerekmez.
-
Mantık
Fonksiyonun yaptığı iş ve adının söylemesi gereken şey. Anlatmak için "ve" demek zorundaysanız, iki fonksiyonunuz var.
-
Çıktı
return ile geri verilen şey. Yalnızca yazdıran bir fonksiyonun çıktısı yoktur ve bir sonraki hesapta kullanılamaz.
-
Yeniden kullanım
Fonksiyonun içinde verilen her karar artık tek bir yerde yaşar ve tek bir yerde değişir.
Dördüncü parça, bir fonksiyonu sıradan birkaç satırdan ayıran şeydir. Tek bir yerde bir kez gereken kodun fonksiyon olması gerekmez.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
Fonksiyon tam olarak nedir ve sıradan birkaç satırdan farkı ne?
Fonksiyon, adı olan birkaç satır koddur. Farkı yaratan şey ada sahip olmaktır: adı olmayan kod dosyanızda bir yerdir yalnızca, adı olan kod ise programın herhangi bir yerinden çağrılabilir ve içinde ne olduğunu bilmeniz artık gerekmez.
def display_name(user):
name = user["name"].strip()
if name == "":
return "guest"
return nameBurada birbirinden ayrı iki şey oluyor ve yeni başlayanlar genelde bunları karıştırır. İlk satır tanımdır: böyle bir şey var ve işi budur der. Çalışmaz, yalnızca kaydedilir. Çağrı başka bir yerdedir, display_name(user_a) yazdığınızda, ve o beş satır ancak o zaman çalışır.
Yani tanımlanmış ama hiçbir yerde çağrılmamış bir fonksiyon hiçbir şey yapmaz ve hata da bildirmez. Bu, "kodum çalışmıyor" cümlesinin en yaygın nedenlerinden biridir; özellikle biri kodu bir fonksiyonun içine taşıyıp dosyanın altında onu çağırmayı unuttuğunda.
Ve bir fonksiyonun en iyi tanımı tekrarı azaltması değildir; bir düşünceye ad vermesidir. display_name yazdığınızda, kodunuzu okuyan kişi ne olduğunu anlamak için artık dört satır okumak zorunda değildir. İyi bir ad, dört satırlık açıklamayı ortadan kaldırır ve bir fonksiyonun size verdiği en büyük şey budur.
Parametre ile argüman arasındaki fark nedir?
Bu iki kelime tek bir şeye iki yandan bakar ve tam da bu yüzden karıştırılır. Parametre, fonksiyonu tanımlarken yazdığınız addır; yukarıdaki örneğin ilk satırındaki user. Argüman ise çağırırken gönderdiğiniz gerçek değerdir; yani user_a.
Parametre bir boşluktur, argüman o boşluğu dolduran şeydir. Daha kesin söylersek: parametre tanıma aittir ve tektir, argüman ise her çağrıya aittir ve her seferinde farklı olabilir. Tek parametreli bir fonksiyon, bir program boyunca elli farklı argümanla elli kez çağrılabilir.
Bu ayrımı bilmek sözlük anlamında değil, pratikte işe yarar. Fonksiyonun iki girdi istediğini ve bir tane aldığını söyleyen bir hata gördüğünüzde, o hata argüman sayısından bahsediyordur, tanımdan değil. Yani tanım sağlamdır ve hata onu çağırdığınız satırın ta kendisindedir. Yalnızca bu teşhis, aramayı koca bir dosyadan tek bir küçük satıra indirir.
Hayatınızı kolaylaştıran bir alışkanlık: parametrelerinizi ne beklediklerini kendileri söyleyecek biçimde adlandırın. def send(to, subject, body) hiçbir açıklama olmadan okunur, oysa def send(a, b, c) sizi her seferinde fonksiyonun içine geri döndürür ki bu, fonksiyonun sizi kurtarması gereken şeyin ta kendisidir.
Parametre, argüman ve geri dönen şey
Tanım: parametre
bir kez yazılır
- Adı olan bir boşluk
- Adı ne beklediğini söylemeli
Çağrı: argüman
her seferinde değişebilir
- Boşluğu dolduran gerçek değer
- Tek fonksiyon, elli çağrı, elli argüman
ve bir şey geri döner
Dönüş değeri
return'ün geri verdiği şey, yazdırılan şey değil
- return yoksa fonksiyon boş bir şey döndürür
- return fonksiyonu oracıkta bitirir
Bir fonksiyonun tek bir tanımı ve istediğiniz kadar çağrısı olur. Girdi sayısının uyuşmadığını söyleyen bir hata her zaman çağrı tarafıyla ilgilidir, tanımla değil.
return ne demek ve print neden onun yerini tutmaz?
Yeni başlayanların en çok takıldığı yer burasıdır ve kökeni basit bir yanlış anlamadır: print ekranda bir şey gösterir, return ise bir değeri fonksiyonu çağıran kişiye geri verir. Bunlar hiç de aynı iş değildir.
def double(n):
print(n * 2)
result = double(5)
print(result)Ekranda önce 10, sonra None görünür. Onu fonksiyonun kendisi yazdırdı, ama result boştur, çünkü bu fonksiyon hiçbir şey döndürmedi. return içermeyen bir fonksiyon Python'da None, başka dillerde de onun karşılığını geri verir.
def double(n):
return n * 2
result = double(5)
print(result)Şimdi fonksiyonun içinde hiçbir şey yazdırılmıyor ve result on, yani bir sonraki hesapta kullanabileceğiniz bir şey. Pratik fark şu: yazdıran bir fonksiyon elle test ettiğinizde doğru görünür ve sonucunu kullanmak istediğiniz anda kırılır. Bu hatanın genelde geç bulunmasının nedeni de budur.
Daha az söylenen bir nokta daha: return fonksiyonu anında bitirir. Aynı fonksiyonun içinde ondan sonra yazılan hiçbir satır çalışmaz. Bu bir kısıt değil, bir araçtır: bu sayfadaki ilk örnekte return "guest", son satırın hiç değerlendirilmemesi demektir. Buna erken dönüş denir ve kodu iç içe koşullardan kurtarır.
Gerçek bir yeniden düzenleme: üç tekrar, tek fonksiyon
Diyelim ki bu aynı dört satırı bir programın üç yerinde, yalnızca tek bir değişkenle farklılaşarak yazdınız:
name = user_a["name"].strip()
if name == "":
name = "guest"
print(name)
name = user_b["name"].strip()
if name == "":
name = "guest"
print(name)Bir fonksiyonu dışarı çekmenin doğru yolu üç adımdır ve genelde atlanan ikincisidir. Birincisi, tekrarı bulun. İkincisi ve daha önemlisi, üç kopya arasında neyin farklı olduğunu bulun; o şey sizin parametrenizdir. Üçüncüsü, o farkı girdi olarak alan bir fonksiyon yazın.
def display_name(user):
name = user["name"].strip()
if name == "":
return "guest"
return name
print(display_name(user_a))
print(display_name(user_b))Gerçekte kazanılan şey birkaç satırlık tasarruf değil. guest kelimesinin artık tam olarak tek bir yerde yazılı olması. Yarın yerine başka bir şey yazmaya karar verdiğinizde tek satır değiştirir ve işi bitirirsiniz.
Önceki sürümde ne olurdu peki? Üç yerin ikisini değiştirir, üçüncüsünü görmezdiniz. Program da hata vermezdi; sitenizin bir sayfası aylarca eski kelimeyi gösterir ve kimse fark etmezdi. Tekrarlanan kod bu yüzden tehlikelidir, çirkin olduğu için değil.
Tekrarlanan koddan bir fonksiyon çıkarmanın beş adımı
-
1
Tekrarı bul
İki kez rastlantı olabilir, üç kez değildir.
-
2
Farkları bul
Kopyalar arasında farklı olan her şey bir parametredir.
-
3
Ona bir ad ver
Bir ad bulamıyorsanız, bu kodun ne yaptığını henüz bilmiyorsunuz.
-
4
Tek bir fonksiyon yaz
Farklar girdi olur, gerisi içeride kalır.
-
5
Üç yeri de değiştir
Birini bırakırsanız, aylarca eski davranışı sürdüren o olur.
Atlanan adım ikincisidir ve sonra yeniden düzenleme bozulur. Kopyalar arasındaki farkları kaçırırsanız, birinin davranışını sessizce değiştiren bir fonksiyon kurarsınız.
181 kez çağrılan dört satır kod
Yukarıdaki örnek uydurmadır. Bu değil. Bu sitenin bilgi grafiği kütüphanesinde işi tek bir şey olan bir fonksiyon var: dört dilli bir diziyi al, sayfanın dilindeki metni çıkar ve o dil yoksa Farsçaya düş.
function rgb_dg_t( $value, string $lang ): string {
if ( is_array( $value ) ) {
return (string) ( $value[ $lang ] ?? $value['fa'] ?? '' );
}
return (string) $value;
}Bu dersin denetlendiği gün, bu fonksiyon diyagram kütüphanesinin dört dosyasında 181 kez çağrılmıştı. Bu öğrenme bölümünde gördüğünüz her şeklin her başlığı, her etiketi ve her notu bu dört satırdan geçiyor.
Şimdi üçüncü satırın ortasındaki ?? 'fa' ifadesine bakın. O bir karardır: bir etiketin çevirisi henüz yazılmadıysa, boş bir şekil yerine Farsça metni göster. Bu karar tek bir yerde yazılıdır ve 181 noktada etkisini gösterir. Yarın fikrimizi değiştirip Farsça yerine hiçbir şey göstermemeyi tercih edersek, tek bir kelime değişir.
Ve aynı madalyonun açıkça söylenmesi gereken öbür yüzü: o dört satırdaki tek bir hata da 181 yeri birden bozar. Bu kadar merkezi bir fonksiyon, tam da bu yüzden onu çağıran koddan daha dikkatli okunmalıdır. Yoğunlaşma size fayda ve riski birlikte verir ve ikisi de aynı maddedendir.
Ne zaman fonksiyon yazmamalı? Ve kodu bilerek tekrarladığımız yer
"Kendini tekrar etme" kuralını çok duyarsınız ve her mutlak kural gibi bir yerde işlemez olur. Dört satırı anlamak için sizi dosyanın başına gidip geri dönmeye zorlayan bir fonksiyon, tasarruf ettirdiğinden fazlasını alır.
Bir fonksiyonun gereksiz olduğunu gösteren üç işaret: tek bir yerden çağrılıyor ve muhtemelen hep öyle kalacak; adı fiilen içindeki kodun kendisi, bir eklemek için add_one adlı bir fonksiyon gibi; ve yazılması altı parametre gerektiriyor. Sonuncusu en önemlisi: çok sayıda parametre genelde fonksiyonun birden fazla iş yaptığı anlamına gelir. Basit sınama şu: ne yaptığını kısa bir ifadeyle söylemeye çalışın; "ve" demek zorunda kaldıysanız, elinizde iki fonksiyon var.
Şimdi bu siteden tersi bir durum. İki ayrı eklentimiz var ve ikisi de fiyatı binlik ayırıcı ve Farsça rakamlarla toman cinsinden göstermek zorunda. Bunun kodu ikisinde de neredeyse aynı, buna rağmen iki farklı adla iki ayrı fonksiyonlar; biri sıralama eklentisinde, biri barındırma eklentisinde.
Bu tekrar bir hata değil, bir karardır. Her eklenti, diğeri kapalıyken bile tek başına çalışmak zorunda. Biri diğerinin fonksiyonunu kullansaydı, bir eklentiyi devre dışı bırakmak öbürünün sayfalarını kırardı. Bu bağımsızlık için ödediğimiz bedel gerçek ve onu gizlemiyoruz: fiyatın gösterilme biçimindeki her değişiklik iki yerde yapılmak zorunda ve iki yer olduğunu hatırlamamız gerekiyor. Bunu, her zaman üçüncü bir yol olmadığını bilesiniz diye söylüyoruz; bazen iki maliyet arasında seçim yapmanız ve sonra o seçimi bir yere yazmanız gerekir ki sizden sonraki kişi unuttuğunuzu sanmasın.
Yapay zekayla hızlı yol
Tekrarlanan koddan bir fonksiyon çıkarmak, modellerin tam da iyi yaptığı ve dikkatsizce yapıldığında bir programın davranışını tam da sessizce değiştiren iştir. Bu yüzden aşağıdaki reçetede, onu sıradan bir yeniden düzenleme isteğinden ayıran alışılmadık bir madde var: modelden, her şeyden önce üç kopyanın farklılaştığı bütün noktaları listelemesini istiyor. O liste, sizin görmediğiniz şeydir ve yeniden düzenlemenin kırıldığı yerdir. Bu bir yargı işi, dolayısıyla hızlı değil üst sınıf bir model ister; kodlama modelleri arasındaki güncel tercihimiz bu sitenin yapay zeka bölümünde.
- Üç tekrarlanan bloğu da eksiksiz kopyalayın; birini kopyalayıp "diğerleri de benzer" diye not düşmeyin. O "benzer" kelimesi, yeniden düzenlemenin kırıldığı yerin ta kendisidir.
- Aşağıdaki reçeteyi gönderin ve önerilen koda bakmadan önce yalnızca farklar listesini okuyun. O listede bilmediğiniz bir şey varsa, orada durun ve önce hangi davranışın doğru olduğuna karar verin.
- Önerilen fonksiyon adını ciddiye alın ama körü körüne kabul etmeyin. Adı açıklamak sizi "ve" demeye zorluyorsa, fonksiyon iki iş yapıyordur ve ikiye ayrılmalıdır.
- Değiştirdikten sonra üç yeri de yeniden açın ve hiçbirinin geride kalmadığından emin olun. Üçünden birini kaçırmak bu işin en yaygın hatasıdır ve hiçbir hata üretmez.
Kopyalamaya hazır şablon
Bu üç kod bloğu programımda tekrarlanıyor ve bunlardan tek bir fonksiyon çıkarmak istiyorum.
{birinci blok}
{ikinci blok}
{üçüncü blok}
Her şeyden önce ve hiç kod yazmadan önce şunu ver:
1. Üç blok arasındaki her farkın listesi; iki satırın sırası ya da birinde fazladan bir koşul gibi küçük farklar dahil.
2. Her fark için, hepsini aynı yaparsak kimin davranışının değişeceğini söyle.
Ondan sonra:
3. Gerçek farkları parametre olarak alan tek bir fonksiyon öner, ne yaptığını söyleyen bir adla.
4. Üç bloğun yerine geçen üç çağrı.
5. Önerilen fonksiyonun boş ya da eksik bir girdide nasıl davrandığını söyle.
Bunlardan biri için sana vermediğim bir koda ihtiyacın varsa, hangisi olduğunu ve nedenini söyle; tahmin etme.
Çıktıya güvenmeden önce: İlk madde reçetenin tüm değeridir ve onu çıkarmak bunu herkesin yazdığı sıradan bir yeniden düzenleme isteğine çevirir. Son cümle de tesadüfen orada değil: o üç bloktan biri, kodunu göndermediğiniz bir fonksiyonu çağırıyorsa, model onun davranışını adından tahmin eder ve o tahmini kesin bir tonla yazar. Değişimden sonra üç yeri de kendiniz çalıştırmadıkça yeniden düzenleme bitmemiştir.
Bu işte yapay zeka
Fonksiyon yazmak, dil modellerinin kusursuz yaptığı işlerden biridir; çünkü biçimi sabittir ve eğitim verilerinde örneği boldur. Size kalan şey fonksiyonu yazmak değil, sözleşmesini değerlendirmektir: ne alıyor, ne geri veriyor, kötü girdide ne yapıyor ve adı gerçekten yaptığı şeyi söylüyor mu. Tutumumuz, bu konuda modeli yazar değil eleştirmen rolünde tutmaktır: az önce yazdığı fonksiyonu, ayrı bir mesajda, eleştirmesini isteyin.
Gerçekten işe yarayan araçlar
- Claude Code Bu konudaki en iyi özelliği depoyu görmesi; bir fonksiyonun nereden çağrıldığını sorduğunuzda tahmin etmek yerine gidip sayıyor. Bu derste o dört satırlık fonksiyon üzerinde yaptığımız işin aynısı. Ücretsiz kuruluyor ama bir Claude aboneliği ya da Anthropic Console hesabı olmadan çalışmıyor ve İran desteklenen ülkeler listesinde yok.
- Claude Bir fonksiyonun sözleşmesini eleştirmek için iyi: birden fazla iş yapıp yapmadığını ve adının doğru olup olmadığını sorun. İran, Anthropic'in iki desteklenen ülke listesinin hiçbirinde yok; bunu ağ testiyle değil, Anthropic'in kendi sayfasında okuduk.
- Gemini Çalışma modu Guided Learning, yanıt vermek yerine soru soruyor; bu da bu dersin en zor kısmı olan return ile print farkının oturması için doğrudan yanıt almaktan daha uygun. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
Nerede geri teper
Bu konudaki somut risk tek cümleye sığar: model, altı parametreli ve üç iş yapan bir fonksiyonu seve seve kurar, çünkü siz "tek fonksiyon" dediniz ve o tam olarak tek bir tane verdi. Kod çalışır, testi bile geçer ve altı ay sonra kimse ona dokunmaya cesaret edemez. Bu yüzden parametreleri kendiniz sayın ve her seferinde bu fonksiyonun kısa bir ifadeyle anlatılıp anlatılamayacağını sorun.
İkinci risk daha kesin ve bu işe özgü: modelden birkaç benzer bloğu tek bir fonksiyonda toplamasını istediğinizde, aralarındaki küçük farkları bilerek ya da bilmeyerek düzler, çünkü onları birleştirmesini istediniz. Sonuç, o blokların birinin davranışında sessiz bir değişikliktir ve hiçbir yerde hata çıkmaz. Anthropic bu dayanaksız güven sınıfını kendi belgelerinde halüsinasyon diye adlandırıp azaltma yollarını anlatıyor. Bu araçların İran'dan nasıl ödenebileceği için satın alma rehberine bakın; kodlama modelleri arasındaki güncel tercihimiz için kodlama için en iyi yapay zeka sayfasına bakın.
Kaynaklar: Anthropic: reduce hallucinations Anthropic: supported countries Claude Code: overview and install Google: where the Gemini web app is available
Bu tavsiyenin sınırı
Bu sayfadaki örnekler Python ve biri PHP; fikir her dilde aynıdır ama yazılışı değişir. Üç konuyu da bilerek dışarıda bıraktık, çünkü her biri kendi dersini istiyor: değişken kapsamı ve bir fonksiyonun içinde nelerin görüldüğü, varsayılan değerler ve isteğe bağlı girdiler, ve bir fonksiyon ile bir nesne üzerinde çağrılan bir metot arasındaki fark. Ve dürüst yanıtı kural yok olan bir soru: bir fonksiyon kaç satır olmalı. Size verilen her sayı bir yerden gelmiyor; asıl sınama, işini kısa bir ifadeyle söyleyebilmenizdir ve bu sınamanın satır sayısıyla ilgisi yoktur.
Kendi işimizden
Bu dersteki sayı bir tahmin değil. Bu sayfanın denetlendiği gün, bu sitenin kendi diyagram kütüphanesinin dört dosyasında rgb_dg_t çağrılarını saydık: diagram.php içinde 21, diagram-lib.php içinde 86, diagram-lib2.php içinde 62 ve diagram-chart.php içinde 12; gövdesi dört satır olan bir fonksiyon için toplam 181 çağrı. Bu sayının gösterdiği ve bu ders için önemli olan şey, yazmaktan tasarruf değil: bu sitenin bilgi grafiklerinin bütün çok dillilik politikası o fonksiyonun içindeki tek bir ifadeye, ?? $value['fa'] ifadesine sıkışmıştır ve bir etiketin çevirisi yazılmadığında ne gösterileceğine yalnızca o ifade karar verir. O politikayı değiştirmek, arkasında 181 nokta olan tek bir kelimeyi değiştirmektir; yanlış yapmak ise aynı 181 noktanın birlikte kırılmasıdır.
Gerçek devam soruları
Fonksiyon ile metot arasındaki fark nedir?
Metot, bir nesneye bağlı olan ve genelde o nesnenin kendi verisi üzerinde çalışan bir fonksiyondur. Bu sayfadaki örneklerde strip() bir metottur, çünkü dizgenin kendisi üzerinde çağrılır; display_name() ise bağımsız bir fonksiyondur. Nesne yönelimli programlamaya geçene kadar aradaki fark yalnızca yazılış biçimidir.
Fonksiyonum neden None döndürüyor?
İçinde return olmadığı için ya da return, bu çalışmanın gitmediği bir yolda durduğu için. Birincisi genelde return demek isterken print kullandığınız anlamına gelir; ikincisi koşullarınızın bir dalının return'süz kaldığı anlamına gelir. İkisi de fonksiyonun son satırına bakılarak teşhis edilir.
Bir kod parçasının fonksiyon olması gerektiğini nasıl anlarım?
İki işaret yeter. Birincisi, üç kez tekrarlanmış olması; iki kez rastlantı olabilir, üç kez değildir. İkincisi, ne yaptığını kısa bir ifadeyle söyleyebilmeniz; o ifadeyi bulduysanız fonksiyonun adını da bulmuşsunuzdur, bulamadıysanız o kodun ne yaptığını henüz bilmiyorsunuzdur.