Ответы пользователя по тегу Python
  • В чем причина ошибки IndentationError: unexpected unindent?

    bingo347
    @bingo347
    Crazy on performance...
    // вот тут косяк:
        @bot.message.handler(content_types=['text'])
    def bot_massage(massage):
    декоратор находится на уровне предыдущей функции, а функция, которую он декорирует на верхнем уровне
    Ответ написан
    Комментировать
  • Как сделать вывод на одной строке?

    bingo347
    @bingo347
    Crazy on performance...
    print(f'Осталось {a} секунд', end='\r')
    Но по хорошему еще стоит подумать над затиранием предыдущей строки, например пробелами, так как последующие строки будут меньшей длины

    В общем виде я бы сделал так:
    import time
    
    
    a = input('Укажите время для таймера в секундах - ')
    space = ' ' * len(a)
    a = int(a)
    while a > 0 :
        print(f'Осталось {a} секунд', space, end='\r')
        a -= 1
        time.sleep(1)
    print('Таймер завершен  ')
    Ответ написан
  • Объясните пожалуйста работу этого кода?

    bingo347
    @bingo347
    Crazy on performance...
    1)curr = dummy = ListNode()
    что это за конструкция. ну вернее я знаю, что это объект класса, но зачем сразу 2 переменные? сделал вот так
    dummy = ListNode() и не работает

    2 переменные нужны, что бы иметь ссылку и на начало и на конец списка, в конец будем добавлять ноды из других списков, а начало нужно чтоб потом сделать return

    if l1.val >l2.val:
                    curr.next = l2 
                    l2 = l2.next
    объясните пожалуйста вот эти 2 строчки
    curr.next = l2 
    l2 = l2.next
    Через if выбрали из какого из 2 списков будем вставлять ноду в наш список и добавили ее туда, потом запомнили ссылку на следующую ноду выбранного списка

    3) Почему возвращаем именно dummy и next?
    return dummy.next
    В dummy у нас начальная нода нашего списка, но она опорная, мы ее сами создали, а не взяли из исходных списков, а вот следующая - уже нода одного из списков.
    Ответ написан
  • Почему python на vs code неправильно создает папку при помощи vs code?

    bingo347
    @bingo347
    Crazy on performance...
    настройки запуска находятся в файле .vscode/launch.json
    добавьте туда параметр cwd со значением "${fileDirname}"
    Ответ написан
    1 комментарий
  • Для чего нужен полиморфизм?

    bingo347
    @bingo347
    Crazy on performance...
    Полиморфизм бывает разный:
    Полиморфизм подтипов - этот тип как раз таки и подразумевают в контексте ООП. Суть в том, что сущность некоторого класса так же может представляться базовым классом или интерфейсом. Это позволяет переиспользовать код, отдавая в один и тот же метод/функцию сущности с разными классами, но с общим интерфейсом.
    Параметрический полиморфизм - используется уже не только в ООП, но и в других парадигмах. Опять таки полиморфная функция принимает аргумент разных типов, при этом сам тип так же передается как параметр функции, а следовательно функция может оперировать составными типами на основе переданного. Или например возвращать результат того же или производного типа, сохраняя тем самым тип для вызывающего кода. Чаще всего представлено дженериками, но могут быть и другие формы (например template в C++). Как правило не имеет смысла в языках с динамической типизацией. А еще часто сопровождается контрактами на получаемый тип (например типами высшего порядка или типажами), что позволяет с одной стороны ограничить возможные типы, а с другой - воспользоваться характеристиками типа обусловленными контрактом.
    ad-hoc полиморфизм - способность функции предоставить разную реализацию в зависимости от запрашиваемой сигнатуры. Чаще всего выражено перегрузкой функций/методов. Как правило не реализуем средствами языка с динамической типизацией, хотя может быть реализован в рантайме (например в js функция всегда принимает произвольное количество аргументов и может проанализировать их в рантайме с помощью arguments).

    В общем случае полиморфизм нужен для переиспользования кода. Соблюдения практик SOLID и DRY не возможно без полиморфизма. Например в языке Go отсутствие полиморфизма в любом виде приводит к загрязнению кодовой базы и большому количеству копипасты.

    И еще, из моего ответа, может сложится мнение, что полиморфизм не применим к языкам с динамической типизацией, например к Python. На самом деле это не так, в ЯП с динамической типизацией полиморфизм наоборот возведен в абсолют.

    UPD: Примеры:
    правда я не шибко хорошо знаю конкретно Python, поэтому абстрактно напишу псевдокод:

    Полиморфизм подтипов, как уже говорил, это про ООП. Допустим у меня задача реализовать класс, который читает бинарные данные, проверяет, что они валидный utf-8 и выдает прочитанное как строку. Откуда он читает их? Да мне все равно, это не относятся к моей задаче. Конкретную реализацию я приму в аргументах, а уж откуда она будет читать, из файла или из сети - мне все равно. Главное чтоб эта реализация умела читать байты.
    // ok мне нужно что-то, что умеет читать байты, опишу это интерфейсом
    interface IByteReader {
      readBytes(): BytesIterator;
    }
    
    // и мой метод:
    readAsString(reader: IByteReader): string {
      var iterator: BytesIterator = reader.readBytes();
      // ну и тут как то с ним работаю, трансформируя байты в строку
    }
    теперь вызывающий код может передать в мой метод инстанс любого класса, реализующего мой интерфейс, и мне теперь не нужно дублировать логику чтения строки для файла и для сети.
    Еще один яркий пример тут - функция len() в Python, которая принимает любой тип реализующий одноименный магический метод.

    Параметрический полиморфизм, это про дженерики. Напишем 2 функции, обе будут принимать на вход массив, одна из них будет возвращать начальный элемент, а другая конечный. Но массивы бывают для элементов разных типов. Без параметрического полиморфизма, нам бы пришлось писать реализацию для каждого нужного типа, но благодаря ему мы можем это сделать в обобщенном виде:
    // T - это параметр типа
    fitst<T>(arr: [T]): Option<T> {
      if(arr.has(0)) return Some(arr[0]);
      else return None;
    }
    
    // давайте предположим, что некоторые виды массивов у нас могут быть бесконечными
    // тогда нам понадобится контракт, что можно передавать массивы только с известным размером
    last<T>(arr: [T]): Option<T>
      where [T]: WithKnownSize
    {
      var length: size = get_length(arr);
      if(length == 0) return None;
      else return arr[length - 1];
    }


    ad-hoc полиморфизм, это про перегрузку функций, пусть мы хотим функцию print которая умеет печатать числа и строки:
    print(value: string) {
      stdout.write(value);
    }
    print(value: int) {
      stdout.write(value.to_string());
    }
    Ответ написан
  • Почему JS решил задачу на рекурсию гораздо быстрее Python/Lua?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Синтетические бенчмарки врут практически всегда, потому что те кто их пишет редко знает досконально все сравниваемые технологии и вряд ли сможет свести задачу к схожим условиям. Как правило, схожие условия выходят только при отключении всех возможных оптимизаций, ибо оптимизации у разных технологий работают по разному.
    Как уже написали выше, Вы зря не превели код на Python, возможно специалисты по этому ЯП предложили бы более оптимальное решение.
    По js варианту могу сказать, что v8 очень хорошо умеет оптимизировать хвостовую рекурсию. И в данном примере вместо дорогой рекурсии у Вас будет работать более дешевый цикл. Я могу Вас удивить, перепишите свое решение на C вот прямо как есть и скомпилируйте без оптимизаций - js + v8 окажется быстрее
    Ответ написан
    Комментировать
  • Как лучше сохраняться данные с сайта в ClickHouse?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Схема в общем-то рабочая, но стоит все же предусмотреть некоторые нюансы:
    Создаю сервер с nginx и ClickHouse на Ubunta в одном месте
    Вы уверены, что одна единственная машина, нагруженная одновременно и nginx и CH и redis и php/python справится с Вашей нагрузкой?
    Я бы сразу закладывал, что раньше позже CH уедет на отдельную машину (а то и на 2), redis + php/python будут жить в парах на множестве машин, а nginx будет балансировать нагрузку с отдельной машины.
    раз в N секунд скриптом на python/php через cron кладет данные в ClickHouse

    Тут сразу 2 момента:
    Во-первых, при миллиарде записей CH вполне может пересчитывать индексы пару минут. +1000 записей за 10 инсертов конечно лучше, чем +1000 записей за 1000 инсертов... но все же заметно хуже чем +1000 записей за 1 инсерт.
    Во-вторых, при пиковой нагрузке у Вас может закончится память, и redis уйдет на диск, потеряв всю скорость от inMemory работы. Конечно Вы тут еще и упретесь в количество активных потоков под php и начнете его балансировать. Так что одно из решений будет уже описанное выше, что на каждой машине с php/python свой redis. А там как повезет с нагрузкой.
    Но все же я бы сразу делал выгрузку из redis в CH умнее, чем тупо каждые N секунд выгружаем все что есть. Лучше если будет выгрузка и по времени (при этом реже) и по количеству данных для записи.
    Ну и еще, задумайтесь сразу как делить данные в redis по принадлежности к интервалу записи
    Ответ написан
    Комментировать
  • Чем пользоваться для хранения кусков кода и поиску по ним?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    github, gitlab, bitbucket выбирайте
    Ответ написан
    Комментировать
  • Как через SSH открыть CLI не перезапуская программу?

    bingo347
    @bingo347
    Crazy on performance...
    Должны быть отдельные точки входа для cli и для сервиса
    Ответ написан
    Комментировать