Fonksiyonu lambda olarak yazmak

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.

Ayrıştır fonksiyonuyla tam olarak ne yapmaya çalışıyorsunuz? Kodlar biraz tuhaf geldi de.

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])
print(self.ayristirilmis)

şeklinde bir şey denedim ama sonuç alamadım.

O halde set kullanabilirsiniz,

>>> set('araba')
{'a', 'b', 'r'}
class set(object)
 |  set() -> new empty set object
 |  set(iterable) -> new set object
 |
 |  Build an unordered collection of unique elements.
1 Beğeni
class Kelime():
    karakterler = list("abcçdefgğhıijklmnoöprsştuüzvyz1234567890- ")
    kelimeler = []
    def __init__(self,kelime):
        Kelime.kelimeler+=kelime.lower()
        ###################################
        self.kelime = kelime.lower()
        self.ayristirilmis = set(self.kelime)
        ##################################

sınıf bu şekilde güncelledim. İstediğim şeyi yapıyor.
Ama map(self.ayristirilmis.add,[i for i in self.kelime]) neden çalışmıyor?

(...)
        self.ayristirilmis = {}
(...)

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 map tembel. 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"))

Python’in ters if’inden tekrar tiksindim.

2 Beğeni

Şu da olur:

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

Ters if ne oluyor?

Conditional Expressions

1 Beğeni
x = true_value if condition else false_value

Bunda kötü bir şey mi var?

Bence kötü bir şey yok sadece okunabilir ligi azaltıyor bence ama kodu da kısaltıyor aynı zamanda

{bir ihitmalle kullanilacak deger} if {kullanilacak degeri belirleyen kritik durum} else {bir ihtimalle kullanilacak deger}

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.

4 Beğeni