Python'da kare işlemi

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
2 Beğeni

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))
1 Beğeni

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.

1 Beğeni

ellerine saglik reis cok guzel olmus tak diye cozdun valla :clap:


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 :worried:

2 Beğeni

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)
)
2 Beğeni
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…

1 Beğeni

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.

3 Beğeni

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

1 Beğeni

sadece sordum yani merak ettim

1 Beğeni

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
1 Beğeni