Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- #encoding: utf-8
- ''' импортировать библиотеку sys'''
- import sys
- # sysenc=sys.stdout.encoding
- ''' проверка версии Python '''
- if sys.version_info[0] < 3:
- '''
- если версия Питона меньше 3, то определить функицю c параметрами:
- str строка, которую преобразовывают
- newline - определяет нужно ли добавлять символ '\n' к строке
- fflush - определяет нужно ли очистить буфер
- '''
- def eprint(str, newline=True, flush=False):
- if newline: # если newline равна True
- str += "\n" # выводить на новую строку
- sys.stdout.write(str.decode('utf-8')) # вывести строку
- if flush: ''' если flush равна False'''
- sys.stdout.flush() # очистить буффер
- else:
- '''
- если версия Питона больше или равна 3, то определить функицю c параметрами:
- str строка, которую преобразовывают
- newline - определяет нужно ли добавлять символ '\n' к строке
- fflush - определяет нужно ли очистить буфер
- '''
- def eprint(str, newline=True, flush=False):
- if newline:
- str += "\n"
- sys.stdout.write(str)
- if flush:
- sys.stdout.flush()
- ''' блок для импортирования библиотеки sympy и обработки исключений (если не импортировали) '''
- try:
- from sympy import * # импорт библиотеки
- except Exception as ex:
- ''' вывод сообщений, если произошла исключительная ситуация '''
- eprint("Не удалось импортировать библиотеку sympy(" + str(ex) + ")")
- eprint("возможно она не установлена.")
- eprint("Установить её можно командой: pip install sympy")
- sys.exit(1) # выйти из программы
- ''' блок для импортирования библиотеки sympy и обработки исключений (если не импортировали) '''
- try:
- ''' импорт библиотек'''
- import threading
- import itertools
- from contextlib import contextmanager
- except:
- ''' обработка исключения, объявляем класс с методами __enter__ и __exit__'''
- class Spinner(object):
- def __enter__(self):
- return self
- def __exit__(self, type, value, traceback):
- pass
- else:
- ''' объявляем контекстный менеджер '''
- @contextmanager
- def printremove(ch):
- eprint(ch, False, True) # вызов функции eprint
- try:
- yield ch # возвращаем элемент ch
- finally: # finally выполняет блок инструкций в любом случае, было ли исключение, или нет
- eprint('\b \b', False, True)
- ''' Объявляем класс, реализующий код потока, наследник класса Thread'''
- class Spinner(threading.Thread):
- # метод конструктор, вызывается при создании объекта класс
- def __init__(self):
- ''' определение свойств класса'''
- self.chars = itertools.cycle(['-', '/', '|', '\\']) # создниеие итератора для цикла
- threading.Thread.__init__(self) # конструктор класса предка (суперкласса)
- self.setDaemon(True)
- self.rlock = threading.RLock() # примитив синхронизации, который может быть получен несколько раз одним и тем же потоком
- self.cv = threading.Condition() # переменная состояния позволяет одному или нескольким потокам ждать, пока они не будут уведомлены другим потоком.
- self.stop()
- self._start()
- # когда поток создается, его нужно запустить, для этого используется метод start
- def _start(self):
- threading.Thread.start(self)
- def start(self):
- self.stoped = False
- self.rlock.release()
- # для остановки работы потока
- def stop(self):
- self.stoped = True
- with self.cv:
- self.cv.notify() # вызов метода notify() в контекстном менеджере
- self.rlock.acquire()
- ''' Метод, определяющий логику работы потока'''
- def run(self):
- # секция для отлова и обработки исключений
- try:
- while 1: # бесконечный цикл
- # используем rlock и cv (смотри определение этих параметров класса)
- with self.rlock:
- with self.cv:
- for ch in self.chars: # цикл по символам из chars
- if self.stoped:
- break # выход из цикла
- with printremove(ch):
- self.cv.wait(0.5) # ожидание половину секунды
- finally: # finally выполняет блок инструкций в любом случае, было ли исключение, или нет
- self.stop() # остановка работы
- # метод вызывается при входе в контектный менеджер
- def __enter__(self):
- self.start()
- return self
- # метод вызывается при выходе из контекстного менеджера
- def __exit__(self, type, value, traceback):
- self.stop()
- # испорт библиотеки
- import fileinput
- try:
- '''функция для красивого(термин pretty print) вывода информации'''
- init_printing(use_unicode=False, wrap_line=False, no_global=False)
- x = symbols('x') # определение константы x
- spinner = Spinner() # создали объект класса
- # вывод текста
- print("")
- eprint("Программа решения интегралов с бесконечными пределами.")
- eprint("В подинтегральном выражении можно использовать переменную 'x'")
- eprint("например: sin(x^2)")
- print("")
- eprint("Введите подинтегральное выражение(или 'выйти'(или 'exit') для завершения):")
- print("")
- eprint("> ", False, True)
- # чтение из файла
- for integrand in fileinput.input():
- try:
- integrand = integrand.strip().lower() # обработка строки
- if "" != integrand: # если строка не равна пустому символу
- print("")
- # если строка равна одному из вариантов, то выход из цикла
- if ("exit" == integrand or "exit()" == integrand or "quit" == integrand or
- "q" == integrand or "выйти" == integrand or "выход" == integrand):
- break
- eprint("Результат: ", False, True)
- # заходим в контекстный менеджер
- with spinner:
- integrand = integrand.replace("^", "**") # заменяем символ ^ на **
- result = eval("integrate(" + integrand + ", (x, -oo, oo))") # вычисляем интеграл вызовом eval
- print("")
- pprint(result)
- eprint("Численный результат: ", False, True)
- # выводим численный результат
- try:
- with spinner:
- result = result.evalf()
- except:
- result = nan
- eprint(str(result))
- print("")
- except Exception as ex: # обработка исключений
- eprint("Было введено недопустимое выражение: " + str(ex))
- print("")
- eprint("> ", False, True)
- except:
- sys.exit() # завершение программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement