Ответы пользователя по тегу Python
  • Какая разница между строковыми методами в Python с двойным подчеркиванием и без?

    @CobaltTheTerrible
    Копипастю код на Python
    Разницы нет никакой. Это простое удобство.

    Вот, например, по поводу метода __add__ документация сообщает:
    For instance, to evaluate the expression x + y, where x is an instance of a class that has an __add__() method, x.__add__(y) is called.


    Т.е. когда вы пишите a+'-678', то за вас это будет преобразовано в a.__add__('-678')

    P.S. Про __len__ - https://docs.python.org/3.5/reference/datamodel.ht...
    Там же находится и описание других методов.
    Ответ написан
    Комментировать
  • Как увеличить быстродействие данного скрипта?

    @CobaltTheTerrible
    Копипастю код на Python
    Оптимизировать это не получится.

    Ваша L-система содержит такой production rule, что при N=5 строка с инструкцией состоит из 172186881 символов. Подозреваю, что у вас даже эмулятор терминала вылетает, потому что это 160 мегабайт, которые скрипт выводит в терминал.

    Для сравнения при N=4 строка с инструкцией содержит 26241 символ. Насколько я вижу у вас код, который делает рисунок, имеет линейную сложность. Т.е. даже если для N=4 выполнение программы занимает 1 секунду, то для N=5 по оптимистичной оценке (линейная сложность без большой константы впереди) потребуется 6562 секунды.
    Ответ написан
    Комментировать
  • Что не так с кодом?

    @CobaltTheTerrible
    Копипастю код на Python
    Ниже замечания, вопросы возникшие после того, как я пробежал за пять минут глазами выложенное по ссылке.

    Не про код:
    1. Не пользуетесь .gitignore. У вас в репозитарии есть README.md~
    2. В самом README.md стоит пользоваться разметкой markdown
    3. Что за коммит с мессаджем all?

    Про код:
    4. Как уже отмечали: большая простыня без разбиения на функции, которую зачем-то запихнули в функцию main.
    5. Код не следует PEP8 (поставьте себе какой-нибудь чекер и проверяйте код). В частности очень много длинных строк, которые читать очень тяжело, лучше бы код не в main засовывали, добавляя лишние 4 пробела на каждую строку, а обошлись вообще без функций.
    6. Комментариев про логику обработки файлов нет. Возможно, конечно, логика простая, но мне вникать, разбирая код, стало лениво.
    7. Код ниже может выкинуть эксепшен, если кто-то неправильно сконфигурирует скрипт. Почему не обрабатываете этот экспшен, хотя исключения paramiko ловите?
    list_with_path_to_file = DICT_WITH_SERVER[ip]
    Проверяйте что наконфигурировали в вашем скрипте. Гарантированно же при таком количестве настроек будут опечатки, забытые запятые и кавычки.
    8. Почему в одном случае вызов getcwd обёрнут в str, а вдругом нет? Это стоит пояснить комментарием, если str действительно нужен (в чём я сомневаюсь :))
    path_local = str(os.getcwd()) + '/logs/' + name_logfiles
    path_to_logs_parser = os.getcwd() + '/logs/' + name_parser_logfiles

    9. Раз уж импортировали модуль os, то почему бы не пользоваться os.posixpath.basename вместо
    name_logfiles = file_path.split('/')
    name_logfiles = str(name_logfiles[-1:])...

    10. Аналогичное замечание про os.posixpath.join
    11. Используйте string.format. Вместо
    print ('\nAll done! I will sleep next '+ str(TIME_FOR_SLEEP) +'  seconds' + '\n')

    print ('\nAll done! I will sleep next {} seconds\n'.format(TIME_FOR_SLEEP))

    12. Если так хочется if-ы запихнуть в одну-две строки, то пользуйтесь conditional expressions.
    if i - context < 0: j = 0
    else: j = i - context

    пребразуется в
    j = i - context if i - context >= 0 else j = 0
    # а то и вовсе пишите
    j = max(i-context, 0)

    13. Зачем вы сравниваете с False постоянно ваши переменные found_error и first_iter? Что мешает написать сразу if no(first_iter)? Зачем вы пишете if found_error == False: print '1' else: print '2' вместо более простого if found_error: print '2' else: print '1' ?
    14. Пользуйтесь контекстными менеджерами, list comprehensions. В куске кода ниже комментарий не нужен. Вы просто дублируете код.
    logfile = open(path_local, 'r')  # open file for read
    for line in logfile:
        logfile_list_old.append(line)
     logfile.close()

    Сравните с
    with open(path_local, 'r') as f:
        logfile_list_old.extend(f)


    Дальше уже стало лень писать. Если вкратце, то код очень плохой. Он отвратительно структурирован и никак не документирован. В довершение ко всему, он еще и не совсем pythonic.
    Ответ написан
    1 комментарий
  • ООП. Почему выводится none?

    @CobaltTheTerrible
    Копипастю код на Python
    print(obj1.ChangePartHead(obj1.head, obj))

    Выводит на печать то, что вернул метод ChangePartHead объект obj1. Указанный метод не возрвщает ничего, потому и выводится None.
    Ответ написан
    Комментировать
  • Есть ли на Python3 OCR библиотеки (распознование текста)?

    @CobaltTheTerrible
    Копипастю код на Python
    Ищите другие врапперы для Tesseract.

    Например, находится свежий pytesseract с заявленной поддержкой Python 3
    Ответ написан
  • Парсер на Python, как реализовать?

    @CobaltTheTerrible
    Копипастю код на Python
    Можно посмотреть еще на Scrapy.

    По своему опыту сразу скажу, что имеет смысл сохранять в какой-нибудь key-value storage все загружаемые страницы. Очень помогает потом в отладке
    Ответ написан
    Комментировать