Forum sayesinde ben de lambda kullanmaya başlamak istedim. Otomatik bulmaca hazırlayan bir program yazmaya başladım.
class Kelime():
karakterler = list("abcçdefgğhıijklmnoöprsştuüzvyz1234567890- ")
kelimeler = []
def __init__(self,kelime):
Kelime.kelimeler+=kelime
###################################
self.kelime = kelime
self.ayristirilmis = {}
###################################
self._ayristir()
def _ayristir(self): #Kelimenin içinde bulunan harfleri bul.
for i in list(self.kelime):
for j in Kelime.karakterler:
if (i == j):
if (i in self.ayristirilmis):
self.ayristirilmis[i] = self.ayristirilmis[i]+1
else:
self.ayristirilmis[i] = 1
class Bulmaca():
def __init__(self,kelimelistesi):
self.kelimelistesi = kelimelistesi
self.kelimeler = []
####################################
self.olustur()
def olustur(self):
self.kelimeler += [Kelime(i) for i in self.kelimelistesi]
print(self.kelimeler)
k = ["merhaba","ahali","elma"]
Bulmaca(k)
_ayristirfonksiyonunu lambda olarak yazmak istiyorum birkaç deneme yaptım ama sanırım bilmem gereken fazladan şeyler var.
Verilen kelimenin içindeki harfleri teke indirmeye çalışıyorum. Örneğin araba kelimesi verildiği zaman a r b çıktısını istiyorum. Kümeleri kullanmam daha doğru olabilir galiba.
map(self.ayristirilmis.add,[i for i in self.kelime])
self.ayristirilmis varsayılan olarak dict şeklinde tanımlanıyor, dict objesinin add isminde bir fonksiyonu yok, eğer self.ayristirilmis = set() şeklinde tanımlarsanız çalışacaktır kodunuz.
map(self.ayristirilmis.add, self.kelimeler) de iş görür bu arada, sonuçta self.kelimeler de bir iterable.
Cunku maptembel. Fonksiyonel programlama yaparken yan etkili fonksiyonlar kullanilmamali; self.ayristirilmis.add sadece yan etkisi icin kullanildigi icin sonucu ve haliyle map’in sonucu kullanilmamis. list(map(...)) calisiyor.
[i for i in self.kelime] ile self.kelime’nin hic bir farki olmamasi lazim. Bu kodda olmadigi kesin.
Bu arada ayristirmanin amaci bazi harfleri ayiklamak oldugu icin her elemani baska bir elemana ceviren map fonksiyonu bu is icin uygun degil. Dogrusu reduce:
import functools as ft
ayristir = lambda kelime: ft.reduce(lambda harfler, harf: harfler if harf in harfler else harfler + [harf], kelime, [])
#ayristir = lambda kelime: ft.reduce(lambda hs, h: hs if h in hs else hs + [h], kelime, [])
print(ayristir("araba"))
def reduce(string):
return [
item for index, item in enumerate(string)
if all(
not previous.startswith(item)
and not item.startswith(previous)
for previous in string[:index]
)
]
print(reduce("araba"))
Akis ters. Yazarken ya once durumu dusunup sonra degerleri belirliyoruz, ya da once degerleri dusunup sonra durumu belirliyoruz. Siralama ikisine de uymuyor.
Mevcut butun dillere ters gidip alisinca baska dilleri kullanmayi zorlastiracak idiosenkrasilerden biri oldugu gercegi de var.
@Emerald_Gamer inline if kullanmaktan degil inline if’in Python’daki tersliginden bahsediyoruz.