Задать вопрос
  • Почему is работает не так, как ожидается?

    ElonMask2
    @ElonMask2
    Autor of Tesla Machini and SpaxeX
    Ладно
    a = 'af' Инициализируем ПЕРВУЮ переменную А = АФ  идентиф=1
    b = 'a' Инициализируем ВТОРУЮ переменную Б= А     идентиф=2
    b += 'f' Инициализируем ТРЕТЬЮ переменную Б = А + Ф  идентиф=3
    # А все почему? Строка - НЕИЗМЕНЯЕМЫЙ ТИП
    print(a is b)
    >>> False
    a = 5
    b = 2
    b += 3
    # Тоже самое но, в питоне числа до 255 КЕШИРУЮТСЯ и 50 is 50 и 255 is 255
    print(a is b)
    >>> True


    А тут,
    a = 'af'       #Инициализируем ПЕРВУЮ (ОНА ИДЕТ В КЕШ) А = АФ
    b = 'a' + 'f'  #Инициализируем ВТОРУЮ интерпретатор не тупой и Б = ТОЖЕ АФ (а так как аф есть в кеше Б получает ссылку на ту же память)
    
    print(a is b)
    >>> True


    Где читать? Гугл-
    Изменяемые неизменяемые типы,
    Ответ написан
  • Насколько полезно читать книги?

    saboteur_kiev
    @saboteur_kiev Куратор тега Книги
    software engineer
    Книга - величайшее достижение человечества.

    Книгу ты можешь читать в том темпе, который тебе удобен. ОЧЕНЬ легко в книге вернуться и перечитать слово или фразу или предложение или абзац. С видео это гораздо проблематичнее.

    Какие-то вещи в видео нагляднее, но процент таких вещей несмотря на развитие технологий визуализации, все еще невелик.

    Само по себе оформление знаний в книге может быть гораздо более плотным чем в любом видео.

    Но.
    Самым эффективным является практика.
    Поэтому просто чтение книг или просмотр роликов - должны быть только подсказкой как нужно делать. Эффективным для получения навыков является исключительно практика. А в этом случае чтение книг, статей, документации - является гораздо более удобным, чем видеоролики.

    В принципе видеоролики могут быть более эффективными для для художников, спортсменов, и так далее.
    Для разработчиков - только отдельные моменты.
    Ответ написан
    1 комментарий
  • Как в боте telebot продолжать цикл после ответа пользователя, нажатием на кнопку инлайн?

    @ragq1991
    1. Вынести отправку следующего вопроса в отдельную функцию.
    2. Если я правильно понимаю декоратор "@bot.callback_query_handler(func=lambda call: True)" будет отрабатывать по правильному ответу, а он у Вас над функцией которая проверяет нажал ли пользователькнопку "begin". Здесь значится нужно изменить декоратор на что-то типа "@bot.callback_query_handler(func=lambda c: c.data == 'begin')" и должен произойти первый вызов функции отправки нового вопроса.
    3. Далее две функции с декораторами "@bot.callback_query_handler(func=lambda c: c.data == 'False')" и "@bot.callback_query_handler(func=lambda c: c.data == 'True')" коорые соотвественно возвращают пользователю или сообщение что он ответил неверно или новый вопрос(под декоратором True вызов функции отправки следующего вопроса).

    Надеюсь понятно написал.
    Ответ написан
    1 комментарий
  • В чем минусы событийно ориентированного подхода?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не претендую на правду. Просто несколько мыслей.

    В чем минусы событийно ориентированного подхода?
    Насколько я понимаю, Алан Кей (тот кто придумал термин Объекто-ориентированный) старался придерживаться именно этого подхода. т.е. кто-то отправляет сообщение, а объекты в системе на него реагируют, каждый по-своему.
    По сути у нас есть message bus, в который добавляется сообщение, а объекты системы слушают этот самый message bus.

    Мысль первая. Наследие.

    Когда мы говорим о наследии Алана Кея - надо просто глянуть что он создал практически.
    А создал он язык Smalltalk. Поэтому логично изучать минусы событийного подхода на
    примере софта который написан с использованием Smalltalk. Кто из коллег в топике
    знает примеры такого софта? Я - к сожалению не знаю.

    По ссылкам википедии https://en.wikipedia.org/wiki/Smalltalk можно видеть в категории
    influenced мы просто видим что Smalltalk
    влиял на Java, Go, Swift. Но я здесь не согласен потому что мы не можем измерить глубину
    этого влияния. Это все равно что сказать что Сталин влиял на Черчилля. Как влиял? На 10%?
    Или более чем половину? Сложно. Насчет Java я тут сказал-бы что сомнительно. ООП? Может быть.
    Акторы? Нет. В Java изначально нет акторов. Они существуют позже в виде фреймворков но
    языком не поддерживаются.

    По поводу MessageBus. Если брать технологию акторов которая используется в Erlang.
    то там скорее не message bus а очереди сообщений между потоками-акторами.
    Если про Smalltalk сказать нечего то про Erlang я могу сказать что на нем написаны
    две единицы софта такие как RabbitMq (очень надежная и неубиваемая система MQ).
    Может не супер-производительная. И CouchDb которая выделяется своей
    устойчивостью ко всяким сетевым сбоям. Реклама говорит что Кауч работает
    практически при мигающей сети, при обрывах и т.п. лучше чем аналогичый TCP-IP совт.

    Мысль вторая. Что Кей говорил про ООП.

    У меня есть цитатник. Я туда собираю некоторые слова на лытни. И иногда слова Кнута, Дейкстры
    и прочих it-академиков. Вот из цитатника Кея:

    I made up the term "object-oriented," and I can tell you
    I did not have C++ in mind.

    Что в этой прямой речи можно понять. Что господин Кей открещивается от современного ООП.
    А фактически все современное ООП зеркалит то что есть в С++. Здесь вы можете со мной спорить
    о первенстве (я не буду спорить я не знаю). Но абсолютно очевиден факт что мир пошел по пути
    жесткой синхронщины в 80х. И пока все еще идет. Будут ли примитивные типы int/double обьектами
    не суть важно. Тут важно что Кей постулирует среду в которой двигаются сообщения. Как сеть в миниатюре.
    А классическое ООП С++ - лишает нас этой среды и заменяет ее вызовом метода. Никакого сообщения
    в С++ нет и быть не может потому что сообщение НЕ существует в отрыве от основного потока который
    инициировал вычисления. Умрет поток - развалится весь стек и параметры и все. В противоположность
    в языке Erlang поток (процесс) приёмник может дохнуть много раз но стек сохраняет свою живучесть
    просто повторяя вычисления заново. И здесь мне кажется и идет развилка путей.

    И здесь как-раз мы может говорить о недостатках. Очевидно что у нас появляется лаг приемки-передачи
    сообщения. У нас появляются мягкие гарантии времени обработки. И многое другое.

    Интересно почему в 80х Алан Кей проигрывал. Я думаю что победил прагматизм. В те далекие 80-е
    комьютеры были еще слабыми. Частота мерялась сотнями килогерц и мегагерцами. И в расчетах
    каждый такт был важен. И красивые и академические языки такие как Lisp, Prolog, Smalltalk
    просто проигрывали языку С в силу оверинжинеринга. А поскольку С++ был вначале действительно
    ООП-надстройкой над С - то он предлагал и ООП-подход и скорость портабельного ассемблера.
    И хотя я лично не люблю С++ (я считаю его перегруженным техническими долгами прошлого)
    я признаю что бизнес выбирая С++ выбирал просто скорость вычислений. Академизм и красивые
    доказательства правоты программ были тогда не нужны. Нужно чтоб банковское приложение
    быстро считало кредиты и выдавало зарплаты и пенсии.

    Сегодня, когда мы нежемся в сладкой неге мощных процессоров и даже (!) облаков - мы можем
    себе позволить любого уровня парадигмы и абстракции. Цена 1 абстракции стала настолько дешево
    стоить что нам дешевле в банках запускать Java/Net приложения и на ходу фиксить ошибки
    чем долго разрабатывать на С++ и иметь неопредленнное поведение и тяжелый анализ
    в случае падения. Даже такой уродец как Python взлетел как язык интеграции а не разработки.

    Мысль третья. Нестандартные и асинхронные архитектуры реализованные в железе.

    Недавно смотрел анонс нового процессора от Чака Мура (это тот самый Мур который создал закон имени себя).
    Мне кажется это пример той самой асинхронной клетки о которой мечтал Алан Кей.

    Мысль четвертая. На кого похож Алан Кей?

    Не знаю как вам. :) А мне он уж очень напоминает Боливара Траска из Люди Икс Дни Минувшего будущего.

    Мысль 5. Что делает Алан Кей на фото?

    Бренчит на музыкальных инструментах. Наверное блюз. Блюз потерянных архитектур :)
    Ответ написан
    Комментировать
  • Как определить объем поддерживаемых браузеров в компании при разработке сайтов?

    @alexalexes
    Берете статистику использования браузеров в проектах, которые охватывают основную аудиторию.
    Смотрите наиболее старые версии браузеров, которые используют более 1% пользователей - это будет нижняя планка поддерживаемых браузеров. Узнаете названия движков этих браузеров и их версии - эти данные вписываем в тех. задание.
    Через год снова смотрим статистику, и примечаем, как изменились версии, какие версии ушли ниже 1%.
    Если ваш начальник или какой-то ключевой пользователь, находящийся в этом 1%, упорно сидит на старом браузере, то этот момент прописываем отдельным пунктом в ТЗ - также регулярно интересуемся, не изменились ли у него предпочтения, чтобы занести эти изменения.
    Ответ написан
    Комментировать
  • Скрипт бота в телеграм запускается и сразу завершает работу без ошибки, почему?

    TOA
    @TOA
    Негр c агрессивным характером.
    Скрипт, скорее всего, завершается немедленно, потому что вы пропустили вызов функции main() в конце скрипта. Функция main() содержит всю логику для бота, но если ее не вызвать, скрипт запустится без выполнения этой логики и немедленно завершится. Чтобы решить эту проблему, добавьте следующую строку в конец скрипта:
    if __name__ == '__main__':
        main()
    Ответ написан
    Комментировать
  • Стоит ли разработчикам платить за баги?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, надо. Потому что это тоже работа: а любая работа должна быть оплачена. Не будете платить за исправление багов - разработчики просто будут растягивать разработку в несколько раз с целью отладки, написания дополнительных тестов, проверок и минимизации возможных багов. Так что платить будете все равно. Современные инструменты и методы разработки несовершенны, а программные продукты - механизмы огромной сложности и предусмотреть все возможные комбинации всех деталей для человеческого разума задача очень и очень сложная.
    Ответ написан
    4 комментария
  • Как создать язык программирования?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Как создать свой язык программирования?

    Точно так же, как и любую другую программу: сначала спроектировать, а потом реализовать.

    Без другого языка программирования! Полностью с нуля.

    В самом низу находится машинный код. Выглядит примерно вот так:
    08 04 83 fa 08 04 83 fb 08 04 83 fd 08 04 84 00
    У каждого процессора есть свой набор инструкций, которые кодируются машинным кодом. Открываем справочник и пишем нужный код для нужной ОС/железа. Ничего сложного, правда же? =)

    Ведь как-то создали первый ЯП.

    Достаточно почитать историю появления первых ЭВМ. Они представляли из себя набор переключателей отдельных битов, которые позже эволюционировали в перфокарты, которые в свою очередь представляли из себя прообраз современных исполняемых файлов. С увеличением количества доступных команд, усложнением техники и появлением накопителей программы так же становились все сложнее и сложнее: поэтому решили упростить запись и придумали первый ассемблер. Дальнейшее развитие привело к появлению первого ЯП высокого уровня и далее более высокие уровни абстракции, используя которые сегодня пишутся все программы.

    Так что в вашем случае вам надо пройти весь этот путь самостоятельно. Примерно так:
    1. На машинном коде реализовать минимальный ассемблер
    2. Используя свой минимальный ассемблер реализовать простейший компилятор этого ассемблера
    3. Расширить компилятор ассемблера до стандартного набора инструкций
    4. На ассемблере реализовать транслятор и компилятор ЯП высокого уровня
    5. Реализовать необходимый набор инструкций для написания компилятора этого же ЯП
    6. Написать этот самый компилятор своего ЯП на нём же и далее уже скомпилировать первую самостоятельную версию своего ЯП без использования других ЯП
    Ответ написан
    3 комментария
  • Телеграм бот запоминает первое введенное значение Х. Что не так с кодом?

    Vindicar
    @Vindicar
    RTFM!
    @dp.message_handler()
            async def reply_message_X1(message: types.Message):

    Не надо описывать обработчики событий динамически, внутри других обработчиков. Поведение очень нетривиальное, и затрагивает ВСЕХ пользователей.
    Набор обработчиков должен быть статичен. Вместо этого храни и проверяй, что до этого делал данный пользователь.
    Почитай про finite state machine.
    Ответ написан
    Комментировать
  • Как узнать минимальные требования для собственной игры?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    через тестирование на разных платформах с разными характеристиками.
    Профессия тестировщика в том числе и для этого существует
    Ответ написан
    Комментировать
  • Возможно ли в Python сгенерировать сразу 4 цифры, от 1 до 9, чтобы они не повторялись, и записались в разные переменные?

    @Sozdavan
    Да, в Python можно сгенерировать сразу 4 цифры от 1 до 9 без повторения и присвоить их разным переменным. Один из способов сделать это — использовать функцию random.sample из модуля random. Вот пример:

    import random
    
    # generate 4 random digits from 1 to 9 without repetition
    random_digits = random.sample(range(1, 10), 4)
    
    # assign them to different variables
    a, b, c, d = random_digits
    
    print(a, b, c, d)

    Это сгенерирует 4 случайных цифры от 1 до 9 и назначит их 4 различным переменным a, b, c, d соответственно
    Ответ написан
    1 комментарий
  • Какие решения существуют для поиска кадров в небольшую команду?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Подъëм зарплаты всегда работает.
    Ответ написан
    Комментировать
  • Как вычислить виновника из-за которого отваливается интернет с какой-то периодичностью в маленькой сети?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Такого рода проблемы все и всегда решаются однотипно.
    1. Необходимо сформулировать критерии наличия проблемы.
    Как именно пропадает интернет, насколько часто, как надолго. Это нужно для диагностики. поиска причины и определения ушла ли проблема после принятия каких либо мер.
    2. Делить проблему на части и проверять части по отдельности.
    Самый эффективный способ делить - это пополам. Отсекаем часть сети и проверяем наличие проблемы в обеих частях (если есть возможность) или в одной из частей.
    3. Когда найден минимальный проблемный участок, который уже нельзя или бессмысленно делить - заменяем его.
    4. Помним, что чаще всего сложные проблемы - это композиция нескольких более простых. которые по отдельности могут не проявляться. В вашем случае может быть проблема, связанная с нагрузкой на роутер, например, которую создает один из услов из-за плохого контакта обжима и большого объёма биттых пакетов. Устранив одну из причин, вы, может быть, сделаете проявления проблемы реже, но не устраните её полностью. К примеру, если замените ротуер, битые пакеты будут всё равно будут нагружать вашу сеть и портить ее производительность, но это будет не так очевидно. Переобжав коннектор вы избавитесь от части нагрузки, но еслив ваш ротуер работал на переделе, то лишний вафай-клиент или тяжелый видос в сети сможет его снова нагрузить до критического снижения производительности.

    Итак, пробежимся по перечисленным пунктам сначала.
    1. Критерии. Поиск критериев - это часть решения. Обычно в этом случае нуно сорать необходимую статистику. Есть куча софта, который это умеет делать, но пинг есть всегда под рукой.
    Для этой тулзы есть две полезных опции: ключ для бесконечного пинга и размер пакета.
    В разных ОС эти ключи немного разные, поэтому ищите их отдельно, у меня нет винды под рукой, поэтому не стану на этом заострять.
    Скаж лишь, что пинговать лучше большими пакетами, жалетально превышающими размер TTL, прописанный в роутере. Тогда такой пинг будет реже проскакивать в периоды хорошей связи, то есть выловит больше пролблем.
    Пинговать нужно в отдельных окнах сразу несколько хостов:
    - ya.ru - этот хост всегда отвечает на пинги и выявит проблемы с DNS
    - 8.8.8.8 - это гугловый DNS-сервер, тоже всегда отвечает на пинги, покажет, что связь с инетом есть даже если DNS, прописанныйна компе не правильно работает.
    - 192.168.0.1 - или какой там IP у вашего роутера. Нужно. чтбы отделить проблемы с инетом от проблем с внутренней связностью до роутера
    - 192.168.0.x - ip одного из компов в сети. Я обычно пингую несколько компов, доступных через баксимальное число потенциально проблемных узлов - ethernet-розеток, свичей, вайфай-соединений... Этот пинг поможет понять где проблема, во внутрисетевой связности или в последней миле.

    Учтите, что проблемы часто бывают комбинированные и каждое сочетание симптомов будет свидетельствовать о раных проблемах.
    Да, тревожным принаком может служить не только пропадание пакетов, но и скачки в длительности их возврата, особенно если такие длительности достигают 500мс и выше. Но и скачки от 3мс до 250мс тоже будут свидетельствовать о каких-то проблемах.

    Запускать пинг на всех компах лучше одновременно и на некоторое время. Например минут на 20. Потом по статистике будет видно сколько где пакетов пропало.

    2. Если критерии наличия проблемы позволяют, то можно попробовать отрубать части сети и смотреть наличие проблемы. Это я в том смысле, что если проблема происходит в среднем раз в пару-тройку часов, то отрубать на многие часы части сети при диагностикем ожет быть неприемлемым.
    Редкеи пробемы дольше отлавливать. Но напоминаю, что критерии можно детализировать, ведь если пакеты у вас пропадат относительно редко, то скачки времени их возврата могут случаться чаще и подсвечивать проблему. Также можно сделать рамер пакета близким к максимальному, это должно тоже в некоторых случаях участить проявление проблемы.
    Иногда не мешает нагрузить сеть комированием по локалке большого файла. В линуксе можнно с помощью утилиты tc послать большой поток рандомных байт на любой сокет..
    3. Плавающие проблемы случаются из-за плохого обжима, перебитого жверью кабеля, перегрызенного UTP в плинтусе, из-за умиращих конденсаторов в блоке питания роутера (БП может не выдавать необходимого при нагрузках тока, но вольтметром такая неисправность не будет различима без нагрузки). Вообще старые (да и не только) роутеры могут страдать поплывшими электролитическими конденсаторами не только в блоках питания.
    Хорошо, когда можно подменить роутер.
    4. ну с четвертым пунктом ничего не пососветуешь, только разделать и тестировать все по отедльности и в разных сочетания и да поможет нам ктулху.

    А для тех, кто дочитал этот опус до конйа - интересная задачка. Что пингуют эти команды, как и почему?
    ping 1.1
    ping 2130706433

    Тех, кто знает, попрошу не спойлерить=)
    Пусть для кого-то будет сюрпризом этот дивный мир=)

    UPD. Простите за адское количество опечаток в тексте. Писал в спешке и с непривычной клавиатуры. Исправлю всё попозже. Не ожидал, что многим ответ придётся по душе. Вроде ж накапитанил как мог.
    Ответ написан
    5 комментариев
  • Можно ли сделать проверку и выводить элемент если он существует?

    Vindicar
    @Vindicar
    RTFM!
    Читай, как пользоваться словарями. В частности, метод get().
    Ответ написан
    Комментировать
  • Как исправить ошибку TeleBot.add_callback_query_handler() got an unexpected keyword argument 'func'?

    Lord_of_Rings
    @Lord_of_Rings Куратор тега Python
    Дунадан - северный странник. Злой, но очень добрый
    В документации читаем

    add_callback_query_handler(handler_dict)

    Adds a callback request handler Note that you should use register_callback_query_handler to add callback_query_handler to the bot.

    PARAMETERS
    handler_dict –

    RETURNS


    Поэтому ваш код будет выглядеть так
    import telebot
    from telebot import types
    
    bot = telebot.TeleBot('-----')
    
    @bot.message_handler(commands=['start'])
    def button(message):
        markup = types.InlineKeyboardMarkup(row_width=2)
        item = types.InlineKeyboardButton('start', callback_data='start')
        item2 = types.InlineKeyboardButton('sixes', callback_data='sixes')
        item3 = types.InlineKeyboardButton('info', callback_data='info')
        item4 = types.InlineKeyboardButton('creator', callback_data='creator')
        markup.add(item, item2, item3, item4)
    
        bot.send_message(message.chat.id, '------', reply_markup=markup)
    
    
    @bot.callback_query_handler(func=lambda call:True)
    def callback(call):
        if call.message:
            if call.data == 'start':
                bot.send_message(call.message.caht.id, '-------')
    
    
    bot.polling(none_stop=True)
    Ответ написан
    Комментировать
  • Написание кода коротко плохо?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Оба варианта хорошие. Но обычно если ты работаешь отладчиком и тебе
    интересно где логика ведет себя не так - то второй вариант удобнее.

    Однострочники хороши только когда ты досконально понимаешь
    что внутри них происходит.
    Ответ написан
    8 комментариев
  • Хочу развивать свой проект в коммерческом ключе, где можно черпать знания?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Начать и делать.
    Учиться на собственных ошибках.
    Либо пойти в ВУЗ и набраться знаний, а потом - читай выше
    Ответ написан
    Комментировать
  • Как сделать проверку базы данных, на наличие новых записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно такие системы строят не на основе БД а на основе системы сообщений (messageMQ). Это - более современный и рациональный подход. Не бот долбит БД а MQ уведомляет бота о каком-то событии.
    Ответ написан
    7 комментариев
  • В чем Базовая суть async функций?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Чтобы понять async нужно в принципе понимать мультизадачность.

    Есть два вида мультизадачки. Первая базируется на preemptive multitasking. Это классика на потоках (Threads). Подходит для приложений где есть нагрузка на CPU и мало I/O. Пример таких приложений - рендеринг 3Д графики. Майнинг.

    И есть второй вид когда есть много I/O а нагрузка на процессор - малая и ее можно считать неизменяющейся. Как обработчик событий. Ее делают на async/await. Или еще на мультиплексированном I/O. Она подходит для веб-серверов. Яркий пример - nginx. Или системы обрабоки MQ. Сокет-серверы. Файловые серверы и прочее.

    Поэтому изучать async в отрыве от всех методов организации мультизадачности - безсмысленно. Вы ничего не поймете пока не узнаете все use-cases использования железа и ОС. Чтоб понять async - поймите классику.

    UPD: Fixed
    Ответ написан
    2 комментария
  • Многоуровневое меню в Bot Telegram, как сделать кнопку назад на каждом уровне?

    @helldess
    Делаешь кнопку, в ней callback_data='что-то' отлавливаешь этот callback хендлером и просто отправляешь тоже самое, что было на прошлом уровне.
    Ответ написан
    Комментировать