как сделать мой код на Python более эффективным

#python #python-3.x

#питон #python-3.x

Вопрос:

в школе мне дали задание получить файл базовых математических упражнений ( ,-,*,/), и мне сказали, что мне нужно решить их с помощью python и записать ответы в новый файл, я закончил свой код и его работу, но я не думаю, что мой код так же эффективен, как учитель ожидает . я предполагаю, что между первым числом, операцией и вторым числом есть пробелы, но это не обязательно верно. Пример для вопроса. текстовый текст — 1234 12121 12 * 33 Пример для ответа. текстовый текст — 1234 12121 = 13,355 12 * 33 = 396

   ~with open(r"C:UsersשליוDesktopque.txt", 'r') as source:
    index = 0
    t = source.readlines()
    while index < len(t):
        frs = ""
        sign = ""
        sec = ""
        for chr in t[index]:
            if chr == " ":
                break
            frs  = chr 
        now = False 
        for chr in t[index]:
            if chr == " ":
                now = True
            elif now :
                sign = chr 
                break
        count = 0
        for chr in t[index]:
            if chr == " ":
                count  = 1 
            elif count == 2:
                sec  = chr
        frs = int(frs)
        sec = int(sec)
        with open(r"C:UsersשליוDesktopanswer.txt", 'a') as des:
            des.write(f"{frs} {sign} {sec} = {frs sec}n")
            index =1  
 

Комментарии:

1. Показать que.txt файл

2. можете ли вы дать больше контекста того, что вы хотите архивировать, т.Е. Входных и выходных данных

3. И покажите, каков ожидаемый результат для данного ввода.

4. Вероятно, это было бы более уместно при проверке кода

Ответ №1:

Если нет необходимости в безопасности, вы можете использовать exec, чтобы получить гораздо более короткое и простое решение.

 with open(r"C:UsersשליוDesktopque.txt", 'r') as source:
    with open(r"C:UsersשליוDesktopanswer.txt", 'a') as des:
        for equation in source.readlines():
            try:
                exec("result = "   equation)
                des.write(f"{equation.replace("n","")} = {result}n")
                print(f"calculated result {result}")
            except Exception as e:
                print(f"failed at {equation.replace("n",""} because of {e}")
        
 

Редактировать:

Версия, которую OP в конечном итоге использовал из комментария:

 def my_exec(code): 
    exec('global i; i = %s' % code) 
    global i 
    return i

def calc(): 
    with open(r"C:UsersשליוDesktopque.txt", 'r') as source: 
        with open(r"C:UsersשליוDesktopanswer.txt", 'a') as des: 
            for equation in source.readlines(): 
                result = my_exec(equation) 
                a = equation.replace("n","") 
                des.write(f"{a} = {result}n") 
 

Комментарии:

1. Извините, была опечатка в строке 6. Попробуйте еще раз 🙂 У меня это сработало.

2. ничего, код даже не пишется, я считаю, что возникает исключение, но я не уверен, какое

3. обнаружил, что код не изменяет переменную result

4. Я снова протестировал его на примерах, которые вы предоставили, и я получаю - 1234 12121 = 10887 и 12 * 33 = 396 . Я добавил для вас немного кода отладки, чтобы вы увидели, что может быть не так. Возможно, прокомментируйте ошибку, если вы получите другую.

5. я получил — NameError: имя ‘rstrip’ не определено

Ответ №2:

Вот как я бы подошел

 with open("input.txt", 'r') as source:
    for equation in source.readlines():
        frs = ""
        sign = ""
        sec = ""
        for index, char in enumerate(equation):
            if char == ' ' or char == '-' or char =='*' or char =='/':
                sign = char
                frs = int(equation[:index])
                sec = int(equation[index   1:])
                break
        # when we reach here, we would have found our operands and the operator
        ans = ""
        if char == ' ':
            ans = frs   sec
        elif char == '-':
            ans = frs - sec
        elif char == '*':
            ans = frs * sec
        elif char == '/':
            ans = frs / sec
        else:
            print("Unsupported Character:", char)
            exit()
        with open("output.txt", 'a') as des:
            des.write(f"{frs} {sign} {sec} = {ans}n")
 

Input.txt файл выглядит следующим образом:

 1234   12121
12 * 33
 

Output.txt файл выглядит следующим образом:

 1234   12121 = 13355
12 * 33 = 396
 

Комментарии:

1. я получаю — ValueError: недопустимый литерал для int() с основанием 10: ‘ 3666666666666664 n’

2. Исправлены, а также добавлены входные регистры и выходные данные, которые я получил