🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ Alireza Maleki
نوشتن تابع eval
جامعه پایتون (وب) ایجاد شده در ۲۰ شهریور ۱۴۰۲

سلام روزتون بخیر

من تابع eval رو نوشتم اما باگی که داره اینه وقتی پرانتزی درون پرانتز دیگریه خطا می‌ده و ایده‌ای ندارم که باید چیکار کنم

اگر ایده‌ای دارید خوشحال می‌شم کمکم کنید وگرنه همین رو به عنوان نکته آموزشی درون سایت قرار می‌دم

'''
bayad bein adad va parantez amaliat riazi bashe
tavan va radikal ro in kod poshtibani nemikone
bugi ke dare ine parantezi daroon parntez dige bashe be moshkel bar mikhore 
'''
ebarat_string = input("Please Enter ... \\n")
print(eval(ebarat_string))
ebarat_string = ebarat_string + '.' # to khat 15 ta 40 baray jelogiry as yek bag mishe va adad akhar ham be list e ezafe mishe
def joda_sazi (ebarat_string):
    ebarat_joda_shode = list()
    for i in ebarat_string: #kol string ra joda mikone
        ebarat_joda_shode += i
    return ebarat_joda_shode
        
def chasbondan_adad(ebarat_joda_shode):   
    list_ebarat = list()
    d = str()
    
    for i in ebarat_joda_shode: #adad ra be ham michasbone
        if i.isalnum():
            d = d+i
               
        else:
        
            list_ebarat.append(d)
            d = ''
        
            if i == '(':
                list_ebarat.append('(')
        
            elif i == ')':
                list_ebarat.append(')')
        
            elif i == '*':
                list_ebarat.append('*')
        
            elif i == '/':
                list_ebarat.append('/')
        
            elif i == '+':
                list_ebarat.append('+')
        
            elif i == '-':
                list_ebarat.append('-')
                
    for i in range(list_ebarat.count('') ):# string khali hay ezafi ke niazi be anha nadarim ra pak mikonad
        list_ebarat.remove('')
        
    return list_ebarat
def amaliat_ha (list_ebarat):
    
    while list_ebarat.count('*') != 0:
                
        jaygah_alamat_amaliat = list_ebarat.index('*')
        amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) * (float(list_ebarat[jaygah_alamat_amaliat + 1]))      
        
        list_ebarat.pop(list_ebarat.index('*') -1)
        list_ebarat.pop(list_ebarat.index('*') +1)
        list_ebarat.pop(list_ebarat.index('*'))
        list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
        
    while list_ebarat.count('/') != 0:
                
        jaygah_alamat_amaliat = list_ebarat.index('/')
        amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) / (float(list_ebarat[jaygah_alamat_amaliat + 1]))    
        
        list_ebarat.pop(list_ebarat.index('/') -1)
        list_ebarat.pop(list_ebarat.index('/') +1)
        list_ebarat.pop(list_ebarat.index('/'))
        list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
        
    while list_ebarat.count('+') != 0:
                
        jaygah_alamat_amaliat = list_ebarat.index('+')
        amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) + (float(list_ebarat[jaygah_alamat_amaliat + 1])) 
        
        list_ebarat.pop(list_ebarat.index('+') -1)
        list_ebarat.pop(list_ebarat.index('+') +1)
        list_ebarat.pop(list_ebarat.index('+'))
        list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
        
    while list_ebarat.count('-') != 0:
                
        jaygah_alamat_amaliat = list_ebarat.index('-')
        amaliat_adad = (float(list_ebarat[jaygah_alamat_amaliat - 1])) - (float(list_ebarat[jaygah_alamat_amaliat + 1]))       
        
        list_ebarat.pop(list_ebarat.index('-') -1)
        list_ebarat.pop(list_ebarat.index('-') +1)
        list_ebarat.pop(list_ebarat.index('-'))
        list_ebarat.insert((jaygah_alamat_amaliat - 1) ,amaliat_adad )
    
    return list_ebarat
    
def parantez (list_check): #baray mohasebe dakhle parantez
        
    list_check = list_check[list_check.index('(') : list_check.index(')') + 1] 
    
    if list_check.count('(') > 1 :
            return parantez
        
    else:
    
       list_check = amaliat_ha(list_check)
       
       list_check.remove('(')
       list_check.remove(')')
       
       adad_akhar_parantez = list_check.pop()
            
       return(adad_akhar_parantez)
   
def mohasebe(ebarat_string): #mohasbe akhar 
    
    
    list_ebarat = (chasbondan_adad(joda_sazi(ebarat_string)))
    
    tedad_parantez = list_ebarat.count('(')
    i = 0 
    
    while i < tedad_parantez :
        
        adad_jay_gozari = parantez(list_ebarat)
        
        while (list_ebarat.index('(') + 1) != list_ebarat.index(')'):
            list_ebarat.pop(list_ebarat.index('(') + 1)
            
        list_ebarat.insert(list_ebarat.index('('), adad_jay_gozari)
        list_ebarat.remove('(')
        list_ebarat.remove(')')
        
        i += 1
        
    list_ebarat = amaliat_ha(list_ebarat)
    
    javab_akhar = list_ebarat.pop()
    
    return javab_akhar
               
                
print(mohasebe(ebarat_string))

درود

تابع eval کجاست؟ شما فقط فراخوانی رو نوشتید خود تابع نیست ?

نازنین کریمی مقدم ۲۰ شهریور ۱۴۰۲، ۱۹:۰۸

در این ویدیو استاد فرمودن به عنوان تمرین فرض کنیم eval وجود ندارد. و ما با خلاقیت خودمان اسکریپتی بنویسیم که کار eval را انجام بده بنویسیم

در خط دوم

eval

را فراخوانی کردم تا نشون بدم اسکریپتی که نوشتم درست کار می‌کنه و جواب رو بتونید مقایسه کنید

تنها مشکل این اسکریپت اینه که وقتی پرانتزی درون پرانتز دیگه است به مشکل بر میخوره ایده ای واسه این مشکل می‌خواستم

نکته

2(3+4)(5-2)

ننویسید چون باید علامت بین عدد و پرانتز باشه و به جاش

2*(3+4)*(5-2)

رو بنویسید

این رو خودم درستش می‌کنم اما شما لطف کنین تو مشکل پرانتز کمکم کنید مثل

(2*(3+5)-(4+1))+1

Alireza Maleki ۲۱ شهریور ۱۴۰۲، ۱۶:۱۷

بنده تصور کردم منظورتون اینه که همچنین (()) چیزی رو خطا میگیره، الان با توضیحاتتون متوجه شدم.

بله حق با شماست این حالت در کل زبانهای برنامه نویسی خطا داره. کلا مفسر سیستم این رو نمیفهمه.

این تاپیک رو به صورت نکته آموزشی درمیارم. سپاس از همراهی تون

بهترین پاسخ
نازنین کریمی مقدم ۲۲ شهریور ۱۴۰۲، ۰۵:۲۷

تشکر از پاسخ شما??

Alireza Maleki ۲۲ شهریور ۱۴۰۲، ۱۹:۱۵