Listedeki Matematiksel İşlemlerle İşlem Yapmak

Merhaba. Direkt soruya geçeceğim. Liste içine bu operatörleri tanımladım: operations = [’+’, ‘-’, ‘/’, ‘’, ‘**’, '(1/2)’]. Basitçe bu listeden ‘+’ işaretini alıp nasıl iki sayı arasına yerleştirerek işlem yapmasını sağlarım? Yerleştirme kısmında sorun yaşamıyorum ama herhangi bir sayı olmadıkları için tür dönüşümünde sıkıntı yaşıyorum. + işaretini int’e dönüştüremezsin diyor mantıken.

Eval, exec fonksiyonları işinizi görür.

Şöyle yapacaksınız:

operations = ...
sayı1 = 2
sayı2 = 3
deyim = str(sayı1) + operations[0] + str(sayı2)
sonuç = eval(deyim)

Tabii eval'i kullanırken dikkatli olun, zira tehlikeli bir fonksiyondur. Eğer sayıları dışarıdan alıyorsanız, eval'i kullanmadan önce bunların sayı olduğunu kontrol etmelisiniz. Kullanıcı farklı ifadeler vererek programınızda zararlı eylemler yapmaya kalkışabilir.

Eğer oluşacak deyimler çok karmaşık değilse, bunun yerine nesneye yönelik ya da fonksiyonel bir yaklaşımı benimsemenizi öneririm. Örneğin şöyle olabilir:

def topla(sayı1, sayı2):
    return sayı1 + sayı2
...
# Aşağıdakiler tanımlı fonksiyonlardır.
operations = [topla, çıkar, böl, çarp, ...]
sayı1 = 2
sayı2 = 3
sonuç = operations[0](sayı1, sayı2)

Ya da şöyle:

class Toplayıcı:
    def __init__(self, sayı1, sayı2):
        self.sayı1 = sayı1
        self.sayı2 = sayı2

    def sonuç(self):
        return self.sayı1 + self.sayı2
...
# Aşağıdakiler tanımlı sınıflardır.
operations = [Toplayıcı, Çıkar, Bölücü, Çarpıcı, ...]
sayı1 = 2
sayı2 = 3
sonuç = operations[0](sayı1, sayı2).sonuç()
1 Beğeni

Kullanıcı zararlı bir eylemde bulunursa kendi bilgisayarına zarar vermez mi?
Bunu niye yapsın ki?

1 Beğeni

Yani program bir web sunucusuna yüklüyse mesela __import__('os').listdir() komutu ile sunucudaki bütün verilere erişebilir. Ya da programda şifreli bir veritabanı varsa decode edebilir vesaire.

1 Beğeni

İyi ama sunucuda bu fonksiyon kullanılırsa zaten kimse bilemez ki. Bunu bilen de zaten diğer her şeye erişim sağlayabilen biridir.

Amacım polemiğe girmek değil sadece bu mevzunun derinlerine inmek.

1 Beğeni

Profesyonel bir hacker bunu anlar. Yazılımı önce dıştan tahrik eder, açıklarını arar. Exec veya eval kullanılabileceğini düşündüğü veri girişlerini kontrol eder. Kontrol sistemi varsa kendine başka açık arar. İşte yazılım böyle bir şey . . .

@reo’in söylediklerine ek olarak şunları söyleyebilirim: Güvenlik tarama araçları yazılımların güvenliğini test etmek için kullanılır ama aynı zamanda zayıflıklarını bulup bunları kötü amaçlarla kullanmak için de kullanılabilir. Yani bir bilgisayar korsanının zayıflıkları bilmesi ya da bunları eliyle tek tek araması gerekmez; bu tür otomatikleştirme programları yeterli olur.

2 Beğeni

Buna “security through obscurity” (gizlilikten dogan guvenlik?) deniyor; derine inerken arastirmak isteyebileceginiz bir baslik.

1 Beğeni

Eval falan kullanmadan şöyle de yapılabilir, tabii işlem önceliği evaldan biraz farklı olur:

import operator

işleçler = {"+":operator.add, "-":operator.sub, "/":operator.truediv, "*":operator.mul, "**":operator.pow}

işlem_listesi = ["+","-","*"]

sayılar = [10, 2, 5]
sonuç = 0
for işlem, sayı in zip(işlem_listesi, sayılar):
    sonuç = işleçler[işlem](sonuç, sayı)

print(sonuç)

Bütün işleçler için:
https://docs.python.org/3/library/operator.html#mapping-operators-to-functions