Merhabalar bu soruyu fonksyon kullanarak basit bir şekilde anlatabilir misinix ? Girilen sayının Güçlü (1! + 4! + 5! = 1 + 24 + 120 = 145) olup olmadığını bulan program?
Önce input
fonksiyonunu kullanarak kullanıcıdan bir girdi alalım.
sayı = input("Bir sayı giriniz: ")
Bir faktöriyel fonksiyonu tanımlayalım. Bu fonksiyon aldığı sayıyı kendisine kadar olan kendinden küçük bütün doğal sayılarla çarpacak. Bu işi yapmak için döngüleri kullanmalıyız. Python’da 2 tane döngü çeşidi var. while
döngüsü kendisine verilen ifade True
çıktısını verene kadar çalışır. for
döngüsü kendisine verilen listedeki bütün değerleri döngüde kullandıktan sonra biter. Daha ayrıntılı bilgi için kitaptaki döngüler kısmına bakabilirsiniz.
Önce faktöriyel fonksiyonunu tanımlayalım:
def faktoriyel(son_sayı):
Bu ifade Python’a birazdan faktöriyel isimli bir fonksiyon tanımlayacağımızı söylüyor. Parantez içinde verdiğimiz son_sayı
bu fonksiyonu her çağırdığımızda kullanacağımız değişkenleri Python’a söylüyor.
Biz bu fonksiyonu bir makine olarak yazıyoruz. Bir faktöriyel makinesi. Bizim içine koyduğumuz sayı(son_sayı
) değişecek. Makinenin verdiği cevap sayıya göre değişecek. Ama makinenin yaptığı iş değişmeyecek.
Faktöriyel işlemini normalde nasıl yaparız? 1’den sayının kendisine kadar olan kendisi dahil bütün sayıları çarparız:
6! = 1*2*3*4*5*6 #720
Her seferinde bu işi elle yapmak yerine bir döngü tanımlayalım. Elimizdeki her iki döngü çeşidi ile bu işi yapabiliriz. while
döngüsüyle bu işi yaparsak daha az fonksiyon kullanırız.
Önce bütün sayılarla çarpacağımız bir sonuç değişkeni tanımlayalım. Bu değişkenin başlangıç değeri 1 olmalı. Çünkü 1 çarpmada etkisiz eleman ve sonucun bu sayıdan etkilenmesini istemeyiz.
sonuc = 1
Şimdi bir değişken daha tanımlayalım. Bu değişkeni döngü boyunca birer birer artıracağız ve bu değişkenin değeri sayıyı geçtiği anda döngü bir daha çalışmayacak. Programlamada genellikle bu değişken için i
ismi tercih edilir. Altın standarttır. Başka bir değişken için de tek harften oluşan isim kullanılması hoş karşılanmaz.
i = 1
Bu değişkenlerin her ikisini de başlangıçta bahsettiğimiz fonksiyonun içinde tanımlayacağız. Fonksiyonumuz şu hâle geldi:
def faktoriyel(son_sayı):
sonuc = 1
i = 1
Fonksiyonu yazarken girintileri koymayı unutmayın. Girintiler Python’da gelenek olarak 4 boşluktan oluşur. İki nokta ile başlayan her ifadeden sonra girinti bir kat daha artar. Mesela def
ile bir fonksiyon tanımladınız. Sonraki ifadeler 4 boşluk bırakılarak yazılır. Fonksiyon tanımlamanız bittiği anda girintiyi bir kat azaltırsınız. Fonksiyonun içinde bir döngü açtığınızda ki şimdi yapacağız. Girinti bir kat daha artar ve 8 boşluk koyarsınız. Onun içinde bir döngü daha tanımlarsanız girinti yine artar ve 12 boşluk olur.
Artık bahsettiğimiz döngüyü yazmaya başlayabiliriz. while
döngüsü olacağını ve while
döngüsün bir ifadeyi kontrol ettiğini, bu ifade True
çıktısı verdiği sürece çalıştığını söylemiştim. Bizim kontrol edeceğimiz ifade i
değişkeni ile son_sayı
değişkeninin kıyası olacak. Döngümüz i
değişkeni son_sayı
değişkeninden küçük veya son_sayı
değişkenine eşit olduğu sürece çalışacak.
Temel algoritmaya tekrar bakalım. Eğer 6 sayısının sayısının faktöriyelini hesaplamak istersek son_sayı
değişkeni 6 değerini alacak ve i
değişkeni başlangıçta 1 değeri ile başlayacak. Biz i
değişkeninin değerini sonuc
değeri ile çarpacağız. Sonra i
değişkenine 1 ekleyip kontrol edeceğiz. Eğer i
değişkeni son_sayı
değişkeninden küçük veya son_sayı
değişkenine eşitse döngüye devam edeceğiz. Bizim senaryomuzda şu an i
değişkeni 2 ve son_sayı
değişkeni 6. Bu durumda döngümüz çalışmaya devam edecek. 2 ile sonuc
değişkenini çarpacağız ve sonuc
değişkenine atayacağız. Tekrar i
değişekninin değerini bir artıracağız ve tekrar kontrol edeceğiz. Döngü ta ki i
değişkenin değeri 7 olana kadar böyle devam edecek. 7 değerine ulaştığında kontrol aşamasında while
, “Dur” diyecek. Döngü kırılacak ve döngüden sonraki işlemler devam edecek.
Açıklaması bu kadar uzun ve karmaşık görülen kod aslında bu karmaşık değil.
Sırada bir döngü tanımlamak var. Tanımımız önce while
sonra "i
değişkeni son_sayı
değişkeninden küçük veya son_sayı
değişkenine eşit mi?" şeklinde olacak. Eğer karşılaştırma işlemlerini bilmiyorsanız kitaptan ilgili bölümü okuyabilirsiniz.
while i <= son_sayı:
Döngünün içinde 2 işlem yapacağız. Biri i
değişkenini sonuc
değişkeni ile çarpıp çarpımı sonuc
değişkenine kaydetmek. Burada “kaydetmek” adında ufak bir ayrıntı var. Siz şu işlemi yaparsanız sadece çarpmış olursunuz:
sonuc * i
Python bu işlemi yapar. O kadar. Sizin sayılarınız çarpılmış olur. Yoldan geçen bir adamı durdurup bu iki sayıyı çarptırmanızdan hiçbir farkı yok. O adam için de bu iki sayının bir önemi yok Python için de. Ancak bu çarpımı bir değişkene kaydederseniz anlamı olur.
sonuc = sonuc * i
Böylece döngünün yapacağı işin yarısını Python’a söyledik. İkinci işlem i
değişkeninin değerini 1 artırmak. Bu bir önceki işlemden daha sade. i
değişkenine 1 ekleyip i
değişkenine kaydedeceğiz.
i = i + 1
Eğer i
değerini artırmazsak kontrol ve çarpım işlerimizde sonsuza dek 1 değerini kullanan bir döngü elde ederiz. Döngü asla bitmez ve sonuc
değişkeninin değeri de asla değişmez.
Döngümüzün son haline bakalım. Dikkatli bakarsanız döngüyü tanımlarken de iki nokta kullandık. Yani döngünün içine yazdığımız ifadeler bir kat girintili olarak yazılacak:
while i <= son_sayı:
sonuc = sonuc * i
i = i + 1
Aslında fonksiyon yazmasaydık şu anda elimizde faktöriyel hesaplayan bir program olurdu.
son_sayı = 6
sonuc = 1
i = 1
while i <= son_sayı:
sonuc = sonuc * i
i = i + 1
Bu programda son_sayı
değişkenine istediğiniz değeri vererek faktöriyel hesabı yapabilirsiniz. Tabi ki bunun çok daha kısa yazımları var. Ancak yeni başlayan birinden en temel olarak bu tarzda bir fonksiyon beklenir. (Ben bu kodların hiçbirini test etmeden ezberden yazıyorum. Test etmenizde fayda var. Saatin gece 12.30 olmasından mütevellit hata olma olasılığının yüksek olduğuna inanıyorum.
Gel çocuk! Az bir işimiz kaldı.
Biz başlangıçta fonksiyon yazacağız, dedik. Fonksiyonun girdisi olarak bir değişken aldık. Çıktı olarak da bir sayı vereceğiz, dedik. Başından beri faktöriyeli hesapladığımız değişken olan sonuc
değişkeninin değerini geri döndürelim. Eğer bu ifadeyi anlamazsan kısaca google’layabilirsin.
return sonuc
Bu ifade fonksiyonumuzda while
döngüsünden sonra gelecek ve fonksiyonumuz bu ifade ile bitecek. Fonksiyonun tüm halini görelim bu sırada while
döngüsünün içinde kalan şeylerin 2 kat girintili yani 8 boşluklu yazıldığına dögü bittikten sonra gelecek olan ifadelerin tekrar tek girintili yazıldığına dikkat edelim.
def faktoriyel(son_sayı):
sonuc = 1
i = 1
while i <= son_sayı:
sonuc = sonuc * i
i = i + 1
return sonuc
Biraz önce program diye size verdiğim kodun fonksiyon halini yazdık. Bunu çalıştırmak için fonksiyonu bir değişkenle çağırmak yeterli.
faktoriyel(6) #720
Şimdi elimizde faktöriyel fonksiyonu olduğuna göre güçlü sayılar için uğraşmaya başlayabiliriz. Biz en başta input
ile sayı
değişkenine bir ifade almıştık. Bu ifade bize bir liste veriyor. Sayının her karakterini tek tek ve sırayla içeren bir liste. Yine başlarda 2 tane döngümüz olduğunu ve birinin ifadeyi kontrol ederek diğerinin listedeki değerleri kullanarak çalıştığını söylemiştim. while
döngüsünü zaten kullandık. Onun kendisine verilen ifadeyi nasıl kontrol ettiğini gördük. Şimdi for
döngüsü ve sayı
karakter dizisini kullanarak kodumuza devam edelim.
Buradan sonra yazacağımız kodları fonksiyon içine değil altına yazacağız. Hatta başa yazacağımız input fonksiyonunu da sona alalım. İlerideki toplu kodlarda da öyle göstereyim.
İlk önce toplamı tutacağımız yeni bir değişken oluşturalım. Bu değişkenin adı toplam
olsun. Başlangıç değeri de toplamanın etkisiz elemanı olan 0 olsun. Faktöriyel hesaplarımızı bu değişkende toplayalım.
toplam = 0
for
döngüsünde yine bir i
değişkeni tanımlayacağız. Bu sefer biz değişkenin değerini hiçbir şekilde değiştirmeyeceğiz. Bütün değişiklikleri for
döngüsü kendisi yapacak.
Şimdi Python’ın kafasını anlatacağım. Kafan karışabilir sadece kabul etmeni bekliyorum. ["1", "4", "5"]
ve "145"
aynı şey. Ama "145"
bir sayı değil. "145"
bir karakter dizisi. Zaten ["1", "4", "5"]
de "145"
in liste şeklinde gösterimiyle elde ediliyor. Biz eğer faktöriyel fonksiyonumuza direkt input
'tan elde ettiğimiz sayı
değişkenini verirsek hata alırız. sayı
değişkenini int
fonksiyonuna vermeliyiz. Bu int
fonksiyonu içine koyduğun karakter dizilerini Python’ın dilinde sayıya dönüştürüyor. Yani "145"
bir sayı değilken int("145")
bir sayıyı temsil ediyor. Aslında int("145")
ile 145
aynı şey. Dışarıdaki tırnak işaretleri ortalığı karıştırıyor.
Kafan karıştıysa bırak öyle kalsın. Birkaç saat ya da gün sonra kitaptaki şu bölümü okuyarak daha iyi anlayabilirsin. Şimdi de okuyabilirsin pekâlâ. Tercih senin.
Gel for
döngüsüne tekrar dönelim. Döngümüze liste olarak sayı
değişkenini verelim ve her çalıştığında bize değişik bir i
değişkeni versin. Türkçede böyle ifade ettiğimiz şeyi Python’a şöyle söyleyince anlıyor:
for i in sayı:
Bu döngü boyunca her aldığımız i
değeri bir karakter olacak ve biz o değeri kullanmadan önce int
fonksiyonunu kullanarak sayıya dönüştürmeliyiz.
Döngü boyunca yapacağımız tek bir işlem var. toplam
değişkenine i
değişkeninin faktöriyelini ekleyip toplam
değişkenine tekrar kaydetmek. Döngü bittiğinde bütün i değerlerinin faktöriyellerinin toplamını elde etmiş olacağız.
Önce i
değişkenini sayıya dönüştürerek başlayalım.
int(i)
Şimdi faktöriyelini hesaplayalım. Bu işlem için uzunca bir süre uğraşıp fonksiyon yazdığımız çağıracağız.
faktoriyel(int(i))
Unutmayalım Python fonksiyonları içeriden dışarıya doğru çağırıyor. Yani önce int
sonra o fonksiyondan elde ettiği çıktı ile faktoriyel
fonksiyonu çalışacak.
Hemen elde ettiğimiz bu değeri toplam
değişkenine ekleyelim.
toplam + faktoriyel(int(i))
Daha önce de açıkladığımız gibi bu işlemi kaydetmediğimiz sürece hiçbir anlamı yok. Hemen kaydedelim.
toplam = toplam + faktoriyel(int(i))
Fonksiyondan sonra yazdığımız kısmı hemen toparlayalım.
sayı = input("Bir sayı giriniz: ")
toplam = 0
for i in sayı:
toplam = toplam + faktoriyel(int(i))
Bitti sayılır.
Eğer ilk başta girilen ifade ile bizim ulaştığımız toplam aynı ise başta verilen sayı güçlüdür. Farklıysa güçlü değildir. Bunu kontrol etmek için de Python’daki if
ve else
deyimlerine danışacağız. Hemen kitaptan link bırakalım. Direkt olarak kodu tamamlıyorum. Keza buradaki kodda en temel hâliyle bu deyimleri kullanıyoruz.
if toplam == int(sayı):
print("Güçlü sayı")
else:
print("Güçlü değil")
Kodun toplu hâlini vermek onca şeyi yazdıktan sonra benim çok vaktimi almaz. Ama okuyup onu çıkartmak da senin görevin olsun.
Saat 01.30’a gelirken yazımı bitiriyorum. Arada dediğim gibi hiçbir kodu test etmedim. Hatta yazdığım ifadelerde de hata olabilir. Aylardır foruma girmiyordum. Cevap vermek için geleceğimi de sanmıyorum. Dilim döndüğünce açıklamaya çalıştım. Ancak seviyenizi bilmediğim için ancak bu kadar oldu.