Доработал пример из книги. Кстати, в отличие от одного из предыдущих, перепечатывал сам. Кто из меня будет, быдлокодер или нет?
'''
Created on 10.06.2012
@author: pasha
'''
#!/usr/bin/env python3
import re
co = 0
def operat(charOf):
"""возвращаю оперирующую функцию, например charOf('+') - сложение"""
operators = {'+', '-', '*', '/', ';'}
if charOf not in operators:
raise ValueError
def operate(sum, arg):
"""Приращиваю/умножаю/etc arg к sum"""
global co
if not co: #вызов в первый раз
co+=1
return arg
#print("debug:in operate charOf: {0}".format(charOf))
if charOf == "+":
sum += arg
elif charOf == "-":
sum -= arg
elif charOf == "*":
sum *= arg
elif charOf == "/" or charOf == ":":
sum /= arg
else:
raise ValueError
# print ("sum: {0}".format(sum))
co+=1
return sum
return operate
def calc():
"""Вычисляю выражение с помощью re.compile"""
print ("Введите числа для суммирования, stop для окончания")
operator = None
while True:
try: #если исключение не вызвано, выходим из цикла
o = input("Введите требуемый оператор:")
if o == "stop":
break
operator = operat(o) #исключение тут
break
except ValueError:
print ("Оператор не поддерживается!")
summ = 0
p =re.compile("^[-]?[0-9]+$") #глава про регулярные выражения
while True:
s = input("Введите число:")
if s == "stop":
break
arg = None
try:
if not p.search(s):
raise ValueError
arg = int (s)
except ValueError:
print("Введите число или 'stop'")
continue
summ = operator (summ, arg)
print("Результат: {0:d}".format(summ))
if __name__ == '__main__':
calc()