Basit Bir Komut Yorumlayıcısı Yazmaya Çalışıyorum

while True:
    secim = input(">")
    if secim[0:3] == "yazdır":
        print(secim[4:])

Merhaba, ben kodda bir hata göremedim ama çalışmıyor?

while True:
    secim = input(">")

    print(secim[0:3]) # Kendisi, en basit hata ayıklama yöntemidir.

    if secim[0:3] == "yazdır":
        print(secim[4:])
3 Beğeni

Hocam sorun sanırım şu ki;
secim[0:3] ile siz girilenin sadece ilk üç harfini istiyorsunuz. Dolayısıyla altı harfli olan “Yazdır” kelimesine eşit olması imkansız bir durum.

while True:
    secim = input(">")
    if secim[0:3:1] == "Yaz":
        print(secim[4:])

peki hernagi bir kelime için o kelimenin uzunluğu yazmadan yapabilir miyiz?

Karakter veri tipine sahip değişkenleri karşılaştırmak istiyorsanız şunları yapabilirsiniz,

  1. Değişkenleri doğrudan karşılaştırın,
secim = input("Seçim: ")
komut = "yazdır"
if komut == secim:
    # ...
if komut is secim:
    # ...
  1. Değişkenlerin belirli kısımlarını karşılaştırın,
secim = input("Seçim: ")
komut = "yazdır"
if secim[0:6] == komut:
    # ...
  1. Değişkenlerin uzunluğuna bakılmaksızın karşılaştırma yapın,
secim = input("Seçim: ")
komut = "yazdır"
if komut in secim:
    # ...

Yazarken keyif aldığım için biraz fazla geliştirmiş olabilirim ama, işte basit bir komut yorumlayıcısı:

#!/usr/bin/env python3
# -*- coding:UTF-8 -*-


def yazdır(*metin):
    print("Metin:", *metin)


commands = {
    "yazdır1": print,
    "yazdır2": yazdır,
    "yazdır3": lambda *metin: print(*metin),
    "topla": lambda x, y: print(x + y),
    "çıkar": lambda x, y: print(x - y)
}


if __name__ == "__main__":
    while True:
        line = input("> ").split()
        command = line[0]
        args = line[1:]

        if command in commands.keys():
            try:
                commands[command](*args)

            except Exception as error:
                print("Error:", error)

        else:
            print(f"Error: '{command}' is not a valid command.")

Buradaki olay şu:

  • Komutlar, bir sözlükte(dict) saklanır.
  • Sözlüğün anahtarları(keys), komutların adlarıdır ve bunlar ile çağrılırlar.
  • Sözlüğün değerleri(values) ise komutların çağıracakları fonksiyonların referanslarıdır(lambda'lar bu sebeple kullanılır).
  • line = input("> ").split() satırında, girilen değer boşluk( ) karakterlerinden ayrılarak bir listeye dönüştürülür.
  • Sonraki iki satırda ise line listesinin ilk değeri command'a geriye kalanalar ise args'a atanır.
  • Son önemli kısım ise komutları çalıştırmak: commands[command](*args). Burada args'ın başında * olmasının sebebi ise bir liste olan args'ı tek tek elemanlarına ayırmak.

Başka kodlardan da ilham almak isterseniz şuraya bakabilirsiniz:

Son olarak, bu yazdığım kod ve anlatıklarımla kalırsanız, sadece veri depolamaya yarayan bir USB bellekten öteye geçemezsiniz. Eğer yarınki Python bilginiz bugünden daha iyi olsun istiyorsanız bu verileri işleyip geliştirmelisiniz.

1 Beğeni

size gerçekten çok teşekkür ederim bana yapacağım çekirdek için ilham verdiniz

:information_source:   Burada işletim sistemi çekirdeğini kast ettiğinizi varsayıyorum.

Ney?! aman! Hayır benim öyle bir niyetim yoktu. Ben sadece çeşitli projelerde kullanılabilecek iki basit komut yorumlayıcısı örneği verdim ve birini de açıkladım. Ayrıca çekirdek(kernel) ve kabuk(shell) birbirinden tamamen farklı şeylerdir(Bakınız: https://linux-dersleri.github.io/docs/temel_linux/3.html#shell).

İşletim sistemi çekirdeği yazmanın ne kadar karmaşık ve zor olduğunu anlatmakla bitiremem. Eğer ki bir çekirdeği nasıl yazabileceğinizi planlayamıyorsanız hiç bulaşmayın. “Yok ben yine de yazacağım” diyorsanız önce en büyük rakibinizi biraz yakından tanıyın derim:

Bakın, hiçbir zaman caydırmak, göz korkutmak ya da heves kırmak gibi bir niyetim olmadı, olmayacak; ben, “Kervan yolda düzülür” deyip de, bir yandan plan yapmaya bir yandan da yazmaya çalışıp vaktinizi boşa harcamayın diye söylüyorum bunları. Yoksa yapacağınız işi küçük görerek büyük bir heves ile başlarsanız, daha büyük bir hayal kırıklığına uğrarsınız.

Saygılarımla…

2 Beğeni

hayır ben öyle birşeyden bahsetmiyorum ben bir shell üzerinde çalışıyorum ama yinede anlattıklarınız için saolun :smiley: