def kare(sayi):
return sayi*sayi
print(kare(10)) # Çıktısı: 100
Fonksiyona ikinci bir arguman ekleyip kendisiyle kac defa carpmasi gerektigini verebiliyor olsak nasil olurdu?
ussunu_al(10, 2) # 10 * 10 = 100
ussunu_al(10, 3) # 10 * 10 * 10 = 1000
ussunu_al(2, 10) # 2 ussu 10 = 1024
o o zaman üs olur o fonksiyon
ussunu_al fonksiyonunu yazmayi deneyelim mi pratik icin? Sen basla
biraz zor oldu:
def üssünü_al(sayı,sayı2,sonuç = 1):
for _ in range(sayı2):
sonuç *= sayı
return sonuç
print(üssünü_al(2,3))
sonuç değişkenini parametre olarak değil de, fonksiyonun içinde tanımlasanız daha iyi olur. Çünkü burada üçüncü bir argümanın kullanılmasına izin veriyorsunuz. üssünü_al(2,3,2) yazdığımızda fonksiyon beklediğiniz gibi çalışmaz.
ellerine saglik reis cok guzel olmus tak diye cozdun valla ![]()
Ben de boyle yazdim:
from functools import reduce
from operator import mul
ussunu_al = lambda base, exponent: reduce(mul, [base] * exponent, 1)
Eski günleri yâd ettirdin bana kardeşim. Ben de yıllar önce bir forumda henüz yeni Python’a başlamış bir arkadaşa 100 satırlık kodunu 20 satıra indirip böylesi daha iyi demiştim de çocuğu Python’dan soğutmuştum. Nerede ve ne yapıyor acaba şu an çocuk ![]()
Code golf!
from functools import reduce
print("3 ** 4 =",
(lambda m: lambda n: n((lambda m: lambda n: m((lambda m: lambda n: m(lambda n: lambda f: lambda x: f(n(f)(x)))(n))(n))(lambda f: lambda x: x))(m))((lambda n: lambda f: lambda x: f(n(f)(x)))(lambda f: lambda x: x)))
(lambda f: lambda x: reduce(lambda acc, v: v(acc), [f for _ in range(3)], x))
(lambda f: lambda x: reduce(lambda acc, v: v(acc), [f for _ in range(4)], x))
(lambda n: n + 1)(0)
)
spoiler
church0 = lambda f: lambda x: x
succ = lambda n: lambda f: lambda x: f(n(f)(x))
add = lambda m: lambda n: m(succ)(n)
mul = lambda m: lambda n: m(add(n))(church0)
exp = lambda m: lambda n: n(mul(m))(succ(church0))
church_to_int = c2i = lambda c: c(lambda n: n + 1)(0)
from functools import reduce
int_to_church = i2c = lambda n: lambda f: lambda x: reduce(lambda acc, v: v(acc), [f for _ in range(n)], x)
print("2+3 =", c2i(add(i2c(2))(i2c(3))))
print("2*3 =", c2i(mul(i2c(2))(i2c(3))))
print("2^3 =", c2i(exp(i2c(2))(i2c(3))))
print("3^2 =", c2i(exp(i2c(3))(i2c(2))))
print("2^5 =", c2i(exp(i2c(2))(i2c(5))))
print("5^2 =", c2i(exp(i2c(5))(i2c(2))))
assert c2i(church0) == 0
assert c2i(succ(church0)) == 1
assert c2i(succ(succ(church0))) == 2
assert c2i(i2c(42)) == 42
assert c2i(add(i2c(2))(i2c(3))) == 5
assert c2i(add(i2c(3))(i2c(2))) == 5
assert c2i(mul(i2c(2))(i2c(3))) == 6
assert c2i(mul(i2c(3))(i2c(2))) == 6
assert c2i(exp(i2c(2))(i2c(3))) == 8
assert c2i(exp(i2c(3))(i2c(2))) == 9
(bkz: Lambda calculus), (bkz: Church numeral)
mul ve exp icin kisa formlari kafadan cikartamadim, ama lambda sadelestirmelerini uygulasak olur herhalde. Bu sekilde her islemin bir oncekinin tekrari oldugu daha rahat goruluyor. Tetrasyon filan da ayni sekilde eklenebilir. (Tetrasyonun birim elemani ne?)
Edit: Olmadi. Su kadar filan sadelesti exp:
lambda m0: lambda n0: n0((lambda n1: m0(n1(lambda n3: lambda f: lambda x: f(n3(f)(x))))(lambda f: lambda x: x))) (lambda f: f)
exp’in kisa formu λm: λn: n(m) bu arada. Ters kullanmayi goze alirsaniz λm: λn: m(n) yani λn: n oluyor. Yani aslinda Church sayilarini birbirlerine paslayarak us islemi yapabiliyorsunuz:
uc = i2c(3)
print(c2i(uc(uc))) #27
Ve bu arada
kare = iki = succ(succ(church0)) = lambda f: lambda x: f(f(x))
Sunu yazarken utaniyorum:
print("3 ** 2 =",
(lambda f: lambda x: f(f(x)))
(lambda f: lambda x: reduce(lambda acc, v: v(acc), [f for _ in range(3)], x))
(lambda n: n + 1)(0)
)
cunku kodun cogunlugu i2c ve c2i. Kare fonksiyonu iki sayisiyla ayni oldugunda boyle oluyor tabi…
def üssünü_al(sayı,sayı2,sonuç = 1):
for _ in range(sayı2):
sonuç *= sayı
return sonuç
print(üssünü_al(2,3))
Olay bundan
from functools import reduce
from operator import mul
ussunu_al = lambda base, exponent: reduce(mul, [base] * exponent, 1)
Buna nasıl geldi?
Sonuncunun ne işe yaradığını çevirebilmek için yazbelin neresine kadar okumak lazım. Bu modülleri anlatıyor mu?
Ve kod alanını nasıl açılıyordu?
Butun yontemleri surada: Soru Sorarken Sıkça Düşülen Hatalar #1
Fonksiyonel programlama gerecleriyle. Fonksiyonel programlamada loop olmadigi icin, recursion temel bir sey. Map/fold (map/reduce) data uzerinde yapilan bir suru islemi ifade edebilen son derece kullanisli seyler, ve alisinca gundelik imperatif programlama koduna bile girebiliyorlar.
Malesef, yazbel belgeleri bir programlama dersinden ziyade Python dokumentasyon cevirisi gibi. Sizi, bulabildiginiz butun kaynaklari denemeye davet etmek isterim.
O ve benzeri kaynaklar map ve reduce fonksiyonlarinin tam olarak nasil calistiklarini anlatabilirler, fakat bunlarla neler yapabileceginize sadece deginebilirler. (Tornavida almaya gittiginizi dusunun. Hangi vidalari vidalayabileceginizi soyleyebilirler, ama bu vidalarla neleri insa veya tamir edebileceginizi anlatamazlar.)
Butun loop’lar recursive fonksiyona, ve butun recursive fonksiyonlar loop’a donusturulebiliyor. Lutfen bana inanmayip kendiniz deneyin.
Bu arada Church-Turing tezine gore hepsi lambda calculus’ta da ifade edilebiliyor. Yukarida lambda calculus’a Church sayilariyla ufak bir giris yaptim.
nasıl yani yad ettirdin derken
yani eski günleri mi hatırlattım sana
fatih baba sana yazmadım onu niye üstüme geliyorsun bak üzülürüm sonra
yok üzülme üstüne gelmedim sadece sordum yani
sadece sordum yani merak ettim
for döngüsü yerine while kullanılsa daha okunabilir bir kod olabilir. Sonuçta for döngüsündeki parametre kullanılmıyor.
yani bu da doğru olabilir
spoiler
def us_al(s1, s2):
if s1 == 1 and s2 == 1: return 1
elif s1 == 1 and s2 == 2: return 1
elif s1 == 1 and s2 == 3: return 1
elif s1 == 1 and s2 == 4: return 1
elif s1 == 1 and s2 == 5: return 1
elif s1 == 1 and s2 == 6: return 1
elif s1 == 1 and s2 == 7: return 1
elif s1 == 1 and s2 == 8: return 1
elif s1 == 1 and s2 == 9: return 1
elif s1 == 1 and s2 == 10: return 1
elif s1 == 2 and s2 == 1: return 2
elif s1 == 2 and s2 == 2: return 4
elif s1 == 2 and s2 == 3: return 8
elif s1 == 2 and s2 == 4: return 16
elif s1 == 2 and s2 == 5: return 32
elif s1 == 2 and s2 == 6: return 64
elif s1 == 2 and s2 == 7: return 128
elif s1 == 2 and s2 == 8: return 256
elif s1 == 2 and s2 == 9: return 512
elif s1 == 2 and s2 == 10: return 1024
elif s1 == 3 and s2 == 1: return 3
elif s1 == 3 and s2 == 2: return 9
elif s1 == 3 and s2 == 3: return 27
elif s1 == 3 and s2 == 4: return 81
elif s1 == 3 and s2 == 5: return 243
elif s1 == 3 and s2 == 6: return 729
elif s1 == 3 and s2 == 7: return 2187
elif s1 == 3 and s2 == 8: return 6561
elif s1 == 3 and s2 == 9: return 19683
elif s1 == 3 and s2 == 10: return 59049
elif s1 == 4 and s2 == 1: return 4
elif s1 == 4 and s2 == 2: return 16
elif s1 == 4 and s2 == 3: return 64
elif s1 == 4 and s2 == 4: return 256
elif s1 == 4 and s2 == 5: return 1024
elif s1 == 4 and s2 == 6: return 4096
elif s1 == 4 and s2 == 7: return 16384
elif s1 == 4 and s2 == 8: return 65536
elif s1 == 4 and s2 == 9: return 262144
elif s1 == 4 and s2 == 10: return 1048576
elif s1 == 5 and s2 == 1: return 5
elif s1 == 5 and s2 == 2: return 25
elif s1 == 5 and s2 == 3: return 125
elif s1 == 5 and s2 == 4: return 625
elif s1 == 5 and s2 == 5: return 3125
elif s1 == 5 and s2 == 6: return 15625
elif s1 == 5 and s2 == 7: return 78125
elif s1 == 5 and s2 == 8: return 390625
elif s1 == 5 and s2 == 9: return 1953125
elif s1 == 5 and s2 == 10: return 9765625
elif s1 == 6 and s2 == 1: return 6
elif s1 == 6 and s2 == 2: return 36
elif s1 == 6 and s2 == 3: return 216
elif s1 == 6 and s2 == 4: return 1296
elif s1 == 6 and s2 == 5: return 7776
elif s1 == 6 and s2 == 6: return 46656
elif s1 == 6 and s2 == 7: return 279936
elif s1 == 6 and s2 == 8: return 1679616
elif s1 == 6 and s2 == 9: return 10077696
elif s1 == 6 and s2 == 10: return 60466176
elif s1 == 7 and s2 == 1: return 7
elif s1 == 7 and s2 == 2: return 49
elif s1 == 7 and s2 == 3: return 343
elif s1 == 7 and s2 == 4: return 2401
elif s1 == 7 and s2 == 5: return 16807
elif s1 == 7 and s2 == 6: return 117649
elif s1 == 7 and s2 == 7: return 823543
elif s1 == 7 and s2 == 8: return 5764801
elif s1 == 7 and s2 == 9: return 40353607
elif s1 == 7 and s2 == 10: return 282475249
elif s1 == 8 and s2 == 1: return 8
elif s1 == 8 and s2 == 2: return 64
elif s1 == 8 and s2 == 3: return 512
elif s1 == 8 and s2 == 4: return 4096
elif s1 == 8 and s2 == 5: return 32768
elif s1 == 8 and s2 == 6: return 262144
elif s1 == 8 and s2 == 7: return 2097152
elif s1 == 8 and s2 == 8: return 16777216
elif s1 == 8 and s2 == 9: return 134217728
elif s1 == 8 and s2 == 10: return 1073741824
elif s1 == 9 and s2 == 1: return 9
elif s1 == 9 and s2 == 2: return 81
elif s1 == 9 and s2 == 3: return 729
elif s1 == 9 and s2 == 4: return 6561
elif s1 == 9 and s2 == 5: return 59049
elif s1 == 9 and s2 == 6: return 531441
elif s1 == 9 and s2 == 7: return 4782969
elif s1 == 9 and s2 == 8: return 43046721
elif s1 == 9 and s2 == 9: return 387420489
elif s1 == 9 and s2 == 10: return 3486784401
elif s1 == 10 and s2 == 1: return 10
elif s1 == 10 and s2 == 2: return 100
elif s1 == 10 and s2 == 3: return 1000
elif s1 == 10 and s2 == 4: return 10000
elif s1 == 10 and s2 == 5: return 100000
elif s1 == 10 and s2 == 6: return 1000000
elif s1 == 10 and s2 == 7: return 10000000
elif s1 == 10 and s2 == 8: return 100000000
elif s1 == 10 and s2 == 9: return 1000000000
elif s1 == 10 and s2 == 10: return 10000000000