Yazdığım kod daha iyi nasıl olabilir

Başlığa ne yazacağımı pek bilemedim
Konu şu internette şöyle bir örnek buldum yapmak için

    Create a function that returns true if a given inequality 
expression is correct and false otherwise.

    Examples
    correct_signs("3 < 7 < 11") ➞ True

    correct_signs("13 > 44 > 33 > 1") ➞ False

    correct_signs("1 < 2 < 6 < 9 > 3") ➞ True

bunun için şöyle bir kod yazdım ama sanki daha pratik olabilir di gibi me geliyor ondan sizinde bi fikrinizi alam dedim

def correct_signs(deg):
	giris=0
	beg=0
	volumes=[]
	signs=[]
	try:
		while True:

			mi=deg.find("<",beg)
			bi=deg.find(">",beg)
#			print(mi,bi,beg)
			if bi==-1 and mi==-1 and giris==0:
				print("You should enter siign")
#				print("0")
				break
		
			elif mi<=bi and mi!=-1 and bi!=-1 :

				volumes.append(int(deg[:deg.find("<",beg)]))
				signs.append("<")
				beg=deg.find("<",beg)+1
				deg=deg[beg:]
				beg=0
#				print("1")
			elif bi<=mi and bi!=-1 and mi!=-1:
				volumes.append(int(deg[:deg.find(">",beg)]))
				signs.append(">")
				beg=deg.find(">",beg)+1
				deg=deg[beg:]
				beg=0
#				print("5")
			elif bi!=-1 and mi==-1:
				volumes.append(int(deg[:deg.find(">",beg)]))
				signs.append(">")
				beg=deg.find(">",beg)+1
				deg=deg[beg:]
				beg=0
#				print("3")
			elif mi!=-1 and bi==-1:
				volumes.append(int(deg[:deg.find("<",beg)]))
				signs.append("<")
				beg=deg.find("<",beg)+1
				deg=deg[beg:]
				beg=0
#				print("4")
			elif bi==-1 and mi==-1:
				volumes.append(int(deg))
				deg=""
				break
			giris+=1
		a=0
		b=1
		bol=True
		print(volumes)
		print(signs)
		while a<len(volumes)-1:
#			print(a,b)
			if signs[a]=="<":
				if volumes[a]<volumes[b]:
					pass
				else:
					bol=False
			elif signs[a]==">":
				if volumes[a]>volumes[b]:
					pass
				else:
					bol=False
			else:
				print("Wow")
			a+=1
			b+=1
		print(bol)
	except ValueError:
		print("There is some problem with your number")
	

correct_signs("12 < 45 > 12 < 45")
correct_signs("25<13>4846>456")
correct_signs("1181546>1563>1516<1566813")

evil kullanmaya izin var mı?

def correct_signs(deg): return eval(deg)
    

print(correct_signs("3 < 7 < 11"))
print(correct_signs("13 > 44 > 33 > 1"))
print(correct_signs("1 < 2 < 6 < 9 > 3"))

Hatta aşağıdaki kontrolu ekleyelim de, fonksiyonun evil yanını törpüleyelim.

def correct_signs(deg): 
    if all(i.isnumeric() or i in "< >." for i in deg):
        return eval(deg)
3 Beğeni

Çok mantıklı eval kullanmak benim aklıma bile gelmemişti
evil yanlarından dolayı sanırsam

1 Beğeni

Şunun gibi bir şey programa OverflowError verdirir:

>>> def correct_signs(deg): 
    if all(i.isnumeric() or i in "< >." for i in deg):
        return eval(deg)

>>> import sys
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(1<<10)
28
>>> sys.getsizeof(1<<100)
40
>>> sys.getsizeof(1<<1000)
160
>>> correct_sign("1<<999999999999999999999999999999999999999999999")
3 Beğeni

evil nedir? O eval degilmi?

Mizah yapılmış:
https://www.google.com/search?q=çeviri+evil&oq=çeviri+evil

1 Beğeni

Şöyle bir kod hem daha modüler hem de daha okunaklı olur:

class Parser():

    def __init__(self, text):
        self.text = text
        self.index = 0
        self.state = "number"

    def _cmp(self, c1, c2, o):
        if o == "<":
            return c1 < c2
        elif o == ">":
            return c1 > c2

    def eval(self):
        first = self.next_token()
        operator = self.next_token()
        second = self.next_token()
        while True:
            try:
                if not self._cmp(first, second, operator):
                    return False
                first = second
                operator = self.next_token()
                second = self.next_token()
            except EOFError:
                break
            
        return True

    def next_token(self):
        try:
            self.pass_spaces()
            if self.state == "number":
                self.state = "operand"
                return self.get_integer()
            elif self.state == "operand":
                self.state = "number"
                return self.get_operand()
        except IndexError:
            if self.state == "operand":
                raise EOFError()
            else:
                raise SyntaxError("Unexpected EOF.")
            
        
    def pass_spaces(self):
        while self.text[self.index] == " ":
            self.index += 1

    def get_integer(self):
        s = ""
        try:
            while self.text[self.index].isnumeric():
                s += self.text[self.index]
                self.index += 1
        except IndexError:
            pass
        if s:
            return int(s)
        else:
            raise SyntaxError(f"Invalid char at {self.index}: {self.text[self.index]!r}")
    

    def get_operand(self):
        if self.text[self.index] in ("<", ">"):
            self.index += 1
            return self.text[self.index -1]
        else:
            raise SyntaxError(f"Invalid char at {self.index}: {self.text[self.index]!r}")

def evaluate(text):
    return Parser(text).eval()

assert evaluate("3 < 7 < 11") == True
assert evaluate("13 > 44 > 33 > 1") == False
assert evaluate("1 < 2 < 6 < 9 > 3") == True
2 Beğeni

Ben olsam once tokenize edip integer’lari parse eden bir fonksiyon yazardim:

"1 < 2 < 6 < 9 > 3"[1, LT, 2, LT, 6, LT, 9, GT, 3]
veya → [1, '<', 2, '<', 6, '<', 9, '>', 3]

Sonra bunlari alip ikili ifadelere ceviren bir tane:

[1, '<', 3, '>', 5][[1, '<', 3], [3, '>', 5]]

Sonra ikili ifade cozen bir tane:

[1, '<', 3]True
[3, '>', 5]False

Cozum: all(map(evaluateBinaryExpression, toBinaryExpressions(tokenizeAndParseInt(expr))))

2 Beğeni

Hocam senin ki benim için fazla düzenli olmuş birde sorumsu şeyde fonksiyon dedi diye sınıf olşturmadı idim ama ben hiç bitürlü bu kadan düzenli yazamazdım

Sizin ki de çok mantıklı öyle bir şey yazmayı denicem