• Возникла ошибка Type Error в Python при изучении классов. Где и что в коде не правильно?

    Maksim_64
    @Maksim_64
    Data Analyst
    потерял скобки при создании экземпляра класса. deck = Deck(), Я скопировал, твой код и запустил у себя, там следом еще ошибка, вот в этой строе
    elf.cards[i], self.cards[j] = self.cards[j], self.cards[i]
    говорит list index out of range по всей видимости вот в этой строке j = random.randint(i, num_cards-1) Нужно, добавить -1, что я и сделал тогда все работает.
    Ответ написан
    1 комментарий
  • AttributeError: 'NoneType' object has no attribute 'get_text'. Как решить?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В вашем коде не так - это отсутствие проверок на возвращаемые значения. Любой из селекторов может не найти требуемых элементов и вернуть None, а у None никаких методов нет, включая метод get_text.
    Ответ написан
    2 комментария
  • Как мне исправить ошибку KeyError: 18?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Хорошо бы понять, откуда в class_id попадает невалидное значение ключа?
    1. Если такого быть не должно, надо искать причину.
    2. Если такое возможно, надо обрабатывать это исключение через try/except KeyError, либо предварительно валидизировать значение class_id
    Ответ написан
    Комментировать
  • Экстренное завершение работы чат бота Telegram. Как решить проблему?

    nki
    @nki
    bezkart.ru готовая система лояльности
    т.к программирую всего 2 дня

    Тогда вам не с бота надо начинать, а уверенно знать язык и его основные конструкции. Успеете еще ботов написать.
    Ответ написан
    2 комментария
  • Как возвратить курсор на 2 символа назад в консоли?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Как корректно отобразить данные из ini файла?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    Ini - стандартизированный формат. Для работы с ним есть готовые инструменты
    https://docs.python.org/3/library/configparser.html
    Ответ написан
    Комментировать
  • Как код с графическим интерфейсом на основе PyQt6 собрать в .exe?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PyQt
    Седой и строгий
    Безотносительно того, как это делается, стоит иметь ввиду, что это незаконно. Лицензия опенсорсного Qt не позволяет включать библиотеку в исполняемый файл, будь то хоть статическая линковка, хоть упаковка.
    Ответ написан
    Комментировать
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

    Другое дело, что нужного результата можно добиться и другим способом.
    Ведь вполне можно вернуть пустой массив. И таким образом формально соблюсти типизацию.

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Почему boolean использует больше памяти чем byte?

    mayton2019
    @mayton2019
    Bigdata Engineer
    С точки зрения ассемблера - удобнее делать операции над целым числом (DWORD) 32bit. Он - же int.
    В масштабах современной памяти - безразлично выделять 1 байт или 4 байта. Все равно
    другие структуры больше захватят тысячекратно. А простота компилируемого кода - здесь важнее.

    Вот поэтому компилляторы и собирают boolean в int. А язык С++ позволяет проводить аналогии
    между int и boolean. В зависимости от контекста число может быть как числом так и логической
    величиной. (Тесная связь с ассемблером да).

    А если речь допустим идет о массиве boolean - тогда смысл в экономии есть. В Java например
    такой массив действительно будет использовать биты внутри байта.

    В базах данных например (Oracle) вообще нет булевого типа с точки зрения хранения. Там предлагают
    символьный тип 'Y' или 'N'. Это связано с дисковыми структурами хранения данных в datarow.

    Поэтому sizeof(булевый тип) будет всегда парадоксом в разных системах программирования и языках.
    Как компиллятору удобнее так и соберет.
    Ответ написан
    Комментировать
  • Почему пустой tuple занимает больше памяти, чем tuple с None?

    vabka
    @vabka
    Токсичный шарпист
    В случае b у тебя не tuple, а просто None.
    Чтобы получился tuple из одного элемента - нужно добавить запятую
    b = (None,)
    b.__sizeof__() # 32
    Ответ написан
    1 комментарий
  • Как обрабатывать такие исключения в python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Никак, потому что это, во-первых, не исключения, а во-вторых, эти сбои происходят не в питонячьем коде.
    Ответ написан
    2 комментария
  • Как правильно вывести массив из бд и перебрать его?

    Mi11er
    @Mi11er
    A human...
    Вопрос конечно детский
    У вас в массиве лежит объект , в объекте ключи и значения

    Значит первая итерация , по объектам
    Вторая уже по ключам.

    Код напишите сами.
    Ответ написан
    Комментировать
  • Как исправить ошибку с регулярными выражениями?

    @o5a
    Если пытались исключить все символы из набора, то надо было их заключить в квадратные скобки.
    text = re.sub('[–—!"#$%&()*,-./:;<=>@[\\]^_`{|}~\t\n\xa0–\ufeff]', '', str(text))

    А в изначальном виде у вас написан не набор символов, а последовательный шаблон поиска.
    Лучше почитайте хотя бы основы регулярных выражений, поймете ошибку.
    Но помимо этого Вы что-то странное делаете: из списка формируете строку зачем-то str(text) и из нее удаляете символы. Вы не умеет работать со списками? Для чего это было нужно?
    Ответ написан
    Комментировать
  • (вопрос от полного чайника) Как писать код, который будет работать с внешним сайтом?

    @rPman
    У тебя тут сразу несколько технологий и задач, достаточно сложных и сильно друг от друга отличающихся:
    1. сбор данных с сайта
    целая вселенная - это и реверсинженеринг сайта, и борьба против автоматизированных сборщиков (в зависимости от того как заморочился с этим владелец сайта)
    Настоятельно рекомендую сразу работать с сайтом из браузера, техник много, от простого открытия сайта в обычном браузере с инжектом твоего javascript (например расширение tempermonkey), который будет ходить по сайту, до запуска безголового браузера и управление им из своей программы с помощью selenium, а там кликать кнопки и собирать данные, отправляя их тебе на сервер или сохраняя в локальной базе браузера - localStorage/indexeddb/...
    2. обработка данных
    тесно связана со сбором, данные нужно не просто собрать но и привести к машиночитаемому виду (бывают ситуации когда данные создаются людьми без определенного формата, в этом случае совсем туго), так же это тесно перекликается с технологиями борьбы владельцев сайтов с автоматическими собирателями данных
    Совет, вместе с текстовыми данными собирай информацию о расположении, гораздо проще догадываться о назначении данных, если знаешь их относительную позицию.
    3. анализ данных и поиск закономерностей плюс визуализация
    это не только нейронные сети, алгоритмов тьма, разбираться хотя бы на уровне что это и в каких ситуациях применять, придется... и самое главное результата может и не получиться но узнаешь ты только потом
    работа творческая, и готовых решений скорее всего нет (хотя спасибо, за последние лет 10 собран такой пласт библиотек для работы, один tenserflow и torch чего стоит. Загляни на weka, это огромный сет библиотек и алгоритмов (java) как источник информации об этих алгоритмах
    Ответ написан
    1 комментарий
  • Что эффективней, чтение из файла или массив?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос не глупый а вполне себе хороший.

    Его плавное развитие приводит к концепции баз данных. Самое главное что можно сказать тезисно это
    1) Пока памяти хватает (массив) - используй смело память
    2) Диск - больше и дешевле памяти
    3) С памятью работать легко. С диском - очень неудобно и надо обрабатывать IOExceptions почти всегда.
    Диски внезапно полны сюрпризов. Могут быть сетевыми дисками.
    4) Разные диски имеют скорость на порядки разную.
    5) Диски ведут себя очень плохо на random access. От этого даже метрика IOPS появилась.
    Ее очень любят обсуждать админы баз данных.
    6) Существуют структуры данных которые спецом создавались только для дисков (B+Tree)
    7) Диск - переживает выключение питания.
    8) Самые разумные решения - сочетают в себе и диск и память в тех частях кода где это нужно.
    9) Есть интерфейсы программирования которые виртуализирут диск как память. Этим пользуется
    SQLite например.
    10) Диск может достигать очень высокой последовательной скорости чтения или записи в файл
    при условии отсутствия конкурирующих записей в данный момент. Этим пользуются в БД
    для журналирования событий.

    В принципе если современный программист просто будет использовать только оперативную память
    то никто ему не сможет ударить по рукам или подойти с какой-то метрикой и чего-то там измерив
    сказать что он неправ. Тут уж только падения по OOM и потери информации и performance issues
    могут быть каким-то значимым аргументом.
    Ответ написан
    3 комментария
  • Как отображать mp4 видео без ос?

    @rPman
    На текущий момент без операционной системы красиво (в смысле более менее есть поддержка железа) не получится, максимум простоты - пищать pc-speaker, на основе которого с ужасным качеством можно симулировать звуки (баловались еще этим во времена dos и помню был драйвер даже для win95/winnt4).

    Если проблема может быть решена дешевым аппаратным решением, напримерпри наличии LPT на материнке (их часто размещают на плате но не выводят на заднюю стенку) то можно из LPT и 16 резисторов сделать простейшую звуковую карту covox, ну а настроить частоту и выдавать нужный поток в lpt уже не сложно (само собой декодировать аудиоформаты самому, но код в опенсорсе есть по до все, наверное даже под чайники)

    EFI не имеет стека звуковых карт в стандарте, т.е. пилить все самому, можно доползти до звуковой карты, запилив поддержку конкретно твоего чипа (код брать из linux ядра само собой)

    Если я верно понял, какие то очень трудолюбивые ребята ковыряют мак и пилят открытый загрузчик, где в т.ч. есть поддержка звука. Так вот гуглится старый проект (который переехал в этот opencorepkg) который в отдельности умеет работать с intel hd, т.е. взяв его за основу, если твое железо совместимо, и делай.
    ----------------------------------------------
    Ну и правильный подход - нет нужды заниматься такими извращениями, когда есть linux, а точнее ядро а не сама ОС на его основе. К примеру файлы initramfs, которые лежат в /boot каталоге загрузчика, это полноценная операционная система, загружаемая ядром сразу после запуска, так вот там можно уже работать со звуком, причем чуть ли не штатно вкомпилировать туда необходимые компоненты, консольный плеер и что угодно, получив рабочее решение за считанные мегабайты.
    Ответ написан
    Комментировать
  • Python как быстро получить число элементов архива tar.gz?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Не получится из-за специфики устройства tar-файла. Пока весь не прочитаешь, не узнаешь сколько в нём каталогов. Это потоковый формат, а тут он ещё и сжат сверху gzip'ом.

    Это как посчитать быстро сколько вещей в чемодане. Пока по одной не вытащишь и каждую не посчитаешь - не узнаешь.
    У других архиваторов, например zip, есть индексная табличка. Это как бумажка с перечнем всех вещей в чемодане. Она лежит прямо под крышкой и её можно достать первой.

    Придётся как-то обходить эту проблему. Например использовать другой формат архива, или еред архивацией делать отдельный файл с перечнем всех файлов, и его класть в архив первым. А может быть вам и не нужно на самом деле количество элементов в архиве,а того, что вы этим количеством хотите добиться можно достичь иначе.
    Ответ написан
    2 комментария
  • Как мне разделить изображение на зоны?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Все достаточно просто. На изображении выделяете "области интереса", пусть это будут прямоугольники с координатами x0:y0 - x1:y1. Пробегаете по всем прямоугольникам и считаете "плотность" прямоугольника, если плотность отличается, то в этом прямоугольнике что-то находится - включаете нужный моторчик.
    Плотность посчитать очень просто - среднее по всем точкам прямоугольника.
    Более подробно, рекомендую книжку Гонсалеса (как бы азбука цифровой обработки)- https://www.ozon.ru/product/tsifrovaya-obrabotka-i...

    Ах, ну, да... Что-то я сомневаюсь, что в интеренете не нашлось, как кропнуть область из изображения! Вот например с использованием opencv (прям вот для python и C++, как заказывали) - https://learnopencv.com/cropping-an-image-using-opencv/
    Ответ написан
    2 комментария
  • Как сделать проверку символов с возвратом на строку кода?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Есть много вариантов, как сделать проверку.

    Например, сделать функцию проверки, скажем check_answer, которая принимает строку ответа и возвращает логическое значение (если всё хорошо, то True, иначе False).
    Затем сделать конструкцию
    while not check_answer(otvet):
        otvet = input()

    и пока check_answer не вернёт True, этот цикл будет повторяться.

    Однако, в вашем коде есть еще много существенных недостатков, которые сильно затруднят вам жизнь.
    • Во-первых, это нумерованные переменные. Вместо них удобно использовать кортеж, список или словарь. Такие структуры можно перебирать в цикле (итерировать) и каждый следующий элемент обрабатывать одним и тем же набором функций.
    • Кроме того, код хорошо бы разделить на функции, например так: если код делает «то, это и вот это», то у вас должны появиться функции «делай то», «делай это», «делай вот это» и еще функция «выполнить программу», изнутри которой находятся вызовы остальных функций и внутри которой каждая функция получает и возвращает в следующие функции обрабатываемые данные и результаты обработки.

    Такую программу проще отлаживать по частям, можно многократно использовать одну функцию, давая ей на вход разные данные, всё будет более стройно и красиво.

    С другой стороны,
    python позволяет всё плотненько скомкать чуть не до пары длиннющих нечитаемых строк, но так делать вам пока не надо.
    Ответ написан
    3 комментария
  • Как импортировать переменные с функциями?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Вы должны делать всё наоборот:
    Вам надо работать только в модуле main, и в него импортировать в т.ч. функции из других модулей. Тогда импортированным функциям при их вызове из кода main станут доступны необходимые переменные.
    Лучше всего делать функции так, чтобы они явно получали в параметрах все необходимые им переменные и явно возвращали все результаты через return. Тогда будет меньше риска, что где-то что-то будет происходить «само собой».
    Ответ написан
    Комментировать