Форум сайта python.su
3
Питон 3.
Есть маленькая программа математических вычислений, результат выполнения которой должен быть представлен в форме отчёта. Под отчётом я подразумеваю:
- вывод данных в окне Pyton Shell
- копирование данных в буфер обмена
- сохранение данных в новый файл *.txt / *.doc / *.docx / *.rtf / *.pdf
Отчёт должен сохраняться в формат, указанный пользователем, а не во все сразу. Создавать кучу копий, конечно, не нужно.
Однако в ходе работы программы требуется диалог с пользователем с выводом справочной (дополнительной) информации - какой видно из примера ниже:
x = 30 y = 50 print('x =',x) print('y =',y) print('''Вы хотите: \a[1] Вычислить сумму \a[2] Вычислить разность \a[3] Вычислить умножение''') n = int(input()); if n == 1: print('x+y=',x+y) elif n == 2: print('x-y=',x-y) elif n == 3: print('x*y=',x*y) else: print('end')
x = 30Из всего этого текста в отчёт должен попасть текст:
y = 50
Вы хотите:
- Вычислить сумму
- Вычислить разность
2
- Вычислить умножение
x-y= -20
x = 30В примере я показал лишь одну выходную формулу, а их будут десятки и n-ое количество диалогов и справок.
y = 50
x-y= -20
Отредактировано Kyrym (Дек. 30, 2016 07:46:15)
Офлайн
253
Kyrym:) очевидно единственно правильного варианта нет.
Мой вопрос в том, как правильно выстроить архитектуру программы
from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter) elements = [] data= [ ["x ", "=", "30"], ["y ", "=", "50"], ["x-y", "=", "-20" ] ] t=Table(data) elements.append(t) # write the document to disk doc.build(elements)
data =[] while(1): if n == 1: print('x+y=',x+y) data.append( ("x+y","=", x+y) )
Отредактировано doza_and (Дек. 29, 2016 21:43:19)
Офлайн
857
Kyrym
Мой вопрос в том, как правильно выстроить архитектуру программы, чтобы было возможным получать данные отчёты?
#!/usr/bin/env python3 def dialog(text): x = 2 y = 3 while True: s = input(text) if s == '1': print('x + y =', x + y) elif s == '2': print('x - y =', x - y) elif s == '3': print('x * y =', x * y) elif s == 'q': print('end') break def main(): msg = ('Введите число (q - для выхода).\n' 'Вы хотите:\n' '[1] Вычислить сумму\n' '[2] Вычислить разность\n' '[3] Вычислить умножение\n') dialog(msg) if __name__ == '__main__': main()
[guest@localhost userdialog]$ ./userdialog.py
Введите число (q - для выхода).
Вы хотите:
[1] Вычислить сумму
[2] Вычислить разность
[3] Вычислить умножение
1
x + y = 5
Введите число (q - для выхода).
Вы хотите:
[1] Вычислить сумму
[2] Вычислить разность
[3] Вычислить умножение
2
x - y = -1
Введите число (q - для выхода).
Вы хотите:
[1] Вычислить сумму
[2] Вычислить разность
[3] Вычислить умножение
3
x * y = 6
Введите число (q - для выхода).
Вы хотите:
[1] Вычислить сумму
[2] Вычислить разность
[3] Вычислить умножение
q
end
[guest@localhost userdialog]$
Отредактировано py.user.next (Дек. 30, 2016 04:30:30)
Офлайн
3
Я несколько дополнил первый пост, чтобы меня лучше поняли.
py.user.next, Вы ведь просто сделали цикл для программы, но задача совсем иная.
doza_andЕсли честно, я совсем не понял о каких ручных действиях идёт речь?
В вашем решении любого программиста покоробит огромное количество ручных действий
doza_andЯ уточнил в первом посте, что куча копий в разных форматах не нужна. Я просто показал область форматов, которые мне интересны. И ждал, что если с сохранением в какие-либо форматы будут проблемы, то об этом что-нибудь напишут.
и куча никому не нужных промежуточных файлов
Офлайн
857
KyrymДальше подключай функции к выбранным пунктам, а внутри функций уже сохраняй что надо и куда надо. Я просто сделал диалог, потому что в исходном сообщении никакой не диалог, а просто фуфел одноразовый. Заодно показал тебе, что не надо их в числа преобразовывать, потому что тогда ты лишаешь себя букв и даже фраз, на которые тоже можно реагировать (что часто требуется в подобных программах).
py.user.next, Вы ведь просто сделали цикл для программы, но задача совсем иная.
Отредактировано py.user.next (Дек. 30, 2016 08:36:05)
Офлайн
253
KyrymВот об этих:
Если честно, я совсем не понял о каких ручных действиях идёт речь?
KyrymПосле этого я посчитал что вы из ворда будете pdf лепить и rtf ручками.
- копирование данных в буфер обмена
KyrymЯ написал что doc/rtf нежелателен. Как сделать pdf написал.
И ждал, что если с сохранением в какие-либо форматы будут проблемы, то об этом что-нибудь напишут.
KyrymВы занялись программированием, но пока похоже представляете что на каждое ваше желание есть функция но просто не знаете как ее найти, как объяснить поисковому движку что вы хотите.
Вы предлагаете под каждым нужным print'ом добавлять .append. А разве нет более удобного решения. Может это делается функцией?
def my_funny_print(*argv,**kvarg): print(*argv,**kvarg) do_some_more()
KyrymНет вы ошибаетесь. Ваш вопрос уникален. Никто так не делает, потому что при записи данных в файлы для создания отчета обычного принта недостаточно, нужна разметка текста которая определит форматирование, а при логгировании данных она загромоздит вывод и его будет неудобно смотреть на консоли. Многолетние усилия программистов всего мира по изобретению единого способа форматирования вывода любой программы привели только к изобретению терминала и широкому применению символов табуляции и перевода строки.
Насколько я понимаю, мой вопрос не является уникальным.
my_python_prog.py | tee out.txt
Офлайн
3
Я только изучаю функции и классы, получается пока плохо, поэтому запустить эту штуку у меня не получилось:
def my_funny_print(*argv,**kvarg): print(*argv,**kvarg) do_some_more()
# Питон 3 def my_funny_print(*argv,**kvarg): print(*argv,**kvarg) # do_some_more() x = 30 y = 50 print('x+y=',x+y) q = 'x+y='+str(x+y) print(my_funny_print())
# Питон 3 data = [] print('-'*30,''' Ход програмы''') x = 30 y = 50 # Выражение 1 i = 'x+y='+str(x+y) print(i) data.append(i) # Лишний для отчёта текст print('Лишний для отчёта текст') # Выражение 2 i = 'x-y='+str(x-y) print(i) data.append(i) # Блок отчётов print('-'*30,''' Текст отчёта списка data''') for i in data: print(i)
——————————Единственное, мне не нравится, что приходится писать повторяющийся код:
Ход програмы
x+y=80
Лишний для отчёта текст
x-y=-20
——————————
Текст отчёта списка data
x+y=80
x-y=-20
print(i) data.append(i)
# Питон 3 data = [] class Ot: def __init__(self, x): self.x = x def my_funny_print(*argv,**kvarg): print(*argv,**kvarg) class Ot2: def __init__(self, x): self.x = x self = data.append(x) return() print('-'*30,''' Ход програмы''') x = 30 y = 50 # Выражение 1 i = 'x+y='+str(x+y) print(i) x = Ot2('i') # Лишний для отчёта текст print('Лишний для отчёта текст') # Выражение 2 i = 'x-y='+str(x-y) print(i) x = Ot2('i') # Блок отчётов print('-'*30,''' Текст отчёта списка data''') for i in data: print(i)
Отредактировано Kyrym (Янв. 11, 2017 13:16:09)
Офлайн
253
KyrymНет не обязательно. Вообще похоже вам пока рано классами пользоваться.
Я так понимаю, что моя задача должна решаться через классы
KyrymА вам название функции ничего не сказало? По русски функция называлась бы сделать_чтото_еще()
Что такое “do_some_more()” я не понял, поэтому исключил из кода.
KyrymВот внутри функции и можно было выполнить append чтобы не писать его каждый раз снаружи
Единственное, мне не нравится, что приходится писать повторяющийся код:
def my_funny_print(*argv,**kvarg): print(*argv,**kvarg) data.append(argv) my_funny_print('x-y', x-y) my_funny_print('x+y', x+y)
Офлайн
3
doza_andЯ так не думаю.
Вообще похоже вам пока рано классами пользоваться.
# Питон 3 # -*- coding: utf-8 -*- data = [] def viv(i): i = ''.join(map(str, i)) data.append(i) return(print(i)) print('-'*30,''' Ход програмы''') x = 30 y = 50 # Выражение 1 i = 'γ = x+y = '+str(x+y) print(i) data.append(i) # Выражение 3 i = ['ξ = x/y = ',x/y] viv(i) # Блок отчётов print('-'*30,''' Текст отчёта списка data''') for i in data: print(i)
Офлайн
253
Kyrym:) Безусловно. Неплохо если вы приведете пример как на ваш взгляд правильно.
А Вашу мысль можно было выразить иначе…
Kyrym
Но не о том речь.
Kyrym
Работает исправно:
# Питон 3 # -*- coding: utf-8 -*- data = [] # -------- функции нужны чтобы убрать повторяющийся код - у вас функция используется один раз. значит не надо было ее писать def viv(i): i = ''.join(map(str, i)) data.append(i) return(print(i)) #-------- строка не имеет смысла print ничего не возвращает print('-'*30,''' Ход програмы''') #------- я бы сделал print("-"*30+"\nХод програ[b]М[/b]мы") но это дело вкуса x = 30 y = 50 # Выражение 1 i = 'γ = x+y = '+str(x+y) #------- зачем i=, зачем str(x+y) можно просто написать print('γ = x+y = ', x+y) print(i) data.append(i) #--------- тут по идее должен быть viv # Выражение 3 i = ['ξ = x/y = ',x/y] viv(i) # Блок отчётов print('-'*30,''' Текст отчёта списка data''') for i in data: #----------- тут вообще непонятно зачем опять на консоль писать надо по идее в файл print(i)
x,y = 30,50 def viv(z): a = "{0} -> {1}".format(z,eval(z)) print(a) return a b="\n".join(map(viv,["x+y","x/y"])) print("""------------------ Ход програмы %s Текст отчёта списка data ------------------""" % b)
Офлайн