Python ile Kuş Dili Çevirici Yapmak

Merhaba.pythonla kus dili cevirici yapmak istiyorum.ama bir turlu yapamiyorum.soyle olsun istiyorum:merhaba yazinca megerhagabaga,megerhagabaga yazinca ise merhaba olarak cevirecek.algoritmasini aklimda kurdum ama koda donusturemiyorum.Yardim ederseniz sevinirim.

Merhaba.

Tek yapacağınız a harflerini aga, e harflerini de ege yapmak mı?

Evet.oyle olmasini istiyorum ama yapamiyorum

Şu metod işinizi görür:
https://python-istihza.yazbel.com/karakter_dizilerinin_metotlari1.html#replace

1 Beğeni

Cevabiniz icin tesekkur ederim bakiyorum simdi

Aslında onu kullanmanın yanında şöyle bir kod görmek de algoritma konusunda size yardım edebilir:

kelime = "merhaba"

çıktı = ""
for harf in kelime:
    if harf == "a":
        çıktı += "aga"
    elif harf == "e":
        çıktı += "ege"
    else:
        çıktı += harf

print(çıktı)
    
2 Beğeni

Tesekkur ederim sayenizde aklima takilan bir soru daha cozuldu☺

1 Beğeni
while True:
    try:
        text = input("KuşDili> ").lower()
    except KeyboardInterrupt:
        exit()
    text = list(text)
    
    for i, a in enumerate(text):
        if a == "e":
            text[i] = "ege"
        
        elif a == "a":
            text[i] = "aga"
        
        elif a == "i":
            text[i] = "igi"
        
        elif a == "ö":
            text[i] = "ögö"
        
        elif a == "u":
            text[i] = "ugu"
        
        elif a == "ü":
            text[i] = "ügü"
        
        elif a == "ı":
            text[i] = "ıgı"
    res = ""
    for i in text:
        res += i
    print(res)

Sonuç.

Ama tabi bununla daha basit olur.

Koşullu durumları lütfen bu tarz işlemler için kullanmayın.

kus_language = {"a":"aga","b":"ege"}

translated = ""

text_which_given_user = str(input("İnsert a text:"))

for l in text_which_given_user:
    translated += kus_language[l]

print("translated to kus language: {}".format(translated))

#Output;

Insert a text: ab

translated to kus language: agaege

Kuş dili kısmına gerekli key-value ilişkilerini ekleyerek istediğinizi elde edebilirsiniz.

1 Beğeni

Ne tarz?
8 tane sesli var zaten, artmayacagi icin sorun degil. dict kullanimi cok daha okunakli tabi, o ayri.

Bu son kodda da butun karakterleri kus_language'a girmek gerekiyor, o daha beter. Olmayan karakterlerin oldugu gibi gecmesi lazim.

3 Beğeni

Eğer kendi yazdığın program içerisinde tanımlanan karakterlerin karşılığı yoksa bu senin sorunun.

Bunun için gerekli Error’ü yükseltmekte senin görevin.

Daha okunaklı olması ile alakası yok gelen karakteri tek tek neden değerlendireyim ?

C gibi bir programlama dilinde kod yazmıyoruz.

Tartışma yaratmak istemem burayı okumadan yorum yapmayın.

Olduğu gibi geçmesi gerekiyor demişsiniz kuş dili diye bir mevzu kalmaz o zaman.

Türkçe-Kuşdili karışımı bir dil yaratacağım diyorsanız orası ayrı.

++
Eklemek gerekirse yukarıda yazılan kod içerisinde bir if satırı bulunmakta else yapısı bulunmuyor.
Koyulması gerekmez fakat.

The golden rule: put it in if it makes your code clearer and easier to understand, and leave it out

kus_language.get metoduna 2 parametre olarak da l yollarız.

Aslında time complexity’nin O(1)'e yakın olması ve okunaklı olması ile alakalı. Eğer okunaklılık veya performans açısından bir değişim yoksa gelen karakteri neden teker teker değerlendirmeyelim? Bunun eksisi ne?

Ne alakası var anlamadım, C’de de map gibi bir veri tipi oluşturulabilir.

Yanlış anlamışsınız, kodunuza i gibi bir giriş yapılırsa kodun ne yapması gerektiği söylenmiş. Şu anda hata veriyor mesela.

Daha önceden de aşağıda yazdığım gibi(okumamışsınız) gerekli işlemleri siz yapabilirsiniz.

Ben eklemedim sadece “a” ve “b” içeriyor.

Alınacak hata “KeyError” olacaktır. Hatayı kendiniz yakalayabilir cevabı elde edebilirsiniz.

Performans açısından değişiklik olup olmaması kodun değiştirilmiyeceği anlamına gelmez.

Daha önceden de linki yolladım. Public edilecek kodlar için belirli standartlar mevcut.

Bu standartlara uymasını istediğimiz için performans da değişiklik olmasa bile değiştirmelisiniz.

Ayriyetten acemi olduğunuz için açıklama gereği hissettim:

Python içerisinde “map()” bir veri tipi değil fonksiyondur.

Bu fonksiyonu oluştururken gelen değerleri teker teker incelemek zorunda kalacaksın.

Bunu sana otomatik olarak yapan bir işlem varken neden tekrar tek tek inceleyelim.

Bahsettiğiniz hatanın çözümü de aşırı derecesinde basit.

kus_language = {"a":"aga","b":"ege"}

translated = ""

text_which_given_user = str(input("İnsert a text:"))

for l in text_which_given_user:
    try:
        translated += kus_language[l]
    except KeyError:
        translated += l

print("translated to kus language: {}".format(translated))

Hatayı yakalamasını beklemeyerek de bu sorunun çözümünü elde edebilirsiniz.

Fena fikirler icermemekle birlikte Python’da yazilan kod konusunda mutlak otorite degil (cok sukur). Cogunlukla stil guide’i oldugu icin de eksik kaldigi cok yer var: Ornegin, kodun farkli isler yapan parcalarinin birbirinden bagimsiz fonksiyonlar halinde yazilmasi gerektigini soylememis. Veya degisken tanimlamalarinin/ilklendirmelerinin kullanilan yere yakin olmasinin iyi olacagini.

Olayi da anlatamamisim, soyle izah edeyim:

Olmasi gereken sekiz (ve sadece sekiz) durumun 7’sini kapsayan if bloguna kotu stil deyip alternatif olarak bu durumlarin sadece 2’sini kapsayan bir kod gostermek dogru degil. Bu alternatif kod butun harfleri bir map’te bulmayi bekliyordu ve kullanilabilir hale gelmek icin { "a": "aga", "b": "b", "c": "c", "ç": "ç", ..., " ": " ", ".": ".", "!": "!" } gibi kocaman bir dict’e ihtiyaci vardi.

Olmamasi lazim cunku Unicode’da 143,859 karakter var ve her gecen gun artiyor. Duz yazi ↔ kus dili cevrimindeki normal durumun karakterlerin degismeden gecmesi olmasi lazim.

Mecbur oldugun icin:

Herhangi bir cozum olarak mi, yoksa sirf if kullanmamak icin mi? Herhangi bir cozumse okey. if c in KUS_TRANSLATED_CHARS: ile kiyasliyorsak kanimca if daha iyi cunku karakterlerin cogunlugunun map’te bulunmamasini bekliyoruz. Get-with-default’un okunaklilik avantaji sadece default parametresi sabit oldugunda var.

Bilgisayar bilimlerindeki “map” bir setin bazi elemanlarini baska bir setin bazi elemanlarina baglama islemi (fiil) veya bu baglantilari tutan bir veri turu (isim). Tur Python’da dict’e tekabul ediyor. (Fakat islemin ?: zincirleri ve yan etkisiz fonksiyonlar gibi baska sekillerde yapilabildigine de dikkat cekmek isterim.)

“dict” yerine kullanmak benim hatam; iletisim bozukluguna yol acmis.

1 Beğeni

Açıklamalar için teşekkür ederim.

Lütfen şurayı izah edeyim ben dict içerisine örnek olması açısından iki adet key-value tanımladım.

Kodun hepsini yazmadım bunu söyledim.

Pep-8’i atmanın sebebi ise kodun ne kadar okunabilir olursa o kadar iyi olduğundan söz ediyor.

Map() durumuna gelirsek zaten belirttiğim gibi Python içerisinde bir fonksiyon olduğunu söylemiştim.

Güzel bir tartışma olduğunu düşünüyorum. Bu tarz tartışmalar forumdaki insanları ve insanın kendisini de geliştirir.

Bu arada acemi lafını size kullanmadım.

Bir şey daha eklemek istiyorum:

Neden dict içerisine tüm değerleri tanımlayalım ki ?
Eğer dict içerisinde tanımlanan değer yoksa normal ekle şeklinde bir blok işimizi görür anlayamadım orayı.

For kısmını atmışsiniz tek tek değerlendirmekten kasıt o değildi. Ben for ile bunu döngüye alıyorum. Bunu zaten iki kod da yapıyor. Bunun üzerine olarak her gelen değeri if-elif bloguna sokmuş.

Telefon üzerinden cevap yazıyorum. Noktalama işareti hataları v.s olabilir kusura bakmayın.

Herhangi bir çözüm olarak.

O benim hatam oluyor.

Evet, ben de bir çözümden bahsettim zaten.

Python içerisinde map() hiçbir şey değildir ama map bir fonksiyondur. @aib benim map ile ne kastettiğimi söylemiş zaten.

def translate(s: str, d: dict):
    return "".join(list(map(lambda i: d[i] if i in d else "", s)))

Örnek:

KUS_DILI = {"a": "aga", "b": "ege"}
print(translate("abcdef", KUS_DILI))

Not 1: Bence dict içerisinde bütün harfler ve bunların kuş dilinde karşılığı olan ifadeler sabit olarak tanımlanmalı. Ondan sonra çeviri işlemine geçilmeli.

Not 2: Yok, ben sabit sözlük kullanmayacağım, kuş dilinde karşılığı olmayan harfleri çeviri esnasında tanımlamak istiyorum diyorsanız, o zaman da şöyle bir yol izlenebilir.

def add(c: str, d: dict):
    d[c] = input(f"{c} harfinin kuş dilindeki karşılığı: ")
    return d[c]


def translate(s: str, d: dict):
    return "".join(list(map(lambda i: d[i] if i in d else add(i, d), s)))


KUS_DILI = {}
print(translate("abcdef", KUS_DILI))
print(translate("abcdef", KUS_DILI))

Benim yanlis anladiklarimdan bir tanesi de if {harfin translate edilmesi lazim} kullanmak yerine butun harflerin map’e girilmesinin savunulmasiydi. Bunun gereksiz olacagi konusunda herkes hemfikirmis, sorun yok :slight_smile: