LINUX.ORG.RU

поставьте диагноз

 


0

2

Доработал пример из книги. Кстати, в отличие от одного из предыдущих, перепечатывал сам. Кто из меня будет, быдлокодер или нет?

'''
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()
Спасибо. Комментарии по коду приветствуются.

★★★★

Ты прав, из тебя получится отличный быдлокодер. А автор книги уже, или умело прикидывается.
Комментарий к коду: а почему operators оформлено как множество, а не к примеру кортеж или список?

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Множество? не знаю, захотелось.

а как доработать пример, чтобы он не был быдлокодом? хотя бы общие замечания

pashazz ★★★★ ()

Использование множества вместо строки длиннее, not co читается хуже чем 0 == co, кое-где можно вставить пустых строк, соглашения о docstring ЕМНИП требуют переноса строки после открывающих и перед закрывающими кавычками. Транслит ненужен.

anonymous ()

Кстати скрипт вообще запустится с таким bash-клиентом в начале? Ну то есть так: ./test.py

И еще можно кодировку файла явно указывать в псевдокомментарии.

anonymous ()

перепечатывал

Если в этом примере хотя бы 20% не твои — выбрасывай книгу.

baverman ★★★ ()

Я так и не понял, зачем тебе operat (да еще с вложенной функцией). Почему не:

from operator import add, sub, mul, div

optab = { '+': add, '-': sub, '*': mul, '/': div }
optab['+'](1, 2)
tailgunner ★★★★★ ()

Во-первых,

свою метку или то, что ты любишь Столлмана:

'''
Created on 10.06.2012

@author: pasha
'''

надо писать после вот этого:

#!/usr/bin/env python3

а не до

anonymous ()

Во-вторых,

    if charOf not in operators:
        raise ValueError
    def operate(sum, arg):

Надо уметь нажимать на enter, в смысле отделять части кода символов перевода на новую строку.

anonymous ()

4

>>> sum
<built-in function sum>

это значит, что не нужно называть переменную этим именем.

anonymous ()
if charOf == "+":
    sum += arg
elif charOf == "-":
    sum -= arg
elif charOf == "*":
    sum *= arg
elif charOf == "/" or charOf == ":":
    sum /= arg
else:
    raise ValueError
from operator import add, sub, mul, div

optab = {'+':add, '-':sub, '*':mul, '/':div}
result = optab.get(charOf)(result, arg) if charOf in optab else int('a')

если быдлокодишь - то по максимуму

anonymous ()

Но вообще, у тебя серьезные проблемы с разбиением кода по функциям. К примеру, что в calc() делает код чтения данных и вечный while? Всё это должно быть в отдельных функциях и в main(), а calc() должен только одно выражение.

В соседней ветке я советовал товарищу прочитать SICP, до того, как он начнет изучать синтаксис %любого ЯП%, в меня начали кидать помидоры, «за то что предлагаю лишп». Ну, хорошо - быдлокодьте на здоровье.

anonymous ()
Ответ на: комментарий от tailgunner

Спасибо.

also:

Если в этом примере хотя бы 20% не твои — выбрасывай книгу.

книжного кода ну 10% отсилы

pashazz ★★★★ ()

Вы пишите на питоне, как на каком нить С/паскале... и зачем так много букв для такой простой задачи? Есть же eval в конце концов, есть функциональщина.

AIv ★★★★★ ()
Ответ на: комментарий от AIv

лови симпу за функциональщину и хейт за eval

anonymous ()
Ответ на: комментарий от pashazz

А в чем смысл? Гвозди пассатижами забивать?;-)

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

Ну и даже без eval - это делается гораздо проще. Что то вроде:

while 1 :
    op = { '+':'__add__',  '-':'__sub__',  '*':'__mul__',  '/':'__div__'  }.get(raw_input("введите оператор"))
    if op : break
    print "нет такого оператора"
L = []
while 1 :
    s = raw_input("введите число или stop для окончания")
    if s == "stop" : break
    try : L.append(int(s))
    except: print "неверно задано число"
print "результат", reduce( getattr( int, op ), L )

не тестировал, писал для второго питона (3й не люблю). Ну и подобный интерактивный интерфейс (введите то, введите это) фигов по определению - форматы ввода/вывода описываются в доках, программа либо работает либо отваливается чирикнув в stderr. Иначе это не прикрутишь никуда.

AIv ★★★★★ ()
Ответ на: комментарий от Virtuos86

Сам так делаю иногда, но молотком все же удобней... да и ломаются от этого пассатижи иногда.

AIv ★★★★★ ()
Ответ на: комментарий от tailgunner

Вообще то это какое то гнусное извращение.

AIv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.