Это копия, сохраненная 6 февраля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий: >>2509442 (OP)
Литература:
https://ln2.sync.com/dl/cf2c1d070#xq4s328t-xbbjys2z-9r6j7ss7-gf4e9dv6 <-- Книжки, новое собрание
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://goonlinetools.com/snapshot/share/ - для листингов, без регистрации, но с капчей
#######################################
Вопросы-ответы:
— С чего начать изучать питон?
У питона намного лучше официальная документация, чем у большинства других языков. Есть там и учебное пособие для начинающих: https://docs.python.org/3/tutorial/introduction.html , неофициальный перевод на русский язык: https://digitology.tech/docs/python_3/tutorial/introduction.html (для питона версии 3.8, но разницы почти нет)
— Какие книги считаются лучшими?
На слуху чаще всего Лутц, но там очень много воды. Ещё на слуху Марк Саммерфильд, Эл Свейгарт "Автоматизация рутинных задач с помощью python". Эти книги рекомендуют чаще всего, но книги довольно старые, а питон развивается.
— Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0
— А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать даже для версий 1.x, т.к. принципы остаются теми же. Но лучше хотя бы с версии 2.0, слишком много мелких изменений в базе.
— Какие веб-фреймворки стоит учить в начале двадцатых?
Что бы не говорили, Джанго живее всех живых и умирать не собирается (и Django REST Framework), очень перспективный асинхронный FastAPI, асинхронный AioHTTP. Flask ещё где-то используется, но уже legacy. Прочие фреймворки или у нас экзотика, или это вымирающее легаси как Торнадо.
— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но частично переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Ролик на американском языке про многопоточность и асинхронность, построение своего event loop с нуля, помогает понять, как устроена асинхронность внутри: https://www.youtube.com/watch?v=MCs5OvhV9S4
— Можно ли на питоне делать мобильные приложения?
Да, смотри на фреймворк Kivy https://en.wikipedia.org/wiki/Kivy_(framework) https://kivy.readthedocs.io но народ на него жалуется
— Как можно без лишней возни ускорить программу на питоне
1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь.
2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём
Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
старая версия шапки, треды 90-148 и ранее: https://dumpz.org/bASGKD8cCFDf
ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником.
текущий исходник: https://goonlinetools.com/snapshot/code/#8gd2g1snu3l8i26k0bc6k9
Это и самому позволяет лучше разобраться, иногда затрагивает сторонние для меня темы, или там могут быть вопросы, которые логичны, но которые я сам себе не задавал почему-то.
Функции это инструмент, классы инструмент и питон — тоже инструмент. Инструменты бывают производительнее, понятнее, безопаснее или удобнее, и всё, никакого высшего смысла использовать одно вместо другого. Используешь по своим нуждам. И придётся ориентироваться на инструменты которые используют другие, если хочешь вместе с кем-то код писать и не быть белой вороной, да, что опять же вопрос нужд. А смысл — это человеческая абстракция мышления, артефакт работы мышления. Его нет ни в классах, ни в жизни.
что несёт дебил блять. если питон 4 не будет вводить ничего в сам язык, нахуя ему версию менять? остатки питона второго додавили, скучно стало?
Постараюсь. Если напишешь вопросы тут или напишешь мне на дискорд. Я правда не знаю как запостить, так как меня банили за айдишник тут.
Если вычесть джуновы вакансии датасаенса и мл, сколько останется бэкенд вакансий? Будет ли тогда в питон вкатиться все еще легче, чем в джаву? А за пределами рф?
Когда ты вкатываешься в бэкенд, ты вкатываешься именно в бэкенд, а не питон. Основной объём знаний соответствующий
Вкатиться сложно, бэкенд вакансий мало, вне джанго-стека. Особенно джун-вакансий.
Если не будет ничего нового, то зачем тогда выпускать 4,0? А? А? А?
Это тред про устройство на работу? Ты отклики тоже на должности химиков и юристов кидаешь?
Рисовать можешь любой. На техсобесе синьор-помидор, если не на отъебись набирает народ, чтоб закрыть просто ваклуху, наводящими вопросами это прочухает.
Пздц, а мне тестовое раза 3-4 присылали, но я каждый раз сливался
Нужно сделать эндпоинт только для одной цели - принимать здоровенный, в несколько гб пост с джейсоном и писать его на диск, и создавать событие по окончанию записи
Соответственно это говно должно быть асинхронным и а дальнейшем расширяемым до авторизации и тд.
Стоит ли смотреть на фласк или накорячить на http.server? или может aiohttp?
500
Меньше
250
Меньше
125
Меньше
63
Больше
94
Больше
109
Больше
117
Больше
121
Больше
123
Угадал!
Ебал в рот тупой спам-лист
И даже правило про округление до чётного не применить.
Может быть на глаз кто-то написал. Да и что меняется то, суть то та же? Или хочешь прям такие же значения получить? Ну держи, вот, это всегда пожалуйста. Применяя правила округления к (n1+n2)/2 или к (n2-n1)/2 можно получить желаемое.
Спс, попробую. Интересно, они специально так сделали для повышения сложности или им просто пофиг было?
Хотя у них в задании на циклы одним из последним идет какая-то задача на хэш-функции. Может и специально так хитро встраивают неочевидные моменты в простые на первый взгляд задачки.
Вот есть молоток это инструмент. Молоток нужен чтобы забивать гвозди в поверхность, вот есть микроскоп, это инструмент, микроскоп нужен чтобы рассматривать мелкие детали.
Разница между назначением этих инструментов понятна и даже очевидна. И ты не будешь забивать гвозди микроскопом, хотя в принципе мог бы.
#---------
Вот есть функция. Функция нужна чтобы отделить и обособить фрагмент кода в соответствии с методологией ООП. Вот есть класс. Класс нужен чтобы отделить и обособить фрагмент кода в соответствии с методологией ООП.
Вопрос от Жака Фреско. А нахуя нужно два одинаковых инструмента?
Не так. Функция - это организация кода. Функция сортировки, например.
А класс - организация данных. На вопрос что такое класс сортировки - я смогу только гипотезы примерные выдвинуть, так как не очень ясно что это.
И то же самое в обратную сторону, что такое класс ползунка (который элемент интерфейса) - понятно. А вот что такое функция ползунка я не могу ответить. Будет интересно если ответить сможешь ты.
Т.е. между классом и функцией можно поставить знак равенства. Суть у них одна и так же только название разное - чтобы человеческие мешки с костями не путались (ООП)
> чтобы человеческие мешки с костями не путались
Для нечеловеческих мешков с чипами не существует ни функций ни классов, а только инструкции, которые всё идут-идут и никак не заканчиваются.
Да.
Ладно, возвращаюсь к своей политике отвечать только по коду.
Приходи когда будет код и не понятно как он работает или работает не совсем правильно, или когда будет не совсем ясно как сделать фича-нейм.
Я с самого начала пытался понять есть ли в "инструменте класс" какие-то фактические отличия от "инструмента функция", но почему-то УЧИТЕЛЯ не могут прямо ответить на этот вопрос: мол так и так, нихуя различий нет, классы нужны только чтобы челики не путались, это функция которая просто называется другим словом.
Вместо этого УЧИТЕЛЯ начинают какую-то ментальную гимнастику, вилять тазом, обтекаемо рассказывать про машину с дверями и прочую хуйню-малафью.
Вот человек хочет понять СУТЬ явления, а она такова что это функция под другим словом. ООП? Очень хорошо. очень важно. Но почему просто так и не ответить. Ладно, Бог с вами.
>Вместо этого УЧИТЕЛЯ начинают какую-то ментальную гимнастику, вилять тазом, обтекаемо рассказывать про машину с дверями и прочую хуйню-малафью.
Я почитал ваши диалоги. Тебе пытались объяснить абстракцию, через её назначение, через её составные части, и через другие абстракции. К сожалению, я не знаю других способов объяснить абстракцию. Ты знаешь другие способы? Типа, чем лес отличается от рощи?
Уже 10 раз объяснили чем отличается функция от класса и ты продолжаешь срать про СУТЬ.
СУТЬ в том, что функция берёт ЧТО-ТО, делает что-то (а может и не делать) с этим ЧТО-ТО и возвращает ЧТО-ТО (а может не возвращать), а класс КОНКРЕТИЗИРУЕТ ЭТО ЧТО-ТО, придаёт ему больше смысла ДЛЯ ЧЕЛОВЕКА и даёт ЧЕЛОВЕКУ возможность с этим ЧТО-ТО оперировать не как с ЧТО-ТО, а как с чем-то КОНКРЕТНЫМ.
Как же ты меня вывел, хуесосная пидарасина.
У тебя есть код, в котором есть ФУНКЦИЯ "РЕЗАТЬ", ты этой ФУНКЦИЕЙ можешь резать СТЕЙКИ, БУМАГУ, ВЕБМКИ, СВОЮ МАТУХУ или УЗДЕЧКУ.
А так же у тебя есть другой код, в котором есть абстрактный КЛАСС "РЕЗАЕМОЕ", от которого на КОНКРЕТНОМ уровне наследования ты можешь создать классы "СТЕЙК", "БУМАГА", "ВЕБМКА" и т.д., и у КАЖДОГО ИЗ НИХ будет СВОЙ метод "РЕЗАТЬ".
И вот теперь представь, когда у тебя по диагонали кода гуляют РАЗНОТИПНЫЕ данные.
В первом случае ты на эти данные натравливаешь ФУНКЦИИ и ожидаешь какое-то ПОВЕДЕНИЕ. Тебе надо ВНУТРИ ФУНКЦИИ описывать ПОВЕДЕНИЕ для КАЖДОГО ТИПА.
В втором случае ты ОБОРАЧИВАЕШЬ эти данные КЛАССАМИ, придаёшь им КОНКРЕТНЫЙ ТИП и соответствующее ему ПОВЕДЕНИЕ через методы.
>это функция которая просто называется другим словом
Тебе уже приводили примеры, что в разных языках это может работать по-разному.
В жаваскрипте классы это синтаксический сахар над функциями.
В питоне функции и классы это разные типы объектов.
В джаве функции это методы класса Main, т.е. там все функции это методы классов.
В си нет классов, только функции, но есть структуры, которые позволяют эмулировать классы.
В итоге мы получаем, что ни функции ни классы нахуй не нужны, ты можешь сплошняком объявлять по всему коду переменные и делать с ними что хочешь через базовые операторы. Вот только за такой код пизды дают.
Если ты все задачи будешь решать только функциями без использования классов, то в 80% задач (если на в 98%) на питоне ты будешь микроскопом забивать гвозди. Решать задачи только классами без функций ты не можешь в принципе, так как методы класса - тоже функции.
Да, ты всё ещё можешь написать любую программу только на функциях без своих классов, никто и не говорил что этого сделать нельзя, говорят что ты с ножа есть собираешься.
ООП, это не только абстракция для человека. Если ты посмотришь не на интерпретируемый питон, а на с++ тот же, прочитаешь как работает таблица виртуальных методов и (бесполезный) динамический полиморфизм, то лучше поймёшь разницу (как ты вообще, мать его, можешь её не видеть?)
Развитие шло примерно как:
1. Голый линейный код, его ещё вбивали вручную на эвм, для самых рутинных задач.
2. Условные переходы на строчки и метки, это уже ассемблер.
3. Функции и структуры (класс без методов, просто несколько именованных параметров), это уровень си. Вот тут очень хорошо видно расслоение, что структуры - это просто синтаксический сахар для куска данных, ты можешь обращаться к координатам вектора p1, как к p1.x и p1.y, а не как к данным по адресам [p1+0] и [p1+8]. А функции - это код. Ты не можешь писать код в структурах, или размешать данные в функциях.
4. Классы, наследование и прочий ооп-мусор, это уже с++, питон и прочее. Ещё здесь обобщённое программирование появляется. В классах уже можно размещать код, но имхо будет правильнее сказать, что класс, это набор полей (данных) и список методов (что с данными можно сделать), а вот сами методы, это уже функции. Метод это же и есть функция, которой передаётся объект первым аргументом.
Вот давай с конца пример и приведу. Обобщённое программирование. Ты пишешь код, который работает для разных типов данных. Функция, которая работает и со строками произвольной длины, и с векторами, и с множествами, и с простыми числами. Ты можешь написать обобщённую функцию сортировки, которая будет сортировать любые объекты для которых определён оператор <.
Что это даёт? Тебе не нужно копипастить свой код для нового типа, который ты используешь только в своей программе. Быстрее разработка, меньше возможности ошибиться, так как тебе только оператор сравнения больше-меньше нужно сделать.
Дальше. Классы. Пример с sfml, смотрел же код? У тебя есть класс квадратного перемещаемого объекта. Все кнопки, надписи, текстуры, и другие объекты обладающие прямоугольным размером и позицией просто наследуются от сущности квадратности. Я вот когда такое делал, я просто копировал, хули там, пару строчек для координат. Но потом я добавил ещё тип обладающий прямоугольностью, и ошибся, так как в виндоус у тебя координаты от левого верхнего, а в opengl от левого нижнего. Угу, я вынес это в отдельный класс, весь код для координат вместо трёх копий оказался в одном месте, и при добавлении функции проверки вписан ли один прямоугольник во второй мне достаточно добавить только в одном месте нужный код. А ещё это в миллион раз проще тестировать, чем монолитный код. Что это даёт? Да всё то же, быстрее разработка, намного устойчивее к человеческим ошибкам, намного проще читать чужой код. Функции и структуры. Пример с [p1+0] и [p1+8] я уже привёл. А представь, что у тебя есть юнит в коде игры, у него характеристики брони и атаки, координат и поведения, и вдруг ты решил добавить ему ману. И тебе везде в коде нужно p1+32 заменять на p1+40. А на бумажке у тебя отдельно должно быть выписано описание всех таких типов, и это нужно быть нечеловечески внимательным, чтобы с нормальной скоростью разрабатывать код.
Если что, ранний с++ компилировался в си. Разворачивая код из классов в функции. А шаблоны даже сейчас разворачиваются в обычный код для обычных типов, просто прозрачным для человека образом. Вообще весь код сейчас сводиться к машинным инструкциям тем же, часто через промежуточное представление в виде ассемблера, или даже через несколько промежуточных представлений. Можешь прочитать про clang, там прям всё это описано какие стадии.
Ещё раз, что в итоге.
Ты можешь использовать все средства выразительности, и чтобы сделать калькулятор как пикрелейтед тебе нужно:
30 минут на питоне. Нагуглить как кнопки ставить и поле ввода, на этом твоя работа закончится. Код будет строк на 100-200, коротких и легко просматриваемых.
40-60 минут на с++ (если всё настроено). Там менее дружелюбная инфраструктура языка, скорее всего будет знак квадратного корня не выводится или ещё что-то такое. Медленнее, так как в питоне ide получше, и ты только управляющий код пишешь, который часто можно чуть ли не угадать. По коду скорее всего то же самое или немного больше.
60-120 минут на си. Тебе придётся память от строки ввода вручную удалить. И если забудешь, будет утечка памяти. А вместо функции у каждой кнопки - тебе придётся каллбек регестрировать скорее всего, так как интерфейс (в плане кода) либ или winapi не особо дружелюбный. И строк кода будет 500+.
≈300 минут на ассемблере, так как даже просто вызвать функцию создания окна с нужными параметрами - это то ещё приключение.
Это при том, что у тебя нет никаких массивов данных, строк или других сложных объектов в калькуляторе.
Если ты пишешь компьютерную игру, не дай бог стратегию или ещё что-то с кучей разнообразных объектов, то (отказываясь от очередной абстракции) количество кода будет отличаться в 5 раз, количество мест где можно ошибиться в 30 раз, ты просто первую версию будешь писать в разы дольше, а потом год будешь исправлять ошибки и баги, так как ты не робот, а новый коллега приходящий в твой проект хоть что-то полезное сможет сделать через месяц изучения уже имеющегося кода.
Классы дают тебе и некоторую модульность, так что сущность прямоугольности (как в sfml) находится в одном месте, там же отлаживается и проверяется, и возможность одновременно работать даже с достаточно тесно взаимосвязанными объектами без накладных расходов по времени разработки (и часто без накладных расходов по производительности). В случае квадратности или любого другого тривиального примера ты можешь и копипастить код, да, но в любой сложной задаче это заметно увеличивает время разработки и количество потенциальных ошибок.
Ты хочешь ответ в чём качественная разница если можно код без классов писать? Ну, её какбы и нет. Ты можешь любой код без классов писать. Но и говорить что нет разницы между 1 и 100 неверно.
Классы настолько существенно могут улучшить надёжность, читаемость, понятность, портируемость (при переносе на новую версию или другую платформу с другой либой) и кучу других характеристик, что разница примерно на уровне "это программа средней сложности для одного программиста" и "это невозможно написать с достаточным качеством без команды опытных программистов и года разработки и тестирования". Человеческий фактор настолько влияет, что из-за громоздкости кода программа с классами может быть даже производительнее.
Можно ещё без циклов кстати писать любой код, используя только рекурсивные функции. Можно вместо переменных использовать один массив на 12312312 элементов, и всё размещать в нём.
Если ты все задачи будешь решать только функциями без использования классов, то в 80% задач (если на в 98%) на питоне ты будешь микроскопом забивать гвозди. Решать задачи только классами без функций ты не можешь в принципе, так как методы класса - тоже функции.
Да, ты всё ещё можешь написать любую программу только на функциях без своих классов, никто и не говорил что этого сделать нельзя, говорят что ты с ножа есть собираешься.
ООП, это не только абстракция для человека. Если ты посмотришь не на интерпретируемый питон, а на с++ тот же, прочитаешь как работает таблица виртуальных методов и (бесполезный) динамический полиморфизм, то лучше поймёшь разницу (как ты вообще, мать его, можешь её не видеть?)
Развитие шло примерно как:
1. Голый линейный код, его ещё вбивали вручную на эвм, для самых рутинных задач.
2. Условные переходы на строчки и метки, это уже ассемблер.
3. Функции и структуры (класс без методов, просто несколько именованных параметров), это уровень си. Вот тут очень хорошо видно расслоение, что структуры - это просто синтаксический сахар для куска данных, ты можешь обращаться к координатам вектора p1, как к p1.x и p1.y, а не как к данным по адресам [p1+0] и [p1+8]. А функции - это код. Ты не можешь писать код в структурах, или размешать данные в функциях.
4. Классы, наследование и прочий ооп-мусор, это уже с++, питон и прочее. Ещё здесь обобщённое программирование появляется. В классах уже можно размещать код, но имхо будет правильнее сказать, что класс, это набор полей (данных) и список методов (что с данными можно сделать), а вот сами методы, это уже функции. Метод это же и есть функция, которой передаётся объект первым аргументом.
Вот давай с конца пример и приведу. Обобщённое программирование. Ты пишешь код, который работает для разных типов данных. Функция, которая работает и со строками произвольной длины, и с векторами, и с множествами, и с простыми числами. Ты можешь написать обобщённую функцию сортировки, которая будет сортировать любые объекты для которых определён оператор <.
Что это даёт? Тебе не нужно копипастить свой код для нового типа, который ты используешь только в своей программе. Быстрее разработка, меньше возможности ошибиться, так как тебе только оператор сравнения больше-меньше нужно сделать.
Дальше. Классы. Пример с sfml, смотрел же код? У тебя есть класс квадратного перемещаемого объекта. Все кнопки, надписи, текстуры, и другие объекты обладающие прямоугольным размером и позицией просто наследуются от сущности квадратности. Я вот когда такое делал, я просто копировал, хули там, пару строчек для координат. Но потом я добавил ещё тип обладающий прямоугольностью, и ошибся, так как в виндоус у тебя координаты от левого верхнего, а в opengl от левого нижнего. Угу, я вынес это в отдельный класс, весь код для координат вместо трёх копий оказался в одном месте, и при добавлении функции проверки вписан ли один прямоугольник во второй мне достаточно добавить только в одном месте нужный код. А ещё это в миллион раз проще тестировать, чем монолитный код. Что это даёт? Да всё то же, быстрее разработка, намного устойчивее к человеческим ошибкам, намного проще читать чужой код. Функции и структуры. Пример с [p1+0] и [p1+8] я уже привёл. А представь, что у тебя есть юнит в коде игры, у него характеристики брони и атаки, координат и поведения, и вдруг ты решил добавить ему ману. И тебе везде в коде нужно p1+32 заменять на p1+40. А на бумажке у тебя отдельно должно быть выписано описание всех таких типов, и это нужно быть нечеловечески внимательным, чтобы с нормальной скоростью разрабатывать код.
Если что, ранний с++ компилировался в си. Разворачивая код из классов в функции. А шаблоны даже сейчас разворачиваются в обычный код для обычных типов, просто прозрачным для человека образом. Вообще весь код сейчас сводиться к машинным инструкциям тем же, часто через промежуточное представление в виде ассемблера, или даже через несколько промежуточных представлений. Можешь прочитать про clang, там прям всё это описано какие стадии.
Ещё раз, что в итоге.
Ты можешь использовать все средства выразительности, и чтобы сделать калькулятор как пикрелейтед тебе нужно:
30 минут на питоне. Нагуглить как кнопки ставить и поле ввода, на этом твоя работа закончится. Код будет строк на 100-200, коротких и легко просматриваемых.
40-60 минут на с++ (если всё настроено). Там менее дружелюбная инфраструктура языка, скорее всего будет знак квадратного корня не выводится или ещё что-то такое. Медленнее, так как в питоне ide получше, и ты только управляющий код пишешь, который часто можно чуть ли не угадать. По коду скорее всего то же самое или немного больше.
60-120 минут на си. Тебе придётся память от строки ввода вручную удалить. И если забудешь, будет утечка памяти. А вместо функции у каждой кнопки - тебе придётся каллбек регестрировать скорее всего, так как интерфейс (в плане кода) либ или winapi не особо дружелюбный. И строк кода будет 500+.
≈300 минут на ассемблере, так как даже просто вызвать функцию создания окна с нужными параметрами - это то ещё приключение.
Это при том, что у тебя нет никаких массивов данных, строк или других сложных объектов в калькуляторе.
Если ты пишешь компьютерную игру, не дай бог стратегию или ещё что-то с кучей разнообразных объектов, то (отказываясь от очередной абстракции) количество кода будет отличаться в 5 раз, количество мест где можно ошибиться в 30 раз, ты просто первую версию будешь писать в разы дольше, а потом год будешь исправлять ошибки и баги, так как ты не робот, а новый коллега приходящий в твой проект хоть что-то полезное сможет сделать через месяц изучения уже имеющегося кода.
Классы дают тебе и некоторую модульность, так что сущность прямоугольности (как в sfml) находится в одном месте, там же отлаживается и проверяется, и возможность одновременно работать даже с достаточно тесно взаимосвязанными объектами без накладных расходов по времени разработки (и часто без накладных расходов по производительности). В случае квадратности или любого другого тривиального примера ты можешь и копипастить код, да, но в любой сложной задаче это заметно увеличивает время разработки и количество потенциальных ошибок.
Ты хочешь ответ в чём качественная разница если можно код без классов писать? Ну, её какбы и нет. Ты можешь любой код без классов писать. Но и говорить что нет разницы между 1 и 100 неверно.
Классы настолько существенно могут улучшить надёжность, читаемость, понятность, портируемость (при переносе на новую версию или другую платформу с другой либой) и кучу других характеристик, что разница примерно на уровне "это программа средней сложности для одного программиста" и "это невозможно написать с достаточным качеством без команды опытных программистов и года разработки и тестирования". Человеческий фактор настолько влияет, что из-за громоздкости кода программа с классами может быть даже производительнее.
Можно ещё без циклов кстати писать любой код, используя только рекурсивные функции. Можно вместо переменных использовать один массив на 12312312 элементов, и всё размещать в нём.
> чтобы сделать калькулятор как пикрелейтед тебе нужно: 30 минут на питоне.
мимовкатун второй час не могущий осилить глава 10 "Введение в инструкции языка Python"
Нет. Если я вкатываюсь в бэкенд на пайтон, то я учу джангу/дрф, если в джаву, то учу спринг.
Зачем искать вакансии вне джанго-стека?
ну тебе год потребовался, чтобы научиться ходить. но не значит что газануть за пивасиком для олдов треда сейчас займёт у тебя больше 5 минут
джун
Могу попробовать засечь и со стримом сделать интереса ради вариант на питоне и голом си, думаю близкие числа получатся.
бляядь, да сколько можно одно и то же пережевывать?
ООП сделали не для тебя. ООП не нужно программисту-индивидуалу сосредоточенному на своей узкой задачи.
ООП нужно для можества тупеньких все постоянно забывающих программистишек чтобы они друг другу не навредили (инкапсуляция) и могли развивать программу (полиморфизм)в ответ на постоянно изменяющие требования тупенького кабанчика.
ООП - ради денег кабанчика, а не ради тебя.
Исходи из этой предпосылки и все в ООП станет на свои места.
в принципе понятно чего ты ждешь:
хочешь чтобы тебе кратеньно выразили СУТЬ как будто внутри этих концепций какая-то великая математическая штука все объясняющая.
Но ее нет!
В математике и физике такое встречается, но мы имеем дело с кое-как сложившимися на практике, созданными разными людьми и не очень-то давно, штуками. Здесь не как в школе.
Но ты можешь пока для понимания использовать концепцию "ООП - это ради чужих денег".
Нет, только с одним шизиком, который срёт из треда в тред.
from selenium import webdriver
browser = webdriver.Chrome()
с пустым значением вот здесь Chrome() не указывая в скобках путь к вебдрайверу и всё вроде работает.
Ну и нафиг этот путь нужен, если и без него пашет? Или так в новых версиях, а в старых не работало?
есть python модуль расчета некоторых параметров (токи короткого замыкания) по введенным исходным данным. Ввод/вывод ведется через консоль. Есть идеи прикрутить к этому всему графический интерфейс для повышения удобства. Вопрос: какую GUI библиотеку лучше использовать?
Код: https://github.com/aspirmk/mrtkz
мой уровень знания питона: 0
Если он рядом со скриптом или по path, то можно без него, если где-то в жопе, то надо указывать, очевидно же.
pyguizero
а зачем ты в каждом репозитарии пишешь "модуль расчета хуитки" ? Никто эти модули импортировать никогда в свои программы не будет
с чего ты взял, что у меня есть лишний хуй для тебя?
Блять, вот был бы такой же урок, но на нормальном английском, просто невыносимо слушать этот индийский бубнеж
@dp.message_handler(content_types = types.ContentType.TEXT)
async def send_welcome(message: types.Message):
img = Image.open("C:/Users/MY MSI/Desktop/gaduka/nazi_nigger.jpg")
draw = ImageDraw.Draw(img)
draw.text((450, 450), str(message.text), (255, 255, 255))
img.save('nazi_nigger1.jpg')
photo = open('C:/Users/MY MSI/Desktop/gaduka/nazi_nigger1.jpg', 'rb')
await bot.send_photo(message.chat.id, photo)
Ты прикалываешься, да?
Ты мог бы три слова написать в поисковик (или в документацию Pillow, даже просто мышку на функцию навести), и найти решение.
https://stackoverflow.com/questions/2726171/how-to-change-font-size-using-the-python-imagedraw-library
я новичок(
>>29310
Я поменял код но мне выдает ошибку positional argument follows keyword argument.
@dp.message_handler(content_types = types.ContentType.TEXT)
async def send_welcome(message: types.Message):
font = ImageFont.truetype('arial.ttf',15)
img = Image.open("C:/Users/MY MSI/Desktop/gaduka/nazi_nigger.jpg")
draw = ImageDraw.Draw(img)
draw.text((450, 750), str(message.text),font = font, (255, 255, 255))
img.save('nazi_nigger1.jpg')
photo = open('C:/Users/MY MSI/Desktop/gaduka/nazi_nigger1.jpg', 'rb')
await bot.send_photo(message.chat.id, photo)
>draw.text((450, 750), str(message.text),font = font, (255, 255, 255))
Ты не можешь сначала указать параметр со знаком равенства, а потом указать без равенства. Именованные параметры неупорядочнены, оно не понимает какой параметр равен твоим (255, 255, 255). И это тоже должно гуглиться в первом ответе, если скопируешь туда ошибку.
Один из отцов основателей ООП, создатель языка Smalltalk, Alan Kay писал, что в ООП главное не объекты, а сообщения.
Ты спрашиваешь "нахуя классы, когда есть функции", это как "нахуя книги, когда есть слова". Конечно, есть сообщения, которые можно передать одним словом на заборе, но более сложные сообщения-идеи передаются книгой состоящей из слов. Так и в программировании есть задачи, решаемые отдельной функцией. Но более сложные задачи состоят из множества функций, организованных в класс.
Дрочу сейчас сортировку списков, а именно selection. Пытаюсь изобрести велосипед и написать его вручную.
https://pastebin.com/dqr0B1sx
Почему он сортирует только первые несколько значений? Я уже блять и готовый код этой сортировки нагуглил. Но мне принципиально интересно почему мой вариант не работает.
Посмотри пошаговый ход выполнения своего кода в Thonny, в Пайчарме вроде такое было. Или тут
https://pythontutor.com/visualize.html#mode=edit
Я мимо шел, но ты подменяешь понятия. Организация нескольких функций в единое нечто не эквивалентно классу в ООП смысле, это скорее обычный модуль. Класс от модуля отличается тем, что модуль - всегда синглтон, а класс, как правило, нужно инстанциировать
в списке есть повторяющиеся числа
a.index(minim) возвращает индекс первого minim
а тебе надо того который сидит на i+j+1
Проверял пошагово. В конце кода числа просто не меняются местами
Хм.. не думал в эту сторону. Спасибо, буду пробовать переделывать
Введение и типы наверное.
Молодец котенька!
Нормальных либ нет, только прокидывания к C,C++ либам, в основном- старым как говно мамонта, естественно, с кучей дыр и уязвимостей. Только конченные кретины юзают ёбаный петухон в проде.
Годится только как школьный язык для обучения, да и то, в спецшколе для даунов.
Ясно.
для такого лучше всего tkinter использовать
Разработчик: Ерохин Чедислав
5к звёзд, во всех awesome-raschyoti листах, на первых позициях подборок на гитхабе, все импортируют его модули даже когда они не нужны в проекте, из гугла и амазона звонят благодарят за отличный модуль
>А предыдущие 9 глав это что??
0. ПРЕДИСЛОВИЕ ОТ АВТОРА
1. КРАТКАЯ ИСТОРИЯ ЧЕЛОВЕЧЕСТВА
2. ЧТО ТАКОЕ КОМПЬЮТЕР
3. ЧТО ТАКОЕ ПРОГРАММИРОВАНИЕ
4. ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ
5. ЯЗЫКИ ПРОГРАММИРОВАНИЯ: КАКИЕ ОНИ БЫВАЮТ
6. ТИПИЗАЦИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
7. ДИНАМИЧЕСКИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ
8. ИСТОРИЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ PYTHON
9. УСТАНОВКА ИНТЕРПРЕТАТОРА PYTHON В ОС WINDOWS VISTA
>На слуху чаще всего Лутц, но там очень много воды
так-то я шучу. не все так плохо. просто чуть-чуть поник от масштабности задачи. надо бы уже сейчас за полчаса такие вот калькуляторы писать, а реально понимаю что надо три-четыре месяца как минимум долбиться, чтобы хотя бы за день что-то можно было сделать полезное. в общем похуй, как-нибудь... я вкатываюсь не для карьеры программиста, не вытяну и хрен с ним.
кстати лутц реально хорошо поясняет. это у меня четвертый учебник в списке. у меня методика обучения своя, оригинальная - количеством беру. накидываю как можно больше в башку по теме, не задерживаясь особо на непонятном, пусть там мозг сам разбирается в фоновом режиме, а потом уже систематизирую по прошествии времени. вот у лутца очень хорошо с этой систематизацией - все качественно по полочкам раскладывает.
>>28605
да что там пиво, я бы отсосал олдфагам треда, если бы от этого непотребства хоть как-то процесс ускорился. но увы.. поэтому пролетел ты с пивком.
ну основы-то не изменились, наверное. а мне пока фундамент надо заливать качественный. нюансы потом можно добить отдельно, если нужны будут.
Всем привет, нужна помощь по джанге, если вам не сложно.
Пытаюсь сделать fail2ban в LoginUser
Переопределил методы form_valid и form_invalid для подсчета правильных / неправильных попыток, заполнения статистики и блокировки конкретного ip-адреса (это все через запись в БД)
Осталось только запретить втечение определенного времени пользователю логиниться на сайт (ну, редиректить его со страницы логина на страницу блокировки)
Получилось сделать это через переопределение метода dispatch, оно работает, однако он ругается на то, что этот метод возвращает
return super(LoginUser, self).dispatch(request, args, *kwargs)
это его не устраивает
Находил в документации вариант, там тоже не получалось, ошибка.
Как быть, что делать?
Можно ли заблокировать использование логина без переопределения dispatch?
Пробовал через переопределение initial. в лог пишет, однако редиректа не происходит.
Госпаде, и ведь кто-то же такое читает...
Нихуя ты f завернул в f, затейник.
Почитал документацию, добавил
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, args, *kwargs)
Заработало.
Но все же: является ли переопределение метода dispatch лучшим вариантом перенаправления, если айпишник превысил количество неправильных вводов? Есть какие-то "бестпрактис"?
нет, питон даже не язык, а интерпретатор строк.
Без либ- он ничего не может.
А либы к питону пишут на Си.
Си- полноценный язык, к нему в каждой ОС есть abi, который позволяет писать программы настоящие, то есть бинарники под системы. 99% полезных программ написаны на Си.
Даже без всяких либ, из Си можно дергать системные api.
Так что ты в треде забыл, байтоёб? Написал уже свой велосипед компилятор? Нет? Ну тогда бегом писать. Думаешь всем не похуй, что питухон обёртка над СИ? Если мне надо будет какую-то числодробилку добавить, я возьму с so напишу библу на C/C++ и вызову из питона, либо сделаю на pypy. Но лучше после питона пойду гошечку попинаю, а после неё раст, а твоя учесть за границы массива не вылезать.
Веб, нейронки, визуализацию данных для ученых тоже на Си предлагаешь писать?
Тебе сколько лет, малыш? Тебя не учили в детстве, что разные инструменты - для разных целей?
Возможно этот чел не знает си. Обычно сикрикуны ничего на нем не написали, а просто вычитали что на нем можно делоть низкоуровневые брутальные вещи и что си это как скальпель хирурга для тонких и элегантных решений. Обычный сикрикун
Типичная пидораха. На словах знает всё лучше всех, но на деле взял отпуск и уволился 2 недели назад.
Там есть штрафы за снижение точности распознавания? Антифрод на сайте, не позволяющий так просто подключить бота? Покажи реальные примеры капчей, которые дают разгадывать. Может они намного сложнее, чем показывают в примерах.
Что если спереди фильтром поставить еще одну нейронку, которая кластеризирует типы капчей, а потом отправляет ее той нейронке, которая с таким типом хорошо справляется?
Ну для этого, для начала, нужны нейронки кторые все капчи умеют разгадывать т.е. как минимум тренированы на них и тестировались.
Короче владельцы этого сайта могут реализовать такой подход, и для них это бы имело смысл, все популярные капчи отправлять к нн, а новые или спорные варианты капчи отсылать макакам, но Васяну с двача это сделать - собрать все возможные варианты капч, потом нейронки подготовить. Слишком сложно.
Traceback (most recent call last):
File "/home/ali/Temp/mal.py", line 12, in <module>
server = smtplib.SMTP('smtp.proton.me:1025')
File "/usr/lib/python3.10/smtplib.py", line 255, in __init__
(code, msg) = self.connect(host, port)
File "/usr/lib/python3.10/smtplib.py", line 341, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "/usr/lib/python3.10/smtplib.py", line 312, in _get_socket
return socket.create_connection((host, port), timeout,
File "/usr/lib/python3.10/socket.py", line 824, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
fromaddr = "
toaddr = "
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Test Subject"
body = "Write your message here"
msg.attach(MIMEText(body, 'plain'))
server = smtplib.SMTP('smtp.proton.me:1025')
server.starttls()
server.login(fromaddr, "пароль")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
Traceback (most recent call last):
File "/home/ali/Temp/mal.py", line 12, in <module>
server = smtplib.SMTP('smtp.proton.me:1025')
File "/usr/lib/python3.10/smtplib.py", line 255, in __init__
(code, msg) = self.connect(host, port)
File "/usr/lib/python3.10/smtplib.py", line 341, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "/usr/lib/python3.10/smtplib.py", line 312, in _get_socket
return socket.create_connection((host, port), timeout,
File "/usr/lib/python3.10/socket.py", line 824, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
fromaddr = "
toaddr = "
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Test Subject"
body = "Write your message here"
msg.attach(MIMEText(body, 'plain'))
server = smtplib.SMTP('smtp.proton.me:1025')
server.starttls()
server.login(fromaddr, "пароль")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
>Я с самого начала пытался понять есть ли в "инструменте класс" какие-то фактические отличия от "инструмента функция"
Ты на самом деле задал очень правильный вопрос, анон.
>но почему-то УЧИТЕЛЯ не могут прямо ответить на этот вопрос
Ну, это база, кто не умеет делать - тот учит на двачах.
В java-подобном ООП объект - это скоуп (структура данных, представляющая self) с навешанными на него методами. Инстанцироваться объекты могут на основе классов (пхп, джава, питон, руби) или из прототипов (жабаскрипт) или быть инстанцированными сразу при инициализации рантайма (классы в руби - это объекты-синглтоны).
Тут писали, что объекты - это способ структуризации кода. Это и да и нет. Как мы знаем, monkey.eat(banana) может быть заменено на eat(&mut monkey, banana) без потери смысла. Аноны утверждают якобы, что ООП нужно чтобы защитить дурачков от ошибки вида eat(&mut dog, banana). В нормальных языках можно добавить в структуру monkey мета-поле и чекать его компилятором до вызова функции eat. Поэтому нет, ООП не служит структуризации кода. Для чего же оно на самом деле нужно?
Ответ лежит здесь https://blog.cleancoder.com/uncle-bob/2018/04/13/FPvsOO.html . Если кратко, ООП - оно про полиморфизм через подмену исполнителя. Ну например у тебя есть абстрактный класс Animal с абстрактным методом eat, от Animal унаследованы Dog и Worm, у каждого из них своя реализация eat. Где-то в коде у тебя происходит myanimal.eat(meat). Но перед этим кодом ты можешь задать myanimal = Dog.new() или myanimal = Worm.new(), и myanimal.eat(meat) будет по-разному действовать.
Это и есть вся суть ООП - полиморфизм через подмену исполнителя.
>Alan Kay писал, что в ООП главное не объекты, а сообщения
Это ООП по Алану Кею, исходное, расово верное и правильное. Три кита ООП - это инкапсуляция + отправка сообщений + динамическая диспетчеризация получателем. Последнее означает, что получатель и только получатель решает что делать с сообщением - что отвечать, отвечать ли вообще, и при этом может сменить логику обработки в любой момент как ему будет угодно, то есть это не должно быть детерменировано на этапе компиляции. С этой точки зрения Erlang того же Алана Кея - тру-ООП-язык, общего между ними то, что они не столько языки, сколько среды выполнения по принципу actor-model.
А потом в индустрию пришли джавапидоры и стали называть объектно-ориентированным-программированием кадавра на принципах инкапсуляция + наследование + полиморфизм через подмену исполнителя. А повторяющие это ньюфаги не могут догнать, что наследование противоречит инкапсуляции, и потому должно быть выкинуто нахуй, а полиморфизм бывает ещё и других видов, ну и короче джава-ООП лучше выкинуть на свалку истории и забыть нахуй.
>что учить дальше
Делай что-нибудь по гайдам с ютуба на джанге или другом фреймворке, хоть на голом пистоне. Твоя цель - научиться делать что-то по плану из головы.
>лучше выкинуть
Как хорошо что петухов с двача, вместе с Аланом Кеем спросить забыли, что лучше и кого выкидывать. А вещи эволюционируют своим путем и естественным образом принимают более удобную для всех форму.
Я джанго основы выучил (на уровне сделать несколько страничек с ссылками друг на друга). А вот как углубиться не знаю, как практиковаться, не могу себе сам задачу придумать, поэтому думаю курс какой-нибудь попробовать, пусть за меня цели ставят.
Мань, ты чего так надорвался? На собесе по губам поводили?
Имиджборду напиши
>socket.gaierror: [Errno -2] Name or service not known
>host smtp.proton.me
>Host smtp.proton.me not found: 3(NXDOMAIN)
мы, блядь, должны за тебя переводить с английского что ли?
https://www.youtube.com/watch?v=IRr3gx71rnk
Кто ж знал в начале года, что Армения теперь один из центров IT
>Как мы знаем, monkey.eat(banana) может быть заменено на eat(&mut monkey, banana) без потери смысла.
Смысл не теряется, но наступает конфликт имён, например
monkey.eat(banana)
insect.eat(banana)
То есть ты не можешь использовать простые названия для функций, иначе будут конфликты. Из-за этого приходится делать замысловатые названия, как это в си принято
это временно.
>наступает конфликт имён
Раскидай по неймспейсам.
Или назови по-разному. Никто не заставляет тебя называть их одинаково. Ты же не называешь все функции в коде foo чтобы потом ебаться с этой проблемой. В ООП методы родственных объектов называются одинаково для задач полиморфизма. Но вне ООП этого требования нет, там полиморфизм делается по-другому.
>можно делоть
всё можно делать, а питухон не нужен вообще, это дерьмо для дибилов которым сложна писать программы больше 1к строк. Ничего годного на питухоне нет и не было, только лишь скриптовая обвязка для других либ на других языках, и питон даже не скриптовый язык, а интерпретатор строк, глубоко ущербный с самого начала, там даже типизации нет нормальной.
хотя и трипл, ну и зелень просто. Самая годная реализация сообщений между объектами это интерфейсы в Java, недооцененная и мощная парадигма, сколько ни читал статей смузипидаров, про это вообще не очень любят бухтеть, больше гавно какое то обсуждают типа mvc с внедрением зависимостей.
Раньше говорили всё есть обьект, а нужно- всё есть интерфейс. Интерфейс между обьектами. Круче этого ничего невозможно придумать, на интерфейсах можно сколько угодно сложную систему построить, нужно лишь спеки правильно писать по интерфейсам, а остальная архитектура- становится прозрачной.
причина бабаха?
Саблайм лох
Динамическое программирование.
Храни вершины в стеке и делай цикл: пока стек не пуст, взял вершину, добавил в стек её соседей.
самое базовое: при отправке данных отправлять также и дату последнего изменения объекта, если дата изменения объекта и дата изменения в отправленных данных не совпадают - бросай ошибку. на фронте можешь реализовать любую логику от простой ошибки, до получения актуальной копии, патча изменениями и т.д. главное помни - явное лучше неявного
stack = [root]
while stack:
node = stack.pop()
print(node)
stack.extend(reversed(node.children))
> select_for_update
> Returns a queryset that will lock rows until the end of the transaction
и как это помогает?
Спасибо. Так и сделаю.
Тебе тут в целом неплохой вриант советуют. Но правильней всего отслеживать не по дате, а по хешу. Т.е. каждую запись (строку?) ты хешируешь hash() и полученное значение передаешь в html форму как hidden поле.
Когда пользователь изменяет запись и сабмитит форму, то вместе с его изменениями сабмититься хеш старой записи. На сервере при обработке запроса ты сравниваешь хеш сабмитнутый с хешем записи в БД. Если совпали - можно апдейтить данные. Если отличаются, нужно показать пользователю ошибку "данные были изменены до вас".
тогда уж просто рандомный uuid4 хранить и обновлять его при записи. точность tz.now до микросекунд, так что шанс выстрела гонки емеется только в теории
Нет ничего лучше хеша данных. И вот почему. Допустим Алиса открыла запись чтобы редактировать, но пошла посрать. За это время пользователь Боб тоже быстренько откроет данную запись у себя, изменит и сохранит. Потом передумает и изменит назад на предыдущие данные. А затем из сортира придет Алиса и может продолжить
Пока ТП срала, запись изменилась 2 раза, но данные у неё остаются актуальными, совпадающими с БД. Сравнение по хешу это учтёт, она сохранит свою правку без ошибки. А в случае с uuid или отслеживанием времени, Алиса получит ошибку и справедливо возмутиться: "какого хуя? Нихуя не изменилось, красноглазики тупые нахуевертили."
crdt
Не совсем правильно понял проблему, перечитал еше раз, зачем вам нужна метка времени или хеш? Можно просто поле version завести
Тут уже надо контрольную сумму полей считать
>>>a.foo(10)
10
>>>b.foo(15)
15
>>>a.foo(4)
14
>>>b.foo(3)
18
>>>a.foo(1, reset=True)
1
class C:
__num=0
__def foo(self, n, reset=False):
____if reset:
______num=n
____else:
______num+=n
____return num
a = C()
b = C()
То же самое, что и у анона выше, но раз уж начал печатать.
решений тебе накидали. хочу лишь упомянуть 2 принципа, которые почтивсегда нужно держать в голове: YAGNI и KISS
удачи в борьбе со сложностью анон!
немного быстрее
> %timeit a(10000000)
3.7 µs ± 48.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
> %timeit b(10000000)
3.2 µs ± 70.9 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
Спасибо!
Есть варианты, кроме итерирования по каждому отдельному слову?
Анон, коплю деньги чтобы войтивайти купив онлайн-курсы по питону, а как мне вообще понять нормальные это курсы или нет? Заметил что сейчас везде рекламы курсов тестеров, С++, питона, но чуется мне что это хуита и развод на деньги.
Так вот, как определить что курс покупаешь нормальный?
Я хуею, как инфоцыганье всё же успешно косит бабло.
Каждый второй долбоёб покупает какое-то говно. Всё есть в открытом доступе, есть спижженное платное, ничем не лучше бесплатного, но нет, надо копить блять и нести им.
Или ты думаешь, что если въебешь деньги ни за что, то будет мотивация дополнительная? Нет, не будет.
Просто пошли совсем нулёвые из лесу, раньше вкатуны хоть что-то соображали изначально, а теперь вот куча рекламы и вот он здесь.
Ну то есть по сути ответа на мой вопрос здесь не будет, будет кукареку от местной ебанашки с переизбытком времени. Понял.
>то будет мотивация дополнительная?
Неиронично да. Помню абонемент в зал подарили и меня бы жаба задушила, если б я все 15 раз не отходил.
что посоветуете? какой GUI Framework выбрать?
Пытаюсь сейчас разобраться с ООП на примере питона - это хорошая идея или лучше сначала изучить его в языке, где оно реализовано нормально (джава например)?
>>28535
То есть мы для каждого такого класса описываем подробную инструкцию, как его резать, а потом просто даем команду снаружи всей этой классовой структуры РЕЗАТЬ Х и он будет резать в зависимости от того к какому классу относится Х? Я правильно понял идею?
Не стал изучать этот язык чтсто потому что у них хохлятский флаг в логотипе.
Сажа, скрыл.
На амазоне вроде эти две самые популярные :
[Elements of Programming Interviews] Adnan Aziz, Tsung-Hsien Lee, Amit Prakash - Elements of Programming Interviews in Python_ The Insiders’ Guide
Michael T. Goodrich, Roberto Tamassia, Michael H. Goldwasser - Data Structures and Algorithms in Python-Wiley (2013)
>лист
никак
>или сет
frozenset
>но как такой объект хранить вообще чтобы был легкий индексинг ключей а не через for-loop?
че
я так и думал
Короче спасибо фрозен сет то что нужно
Есть такое, но без него сейчас не обойтись же...
Фрозен сет, да. Можно тьюплом ещё, если тебя краткость интересует.
Интересует многозадачность и ваше субъективное мнение.
не вкатывальщик
Типа, давно такая мулька ходит, мол, питон это язык для набросочек, а потом уже перепиливают под нормальный язык.
То есть можно дрочить питон и наслаждаться жизнью?
АТО мне кажется, что ява поглубже и побазированней. Хочется простой базы. Вот эта вот вся типизация, многопоточность етц.
Года 4 назад уже читал книги по питону, и на каком то моменте начал ощущать свою не полноценность (пошел в интернет литать холивары)
Типа, она быстрей и легаси хуегаси. Яж не разбираюсь - в погромировании остановился на пол пути к осилению джанги и всё.
Но ява легче плюсов и базированней питона (чуть ближе к байтоёбам).
Я щупал плюсы и яву уже чуть чуть. Плюсы для моих задач действительно не нужны, а вот ява как то получше выглядит, полегче, и опять же база какая никакая.
Просто боюсь, если я потрачу нное время на освоение пистрона, то все равно придется придрачивать к нему какой нибудь жс, базы хуязы, теория алгоритмы байтоёбство.
Не лучше ли сразу с явы начать? Или питон сможет удовлетворить мои маняхотелки?
Я пока еще не спорил - просто высираю сомнения на основе своих наблюдений. Оче сложно определиться, особенно когда на все твои вопросы отвечают одним предложением про задачи и микроскоп
>Интересует многозадачность и ваше субъективное мнение
>все равно придется придрачивать к нему какой нибудь жс
К любому языку придётся, потому что это единственный язык браузеров, тебе же сразу сказали.
Попробую по другому.
Саму суть я понял, ООП освоил, никаких фреймворков не знаю. Хочу двигаться дальше. Пока не знаю куда хочу, типа, десктоп? Веб? Да похуй, просто хочу.
Пистрон очень легкий - я его с нуля без навыков погромирования освоил за 3 недели попутно задев немножечко джанги. Но, поначитавшись разного понял, что питон это просто максимум не база, приуныл, дропнул. Пошел читать яву - перегорел, и, теперь спустя 4 года захотелось поразмять свой стухший мозг, ну и показать всем как я могу, если получится.
Так вот теперь и не пойму, развивать свой питон, или почитать немного какой никакой базы?
Питон для веба и для десктопа нахуй не нужон. Его можно использовать, но есть более подходящие инструменты.
Он подходит, если у тебя уже есть конкретные задачи и надо их решать. А учить под некую перспективную задачу это хуйня на палке.
А как же джанго и среднемаленькие проекты? Не все же в сервисы с 2кк посещений в день перерастают? десктопчик тоже разный бывает.
Мне хочется отностельно простой базы. Питон сможет её дать?
Не нужно про задачи снова пояснять. Я хочу понять, где можно и про байтоёбство узнать (после питона, когда трогал скуль мне было немножечко сложно - базы баз (байтоёбство) я не знаю и не умею), и про человеческий кодинг с алгоритмами, многопоточностью, и вот это вот всё.
Хочется объять ВСЁ, и чтоб не было сложно в освоении. Много раз читая книжки по пистрону (ДЛЯ НАЧИНАЮЩИХ) видел типа, вот тут к памяти обращаемся, оно его тут подчистит само а тут мы немного помжем, не спрашивайте как это вам пока знать не нужно. В яве же, в книжках обучающих все поясняется и рассказывается сразу, но сложновато для меня.
> А как же джанго и среднемаленькие проекты? Не все же в сервисы с 2кк посещений в день перерастают?
На нем пишутся прототипы, что быстрее. Если они выстреливают, то дальше переписываются на чистовике чем-то другом или обрастают костылями для ускорения. (то же происходит и с пхп, руби и прочей скриптотой.)
Для базовой алгоритмизации там всё есть, без анальных корчей на каждое нетривиальное действие, хотя многие эти корчи воспринимают как какой-то плюс. Типа вот я в детстве бегал по недостроям и подвалам и вырос человеком, не то что вы, разнеженные зумерки.
Базы нужны, конечно. И нужен юникс, рекомендую тебе как можно скорее лезть в юникс, зная даже его основы ты поймешь, как и почему сделано многое в той же скриптоте, включая питон.
Вы, программисты реально с годами черствеете в плане резвития, Или сразу такими не гибкими в сферу вкатываетесь? Или я не достаточно четко поясняю про свои хотелки?
>двач, как мне есть суп, ножом или палочками?
>ложкой
>Вы, программисты реально с годами черствеете в плане резвития, Или сразу такими не гибкими в сферу вкатываетесь? Или я не достаточно четко поясняю про свои хотелки?
Короче, если выбирать из двух языков по моим хотелкам, то ява. Спасибо анон.
А в юникс я лазил, да. Больше подгонял единственный и не повторимый дебиан под себя трогая всякую фреймовую чушь чтоб как у погромистов. Да, какой то шарм в этом есть, и даже не скучно
Паттерны свои с микроскопами и прочими НУ ВСЕМ ЖЕ ПОНЯТНО ОДИН ТЫ ВКЛЮЧИТЬ И ВЫКЛЮЧИТЬ НЕ МОЖЕШЬ убери, и поясни нормально.
Я не требую, просто хочется чуточки понимания и немножечко пространных размышлений от анонов о яве и питоне, субъектитвно, без оскорблений.
Обычное там ООП. Как во всех скриптовых языках. Ну есть некоторое количество довольно странного легаси, например len() это встроенная глобальная функция, а не свойство объекта. Всякие слоты ещё на сишном уровне, которые работают в обход основного механизма ООП, у Армина можешь почитать. А так самое обычное скриптовое ООП из слоёных хэш-таблиц.
Питон для веба вполне себе норм
Питон в этом плане это язык бэкенда. Реально в бэкенде у тебя основную нагрузку несут сервисы вроде баз данных и очередей, а язык лишь логику. Для логики питон удобен.
ААП у Пятоне рэалізована дастаткова дасканальна для вывучэньня. Усе асноўныя ўзоры праектаваньня магчыма рэалізаваць. https://refactoring.guru/design-patterns/abstract-factory/python/example
Ху со рта вынь, читать сложно
А ещё 2 + 2 будет 4.
Учитывай что почти все книги про ООП написаны про джаву. Оно там не то чтобы нормально реализовано, скорее там ограничения языка преодолеваются плясками с ООП. Многое оттуда совершенно неактуально в питонах, банально потому что питоны гибче и проще во множестве аспектов.
Понять что такое класс и объект, узнать про базовые фичи ООП, ты сможешь и в питоне. Если хочется стать мастером дрочки паттернов ООП и базвордов, то лучше жава.
И то же самое в с++ (как в питоне) к слову.
В джаве у тебя всё класс, ты не можешь код вне класса написать толком, и привнесение ооп просто вообще везде часто превносит проблем больше, чем пользы, по сравнению с кодом, где ооп - просто синтаксический сахар для структур, без кучи последовательных наследований и кучи тормозных виртуальных методов.
В питоне тоже всё объект, как в жаве. И тоже всё делается тормозными наслоениями. Питон экономит время разработки, а не время выполнения.
b = a не копирует объект, а даёт ему новое имя.
Можешь считать что это vars['b'] = vars['a']
Ну или напечатать id(a), id(b), a is b чтобы увидеть что это тот же объект.
Тебе нужно b = a.copy(), и быть в курсе что есть ещё deepcopy, который клонирует и внутренности.
> оказываетсо эта твагх какава-то хуя меняет знаценне пеґеменной
Мусіш прачытаць пра mutable/immutable.
Почему тогда здесь принтит тру, а не фолс, почему принтит 1, а не 2? Схуя словари такие особенные?
Потому что в третьей строке ты имени b присваиваешь новый объект. Объект и переменная это разные вещи. Один и тот же объект может находиться в множестве переменных. К примеру, так происходит передача аргументов в функцию.
b['a'] = ... — это вызов метода объекта b. Сам объект остаётся на месте.
Да не нужно там никакого иммутабле гуглить. Это сработает даже с мутабельными объектами.
a = []
b = a
b = []
assert a is not b
mytext = f.read().splitlines()
Почему в ВижиалСтудио это вызывает ошибку:
FileNotFoundError: [Errno 2] No such file or directory: 'text.csv'
А в АЙДЛ или напрямую запуская .py файл всё работает. В ВС работает только если указать прямой путь к файлу, вроде: 'c:/text.csv'
Что за дичь блин, можно как-то пофиксить?
А был бы на линуксе, сразу бы понял.
'text.csv' — это относительный адрес. От считается от текщего "взгляда" программы. Айдл смотрит на папку, где лежит text.csv, соответственно по адресу ТЕКУЩАЯ_ПАПКА\text.csv, он её видит. Вижуал студио смотрит куда-то в другое место, например, свою собственную, и никакого C:\Program Files\Visual Studio\text.csv не видит, поэтому No such file
Джангобляди, вот скажите, что с вами не так?
Почему продолжаете использовать этот кусок кала, по недоразумению названный фреймворком?!
Сука, работал над джангопроектом, который до меня накатил такой же чушок как вы. Познакомился с еще одной ахуенной способностью джанги - оказываются опции auto_now и auto_now_add на DateTime колонках в модели действуют только внутри Джанги! То есть блять есди я инсерчу данные через plain sql, то все упадет нахуй из-за null! Потому что все это решает только на уровне самой Джанги
Але, дебилы! Application layer в помине не должен заниматься таким, это задача database layer! Ссать над окаждому на пятак кто продвигает Джангу в 2022+
>А был бы на линуксе, сразу бы понял.
>'text.csv' — это относительный адрес. От считается от текщего "взгляда" программы. Айдл смотрит на папку, где лежит text.csv, соответственно по адресу ТЕКУЩАЯ_ПАПКА\text.csv, он её видит. Вижуал студио смотрит куда-то в другое место, например, свою собственную, и никакого C:\Program Files\Visual Studio\text.csv не видит, поэтому No such file
Эт ясно, а фиксить-то как это в Вижуал Студио, ну это же тупо костыль указывать полный путь к файлу, а потом если что удалять. Бред какой-то.
Должна быть в конфиге какая-то рабочая директория или что-то такое наверное.
Даже в алхимии есть 2 разные опции:
default и server_default, server_default колнтролирует поведение на уровне базы. Но для джангобляди подобный концепт просто непостижим
ну принтани __file__ перед тем как with open делаешь, узнаешь хоть какой там путь
паслибом можно достать из него родительскую папку и добавить тест.ксв
> pathlib.Path(__file__).parent / 'test.csv'
И зачем тебе понадобилось инсертить в чистом sql? В чём проблема дописать now() в values инсерта? Почему это проблема фреймворка?
> Application layer в помине не должен заниматься таким, это задача database layer
Ты скозал? Может ещё в хранимки всё приложение перепишешь?
ты как раз про рабочий каталог написал. надо __file__ использлвать. можно константу PROJECT_DIR вынести в какой-нить модуль по типу shared.settings
Потому что помимо джанго-говна у меня есть вызовы:
pandas.dataframe.to_sql
и
коннекты через sqlalchemy
Если джанго-параша обязывает меня использовать строго ее при операциях с БЖ, то это параша ебаная. Давай дефолтные значения тоже через app будем задавать, а хуле нет? Будем в save методе проверять if value is None и ставить дефолт. Или ЭТА ДРУГОЕ?
годный подрыв, поздравляю
Не обязывает конечно же, но лучше действительно через ORM это делать.
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#bulk-create
Это как бугуртить почему я не могу в block device натолкать данных в обход файлсистемы.
>>27453 (OP)
Мне нужно создать что-то dict, который при доступе по ключу возвращает не точно его, а похожее (если есть) с некоторым допуском.
Допустим, если я создаю словарь
d = SomeDict()
потом что-то туда помещаю
d['молоко'] = "100p"
потом пытаюсь получить значение, но с не совсем верным ключом
print(d['малако'])
То он должен мне вернуть "100p"
Я гуглил, но не нашел, есть ли в питоне такой модуль. И если нет, то как мне его написать самому.
Наследуешься от словаря и добавляешь метод yobaget, можно прям __getitem__ переопределить, чтобы как у тебя, но это перебор.
Ну а там какого-то левенштейна захуярить, ну или гугли "нечеткий поиск", способов много.
Проблема в том, что если каждый раз искомый ключ сравнивать с каждым уже имеющимся ключом, используя левенштейна, то это очень медленно. Совсем медленно.
Если у тебя там не что мильйонов ключей, то без синтетических тестов и не заметишь, небось.
К сожалению, заметно без тестов. У меня около 20К ключей, но я даже не могу дождаться завершения работы программы.
Левенштейн на питоне, но там заметно, что замедление происходит от того, что каждый ключ сравнивается с искомым. По сути при таком алгоритме смысла в словаре нет, это как list получается.
Тут нужно хеш-функцию словаря патчить, чтобы хеши были триграфами какими-нибудь, например.
>Это как бугуртить почему я не могу в block device натолкать данных в обход файлсистемы.
Но ведь можешь...
С какой-то версии по факту да, объявили это фичей в следующей.
Например в теле много всего обращаются к сайту, запрашивают разные параметры, какой-то элемент может не загрузится и код просто вываливается с фатал эрор.
Можно не дрочиться всем трай прописывать или WebDriverWait, а просто чтоб функция вернула состояние ошибки и код продолжил работать дальше?
Как-то реально это сделать не прописывая каждой строке отдельный обработчик ошибки?
Сохраняют порядок добавления. Вроде бы начиная с 3.6.
Обработчик ошибки означает что ты обрабатываешь ошибку. Когда ты ошибку возвращаешь как значение, значит ты тоже собираешься её потом обработать. Какой-то вопрос без вопроса.
Если тебе надо чтобы твой говнопарсер пореже падал, то contextlib.suppress.
Словарь использует хеш, изменяешь хотя бы бит - и он совсем другой.
А тебе нужно не хеш, а "миниатюру". То есть представь что ты фотографию сжимаешь до 32х24, округляешь все значения яркостей с шагом в 0.1 (в диапазоне от 0 до 1), и уже после этого считаешь хеш.
При смени пары пикселей миниатюра будет такая же. Но если выберешь неправильно функцию получающую миниатюры, то часть ключей сольются. Но в любом случае это будет уже не полный перебор, а перебор только части ключей.
Это алгоритм не для питона, это для компилируемого языка.
>При смени пары пикселей миниатюра будет такая же
не обязательно, всегда будут пары изображений, где в результате изменения одного бита миниатюры в итоге будут разными
Впрочем к исходному вопросу это отношения не имеет
>ОП пофикси тред , убери ссылку на эт хуйню
Да его сложнее чем Лутца выпилить. Вроде все понимают, что "не то", но он уже настолько расхайпован, что сложно чего-то ещё предложить взамен
Ёсьць зусім іншае рашэньне адпаведнае твайму прыкладу: soundex ці metaphone. Стварае індэкс для словаў па гучаньню.
https://pypi.org/project/ru-soundex/
https://pypi.org/project/fonetika/
тебя никто не понял что ты там написал.
(на практике я почти точно раздам потокам по своему файлу и потом сведу в один, но мне любопытно)
Как мне быстрее всего слепить requirements.txt из этого? Пока что самое умное что я придумал - поставить голый венв, автоматически установить всё что там есть, и сгенерить рекваерментс ИДЕшкой).
Калі файл адкрыеш для запісу, сістэма блякуе ягонае адкрыццё ў іншай плыні. Гэта выключае канфлікт кшталту мешанкі байтаў.
Аптымальна будзе выкарыстаць шматплынёвасьць каб чытаць і апрацоўваць файлы, але запісваць іх пасьлядоўна па-за плынямі. Бо шматплынёвасць шкодзіць хуткасьці файлавых апэрацый. Чакай пакет multidisking.
>>37758
Бальшавікам далі па пысе імбрыкам і адмянілі іх.
import requests
class TestfirstAPI:
def test_hello_call(self):
url = "https://playground.learnqa.ru/api/hello"
name = 'Vitalii'
data = {'name':name}
response = requests.get(url, params=data)
assert response.status.code == 200 , "Wrong response code"
response_dict = response.json()
assert "answer" in response_dict, "There is not field 'answer' in response "
expected_response_text = f"Hello {name}"
actual_response_text = response.dict ["answer"]
assert actual_response_text == expected_response_text , "Actual text in response is not incorect"
Мне кажется что возможно, если ты сначала создаешь файл из нулей, например 8 гигабайт размером, и потом каждый процессс пишет строго в свой гигабайт. Но результат будет зависеть от того какая ОС и какая файловая система.
Скорее нет, чем да. Скажем так, чтобы была одновременная запись сделать можно, но чтобы всё гарантированно работало - я не уверен.
Сделай один процесс с открытым файлом, которому другие процессы передают куски на запись и делают запросы на чтение. Файл всё-равно в скорость работы накопителя упирается, и записывая из двух процессов ты ничего кроме потенциальной ненадёжности кода не получаешь. А с одним процессом, который будет держать в себе очередь правок и запросов на чтение точно будет работать в любой нормальной ос и не вызовет никаких ошибок.
разумеется, словари упорядочены. все тру олды треда знают, что это так
вероятно, этот косяк венды был описан в 2002 году, и до сих пор актуален
жесть подрыв джуна
потому что код накопипастил
Django, либо Flask+SQLAlchemy, либо Aiohttp или что там модно молодежно
язык(питон), git, linux, django, sql(postgres), алгоритмы и структуры данных, ооп, паттерны проектирования, юнит-тесты, html+css, rabbitmq, docker, работа с api, асинхронное программирование, аниме
а нафига ты таблицу умножения учил, если есть калькуляторы.
сервера вроде как на линуксах стоят. но я зарофлил на самом деле, не переживай, по сути надо ориентироваться немного в гите, в вёрстке разобраться за пару вечеров сможешь, язык и бд ты уже знаешь, осталось написать на джанге пару интернет-магазинов и уже будешь иметь представление о том что ждёт на работе и о чём говорить на собесах, всё получится.
Это нужно что бы резюме солиднее выглядело. Каждую мелочь отдельно выписать.
if ('key' in dict.keys() and dict['key'] == 1)
Второе условие даже не будет проверяться, если первое False и значит ошибки не будет?
У тебя есть очень удобный автоответчик на такие вопросы, начинается на "к", заканчивается на "ь".
Я рекомендую вариант с get - не знаю что там внутри питона, но get один раз просматривает ключи, и если находит возвращает значение, а твой вариант один раз просматривает все ключи для первой проверки, а потом ещё раз ищет когда ты уже значение получаешь.
>У тебя есть очень удобный автоответчик на такие вопросы, начинается на "к", заканчивается на "ь".
kChatGPTь
Да всё-равно любая логика написанная в самом питоне на низком языке это быстрее двух условий в питоне в любом случае.
Точно?
Первая операция, нужно проверить есть ли ключ. Перебирать все ключи медленно - потому ты считаешь хеш, и смотришь уже 1 (или 2-3 ключа, если там коллизия).
Вторая операция, нужно получить значение. Ты считаешь хеш и выдаёшь значение, или кидаешь исключение если ключа нет.
Во втором случае с get он на стадии получение значения вместо исключения кидает значение по умолчанию. Там такой же if стоит, но вместо throw идёт return default
Уж прости. Я из крестотреда сбежал.
Да даже без оптимизации просто код яснее. В отличие от злоупотребления sorted где не нужно — гет точно не скажется на производительности, потому в этом случае код сокращать можно без оглядок на что-то.
Такой костыль работает, но это явно неправильно:
while lol == 0: sleep(3)
Как это она появится, если ты её не поставишь?
Разве что в асинке, но там работают с ивентами, а не с такими блокирующими циклами.
А так или while True и брекаешься когда надо, или while var и манипулируешь этим самым варом.
Это подобный костыль, её надо объявлять как None а это не is not defined.
Вот кусок из JS: if(typeof someVariable == "undefined"){
Мне собственно интересно что в пайтоне нет такой же проверки? С if то ясно как сделать, просто "if переменная:", если переменная есть то всё поедет, ну или else.
То есть есть ли что-то такое while lol is Not Defined: ?
>>38762
>Как это она появится, если ты её не поставишь?
В лисенере "def listener(message):" и переменная внутри функции не определена пока не появится, её вообще приходится объявлять как глобал что тоже костыль.
>костыль
Скорее typeof костыль. Он возвращает строку, но какие были причины так сделать? В строках не проверяется синтакс, у тебя программист напишет "unefined" и ищи потом эту хуйню. Опять же, каким-то инструментам, анализирующим код (например IDE) будет сложнее с кодом, в котором нет переменной, а потом она вдруг появляется, потому что неизвестно, какое у нее имя. Именно что a = None выглядит намного более гладко.
Пиздец, чел.
Во-первых, нахер ты создаёшь итератор по ключам чтобы проверить долбаную хэшмапу, которая сука специально создавалась для таких проверок с O(1)? 'key' in dict, всё. Без .keys()
Во-вторых, это можно сократить, if dict.get('key') == 1.
В-третьих, да, and/or выполняются лениво.
asyncio.Event, threading.Event и аналогичное. Вместо твоего цикла будет одна строка event.wait(), и не будет лишних 0-3 секунд ожидания.
Все эти keys,values,items возвращают специальные объекты.
Именно keys выдает что-то вроде сета, потому что все ключи хешабельны. Скорее всего в итоге оно работает примерно одинаково под капотом. Но без keys красивее в такой проверке.
Ну, ты чего анон? Что-то вроде сета.
Это как range. Вроде бы раньше он список выдавал в версиях второго питона, а теперь это свой объект range.
Также, как ты можешь сделать x=range(9999999) и делать 1000 in x и ничего там не будет итерироваться.
Ну не сет он выдаёт, а итератор, указатель на оригинальную хэшмапу и указатель на текущий элемент. Видимо они там подсуетились и реализовали прокси-метод in, который вызывает оригинал, разница во времени небольшая и не зависит от размера.
https://github.com/python/cpython/blob/main/Objects/dictobject.c#L4665-L4671
разница в 50% так-то.
Ну так у тебя оверхед во первых на поиск метода, во вторых на создание объекта. Вынеси dd = d.keys() в глобалс и смотри тогда.
Кек. Неужели в dict contains что-то большее чем dictkeys contains?
Так и почему быстрее? Кейс таки должен чуть помедленнее быть из-за оберток этих, но на копейки.
Там повторён код, а не обёртка. Видимо вся котовасия из-за сломанного ООП/системы слотов/магических методов.
Можно отслеживать globals() на появление новых переменных
У него есть привязка к оригинальному словарю, поэтому так, наверное.
Вообще, надо покопаться во всех этих реализациях, интересно. Но надо подучить си и найти какой-то материал с разбором. Видел цикл лекций на ютубе, но по двойке.
Мяу. А можно этому timeit передать функцию или лямбду и список+словарь аргументов, а не строку в виде текста?
Не знаю что такое замыкание. Всегда считал что так лямбды в js называют просто...
А как передать то? Написать пустую лямбду по типу labmda: fun(t1,t2)?
С лямбдами да.
Замыкание примерно так. https://ideone.com/TnTGLf
К функции прилипают переменные из окружающего скоупа.
Угу, понял. Так бы и сказал, что просто когда функция возвращает функцию, примерно как декоратор.
Идеоне заблочен по какой-то причине, кстати, причём "сильно" - рутрекер открывается условный с использованием тех же лёгких средств обхода блокировок. А тут только прокси.
Да не вопрос, только я не знаю как сервер не в России оплатить, а местный не хочу.
И там какие-то веб-платформы, я во всём этом не разбираюсь, хочется код запустить, просто чтобы у него айпишник свой был и к нему можно через сокеты по порту подключится, без докеров-хуёкеров или что там используется. Такое везде будет?
Да. У них обычно нат, там один айпи на всех, тебе выделяют диапазон портов под твою впску на которых можно развернуть какие-то сервисы.
Как оплатить уж сам разбирайся.
использую xml2dict, мейнтейнер мудак, зависимость есть
Сто лет уже не было задач с использованием xml, где ты такое нашел?
Разве что использую lxml как парсер для супа или напрямую для парсинга хтмл, если нужна скорость, т.к. суп пиздецки тормозной и гигабайты на нем молотить можно от старости умереть.
Стандартный xml etree. Нахуй что-то ещё?
гет лучше только тем что ключ два раза не писать
Я имею ввиду лямбды, functools, collections. Желательно с упражнениями.
Предполагаю, что если выдрочить их, можно будет тестовые задания в Яндекс решать намного быстрее.
Реально, книжек как будто нет. Кое-где упоминаются, но вскользь.
Остановлюсь пока на этом:
https://github.com/fbaptiste/python-deepdive ( тут только отдельные уроки про функциональщину)
Тут вроде серия заданий для яваскриптеров
https://www.codewars.com/kata/582746fa14b3892727000c4f
Мне понравилос.
Стандартный модуль xml сейчас более, чем хороший. lxml из каких-то древних времён, штатный xml всё умеет, что нужно
Его за пределами Украины-РФ почти не знают. Не любят там славян, не любят
Клятый аддисон-весли.
Сами авторы говорят, что его нужно юзать только как базу низкоуровневых вещей типа ебли с протоколами. Фастапи же предоставляет кучу батареек из коробки для полноценной вебморды. Отсюда и перекос. К слову, практически уверен, что многие юзают aiohttp как клиент.
aiohttp очень удобен как асинхронная веб морда для сетевого инструментария, тебе не нужны все эти asgi.
Но именно для api веб-сервисов скорее всего FastAPI лучше будет.
Там правда в чарте хватает какой-то левой мути, а вот aiohttp места не нашлось.
в общем занимался по книжке для нюфагов питон тони гэдис фроде с фруктами на обложке. Читал в целом все было понятно и задачки были посильными и темы понимались нормально. Вот прошел я. уровень еще низкий для решения задач из сети, думаю ну надо расширить знания начал читать лутца, так у него главы настолько большие что я пока одну тему читал уже стал забывать другие потому что не делал задания, а заданий там не то чтобы нету, но надо много прочитать прежде чем что-то понять. объемы очень большие. теперь вот хз вроде пока читаю а закреплять на практике более подробные знания с этими вариациями использования того или иного цикла или метода или способа я не успеваю тупо. учебный процесс можно сказать нарушился. может есть способ чтобы и углубляться и закрепляться и не так быстро забывать одно переставая видеть за деревьями леса
>>39178
Я проверяю есть ли переменная в окружении, просто проверка имени переменной в dir или global по имени. Это питонический путь или ещё нет?
Ну как по мне это вообще ситуация не обычная, если ты не знаешь какие у тебя переменные есть, мне такое нужно было только для работы в колабе, там была каша из окружения - один фрагметн кода запускается что-то делает, потом ты его останавливаешь, погромируешь-погромируешь и следующую ячейку с кодом запускаешь.
>для сетевого инструментария
Ну так сетевые инструментарии гораздо более редкая вещь относительно обычных веб сервисов.
Думаю все просто укатились на go. И быстрее, и проще деплоить, и скейлится по ядрам хорошо, и выучить язык нормальному питонисту две недели.
Книга нужна чтобы за ручку тебя вести, чтобы ты задал себе правильные вопросы и нашёл ответы. Если книга снотворная — лучше дропай. Делай сразу юзабельные программы, напиши сначала угадай число, калькулятор, какую-нибудь тривию, 5 букв, попробуй веб поделать на каком-нибудь фласке, игры на arcade, в майнкрафте попрограммируй черепашек. Постепенно всю нюансы языка нагуглишь хорошо сформулированными вопросами/экспериментами в REPL.
А где?
Сейчас помоек развелось, я не успеваю.
Да еще побанили в одной, когда я их обозвал очередной пиратской помойкой...странные
Есть как минимум на либгене и руторе.
ну как же без воды? а как же создание нейронных связей?
Посмотри Хиллард Д. - Секреты Python Pro (Для профессионалов) - 2021.pdf
Идиотский нейминг от пиривоччиков, хоть не "питонья братва".
Интермедиейт книга от Девида Бизли, очень толковый чувак. На фоне засилья однотипных начальных для вкатунов это заебись.
flagWait = True
while (flagWait):
try:
#time.sleep(1)
print(html.fromstring(requests.get('https://myip.ru/index_small.php').content).xpath('//tr[2]/td/text()'))
flagWait = False
except Exception as ex:
print(f"Error: {ex}")
flagWait = True
Ну как минимум while True, лишняя переменная нахуй не нужна. Сайт у тебя какой-то васянский, завтра исчезнет. Делай хед на тот же Гугл.ком.
Если поместить словари в список и затем отсортировать, то словари будут упорядочены.
Я прошел тест?
>Сайт у тебя какой-то васянский, завтра исчезнет.
Там пара строк и одна из них мой айпишник, его и получаю.
Посмотрел сейчас есть сайты с api где можно айпишник в джисон формате получить, но там ограничения на 10 обращений, у какого норм ресурса это без лимита?
>>40950
>while True:
>try:
>html.fromstring('хуйня малафья')
>break
>except:
>time.sleep(1488)
Заебись, спасибо.
Dyndns изобретаешь?
Сап питонач, вкатываюсь в питон, читаю Fluent Python. Страница 68, "Deques and Other Queues". Написан пикрил 1:
>The append and popleft operations are atomic, so deque is safe to use as a FIFO queue in multithreaded applications without the need for locks.
Реально atomic они? Wait-free? Или нет? На страничке deque в доках ничего такого не написано, thread-safe и все. Но на страничке про queue (https://docs.python.org/3/library/queue.html) тоже написано, что atomic.
Так какие они в итоге: wait-free, lock-free или там банальный мьютекс под капотом?
Там GIL под капотом, тупой мьютекс не всё пространство памяти и планировщик выполнения. До уровня опкода виртуалки/встроенного метода на си всё атомик и тред сейф.
GIL не гарантирует атамарность. Я могу написать такую билиотеку на си, которая будет не атамарной. Например она содержит 3 функции send, flush и f. Функци send препроцессит отправляет данные в буффер, а flush коммит эти данные переселые из буффера куда надо. Функция f принимает аргумент n и делает n раз вызов сначала send, а потом flush. В итоге если передать из питона f большое число, а во время работы убить процесс, то сообщение будет отправлено не n раз. А свойство атомарности говорит, что либо n раз нужно отправить когда всё работает или 0 если ошибка. Атомарность значит или полностью применить изменение или вообще не применять. GIL не знает что там под капотом на си и не гарантирует атамарность. Только код на си может себе атамарность гарантировать
Нит, пистон выполняет не код, а команды байт кода, которые ты можешь посмотреть через dis. Если во время работы с тредами планировщик скажет сменить тред, а потом ты вернёшься к функции, где есть, например, присвоение глобальной переменной, операция которой выполнена на половину (то есть во фрейме уже сгенерирована новая переменная, но она не пушнута в глобал стейт), то можешь получить очень неприятный сюрприз.
>Хуета с дивана от байтоёба.
Пруфы? Дай определение атамарности и сам расскажи как мой код работать будет. И если с моим описанием не сойдётся, то я сам тебе напишу эту библиотеку
Атомарность это неделимость, как у древнегреческих философов. Она не обязательно с ролбэком. Ты просто можешь заблочить гил, и неделимо выполнить ряд операций.
> GIL не знает что там под капотом на си и не гарантирует атамарность
Ну то есть, блядь, само собой, GIL за тебя код не напишет. Но конвенция сишного кода для питонов подразумевает что по умолчанию только один тред активен, поэтому большая часть операций безопасна. Там изредка экстеншены его отпускают, если 100% уверены в том что делают, всякие numpy, когда отправляются дробить числа.
При этом разломать list/dict/deque несинхронизированным доступом из нескольких тредов ты не можешь. Любой встроенный метод, какой-нибудь list.append, выполняется атомарно. GIL не отпускается пока не выполнится.
Ну ты и душнила унылая.
>>41364
Точно, я совсем забыл про GIL, мне до него еще читать и читать. Но ведь GIL подразумевает, что все thread-safe (тред же только один, верно?) по умолчанию, зачем тогда отдельно писать, что deque.append - thread-safe? Чтобы успокоить байтоебов?
Глянул в исходники deque, там точно нет Py_BEGIN_ALLOW_THREADS https://github.com/python/cpython/blob/main/Modules/_collectionsmodule.c#L274 (а например в time.sleep есть - https://github.com/python/cpython/blob/main/Modules/timemodule.c#L2169 )
>Но ведь GIL подразумевает, что все thread-safe (тред же только один, верно?)
Сегфолтов ты не получишь, но данные закораптить запросто
>>41609
Так, падажжи, ебана. Ну да, тред один, но имеется в виду, что он выполняется только один, но может в любой момент быть переключен, верно? Этот момент я упустил.
Получается, каждый отдельный питоний опкод выполняется под GIL (ну точнее не прямо каждый, а типа N-ое количество, иначе, думаю, совсем со скоростью пиздец бы был, но идея в целом такая)? И при вызове нативного кода GIL лочится автоматически, пока весь нативный код не будет выполнен (ну или пока нативный код сам не снимет блокировку)? Тред не переключается, пока активен GIL?
То есть deque.append thread-safe просто потому, что при его вызове неявно ставится обычный лок (GIL), а не потому, что там хитрые lock/wait-free структуры данных под капотом (сишная имплементация вообще дубовая, но я думал, что что-то упускаю)? И если бы deque.append был написан на питоне, то там нужно было бы threading.Lock втыкать?
Ну тогда вроде все понятно более-менее, спасибо, аноны.
Код должен выводить из строки все символы, которые написаны по одному разу и сортировать по порядку ASCII, хотя мне бы и без сортировки...
def task(s):
r=[0 for i in range(256)]
for a in s:
k=ord(a)
r[k]+=1
for z in range(256):
if r[z]==1:
print(str(chr(z)),end=' ')
task("qwertrtty")
r=[0 for i in range(256)]
нифига се ты хардкорщик.
def task(s):
a = []
for i in s:
if i in a:
continue
else:
a.append(i)
print(i)
return a
print(sorted(task("qwertrtty")))
Разве эта функция не по дефолту сортирует по ord
Да это суть задач. Дать тебе отработать на практике материал.
А то тут сразу же вспоминаешь всё это нытьё с рекурсивными функциями и задачками по них, да, крайне переусложнённые и которые без них порой намного проще и быстрее решить. Но у тебя задача не проще и быстрее решить, а именно рекурсией
Рекурсия это говно. Суть питухона же максимально упростить код и разработку, нахуя же эта рекурсия нужна, чтобы макаки тратили часы на вход, потом в ней ошибались и переделывали. Есть ли вообще такая задача которую не решить без рекурсивного мозгоебства или это просто выебоны?
неосилятор
Есть рекурсивные задачи, которые хорошо в нее укладываются, но можно решить и без неё.
Например, поиск файлов в вложенных каталогах или обход всех страниц сайта, который кравлинг.
У тебя есть пакеты и монетки. В любой из пакетов ты можешь класть монетки, а так же другие пакеты (в том числе с монетками и пакетами монеток). Задача — посчитать сколько всего монеток внутри произвольного пакета.
Можешь заменить пакеты на папки, а монетки на файлы.
Можешь заменить пакеты на html теги, а монетки на текст внутри тегов.
Рекурсивно это решается в 10 строк. Нерекурсивно порядка 100.
У ностарча недавно вышла книга про рекурсию с примерами на жс и питоне, кстати. Я пока не читал, но это хороший издатель без откровенного говна.
Рекурсия просто заставляют поднапрячь мозг чуть больше, чем просто +-*/ и if else while.
Вот и всё, сложного там ничего нет. А мозг поднапрячь полезно лишний раз
Пацаны, джанго бэк создает некий excel-файл, нужно сохранять его так чтобы создавший его юзер потом мог посмотреть его через админку и скачать если нужно. Как это реализовать? Понятно что я могу создавать рандомное имя для файла и сохранять его по известному пути, но как сделать так чтобы его можно было смотреть из админки?
не.
for i in poket:
if i(type) == list or i(type) == tuple и так далее
for j in i:
if j(type) == list or j(type) == tuple и так далее
и по пути у тебя всё сто раз сломается и придётся ещё 50 строк костылей писать
да и эти костыли будут считать только с определёнными данными, если они изменятся, то и весь код полететь может и тебе снова надо будет ещё 50 строк года добавлять, когда рекурсией это буквально пару строк и норм производительность для таких задач.
А, ну вот хороший и единственный пример где нужна рекурсия. Тут согласен.
Откуда у тебя моя фотка в момент программирования на Пайтон, когда я наиболее уязвим?
Через сторадж сохрани файл и запиши его имя в FileField какой-нибудь модели. Будет так как будто файл загрузили через форму, но на деле ты его создал прямо на бэке. https://docs.djangoproject.com/en/4.1/topics/files/
https://pastebin.com/fZyA5Zhf
Я знаю что это тупо, но я пытаюсь полностью закрепить владение itertools и тд
https://www.codewars.com/kata/58291fea7ff3f640980000f9/python
Уже переделал, но надо разобраться что не так с этим способом
Я понимаю, я забрутфорсил это решение просто через set:
all_set={'Africa','Americas','Asia','Europe','Oceania'}
def all_continents(lst):
checkset = set(map(lambda x: x['continent'],lst))
return checkset == all_set
но почему не проходит это сложное?
Точно забрутфорсил? Так-то разницы между твоими решениями, судя по всему нет. Возможно дело в superset.
Ебал я этот сайтец :(
На следующих задачах из серии тоже какая-то хуйня.
https://www.codewars.com/kata/coding-meetup-number-9-higher-order-functions-series-is-the-meetup-age-diverse
Ну что здесь не так может быть?
https://pastebin.com/UqV6Uazr
Похоже просто макакены друг друга обучают и плюсики ставят.
Придется на leeetcode идти, но там какие-то задачи всегда сложные.
Мне просто не нравится set comprehantion.
Ката - это когда ты тренируешь конкретные элементы, а не ищешь лучший.
Вот я решил потренировать itertools и друзей.
Но получается какая-то поебень (
Да причём тут сеты и итертулз, там задача отметить галочки что есть разработы из всех требуемых регионов. У тебя сама задача не решается. Достаточно появиться кому-нибудь из Антарктиды чтобы твоя прога перестала говорить что из Африки и Европы люди есть.
> Ката - это когда ты тренируешь конкретные элементы, а не ищешь лучший.
Нет, это как раз писькомерство как бы изъебнуться поменьше.
Конкретно эти твои это какие-то тематические на higher-order functions.
Но никто из таких не заявится на кодерское пати. Ни у кого нет паспорта из Антарктиды.
Мне кажется так проще оценивать программу на правильность.
Не с отладчиком прыгать по ебучим вложенным циклами, тестик для функции ебануть.
Ну я что буду тут пересказывать стандартную документацию?
Тем временем, почитал комментарии и понял из этой задачи >>42193
что детей учить программированию нельзя
Окей, плавает кто-нибудь на яхте уже 5 лет, и указал локацию Ocean. Сути не меняет.
Ну вот сходи там на сайте в каментах подушни
Как посчитать среднее чисел больше 0 в один проход с помощью reduce?
То есть, я хочу научиться делать reduce, но так чтобы reduce работал не со скаляром,
а с двумя скалярами - суммой и числом удовлетворяющих условию элементов.
Я же не могу lenght где-то хранить вне лямбды. Как такое решается?
Теперь вот пытаюсь понять как им следовало бы это написать.
Я думаю никак нельзя с лямбдой, тебе нужно два значения хранить на каждой итерации, и в конце только поделить.
С функцией можно поколдовать, но я считаю такой код не нужен. Это как попытка решить задачу по тексту одной невероятно сложной регуляркой, вместо простой регулярки+небольшого простого кода. Бьёт и по читаемости, и по производительности.
На самом деле есть функция, которая создаёт произвольный класс, то есть можно это и в виде регулярки записать.
Лучше бы ты написал sum(lst)/len(lst), чем то что у тебя.
Раздели 6/3, чо как тупой?
Я в целом про задачки для питона.
>Чтобы код читать сложнее было?
чтобы сложные циклы визуально свернулись и код стало читать проще
Вот, ещё шишку твою побалую.
Да просто пиши код какой хочешь, оно само придёт, когда будет всю эту хрень легко разбирать и видеть что тут написано.
Я думаю, можно нахувертить вложенных лямбд и тащить скоуп за собой, но лень придумывать, это бессмысленная задачка.
Вложенные циклы читать как раз проще, уже двухэтажный компрехеншен на грани, не говоря о больше.
А если тебе надо прокрутить что-то быстренько, то да, такие штуки упрощают.
Давай мы перестанем толочь воду в ступе и ты прочитаешь до конца это https://docs.python.org/3/howto/functional.html
Задача: есть список чисел на входе, нужно сбацать интервалы на выходе. Типо из [1,2,3,5,6,7,9,10] в [1-3, 5-7, 9-10].
Я новичек, можно пиздить сильно
А укус чем лучше Ромальо с торрента?
там ВООБЩЕ нет ничего для новичков.
Исключительно сложные вопросы и наверняка ты что-нибудь новое узнаешь.
Ок, спасибо.
Идешь и сравниваешь поочередно значения, истинно ли условие +1. Если нет, то оформляешь результат и продолжаешь по новой.
Для этого есть itertools.groupby, но ты не осилишь, к тому же задачка скорее всего на такой ручной способ.
Он собирает в группы последовательно идущие элементы с совпадающим ключем-условием.
Редьюс это вообще про другое.
что здесь не так?
Почему itemgetter не работает с dict ?
Все понял. Спутал attrgetter и itemgetter.
Мне нужно использовать itemgetter.
Извиняюсь, был напуган.
Аж на одну строку src=src.copy() больше станет!
src.extend(top)
Ты бейсик-то видел хоть раз, довен?
Я правильно понимаю, что для тут только turtle?
pillow ещё глянь, там есть средства для рисования.
Можно отрисовать вектор на каком-нибудь cairo. Ну и matplotlib. Turtle это для детей, никто не рисует с помощью turtle.
>Нерекурсивно порядка 100.
99% рекурсии можно заменить 2-5 строчками на код с очередью, который ещё и эффективнее будет, и не будет проблем с переполнением стека иметь.
Собственно я так сходу даже затрудняюсь назвать алгоритм, где такого сделать нельзя. Хотя я проснулся три минуты назад, ещё не соображаю.
Ну замени. Запости код.
Вот тебе входные данные [1, 1, [1], [[1, 1, [1, 1]]], [1, [1, 1], 1]]
Ты тот же стек сделаешь из указателей вручную
https://pastebin.com/8UJjjx2Z
И g выдаёт результаты лучше, даже если почередовать, чтобы в кеш всё прогрузилось.
>Ты тот же стек сделаешь из указателей вручную
Только, во-первых - он не будет переполняться (хотя я не знаю переполняется ли он в питоне), во-вторых, во-вторых - невероятно странно и удивительно что какой бы там ни было стек под капотом питона работает медленнее, чем интерпретируемый код на питоне.
Можешь ещё взять рисунку со спиралькой, и попробовать написать алгоритм заливки (как в пеинте), на си или си++. У меня разница получилась по типу, что для кода с рекурсией время выполнения порядка секунды, а для кода с очередью всего 30 мс.
Хоть проход не в том же порядке, что с рекурсией, и есть копирование, неплохо.
В питонах вызовы функций дорогие как пиздец. Надо очень длинные массивы и низкую вложенность, чтобы затраты отбились.
https://pastebin.com/7nRyfTQB
Хуй знает, наверное перегнул со 100 строками. Но будет длиннее точно.
Рекурсия тоже ломается, да, а список считай неограниченной длины при адекватном времени выполнения.
Я потестил разные данные, иногда вариант "e" с однострочником-генератором лучше работает на малых данных, но в остальном даже на больших без вложений "g" лучше всего себя показывает. Я правда повторов мало делал, но при перезапусках похожее всегда.
>>43768
Точно перегнул.
матплотлиб
Получается
Спасибо, храни тебя господь. Но если не сложно можешь ещё одно решить? Хотя б минималку набрать. Я свечку поставлю
Извиняюсь. Сообщение выше должно было тебе отправиться
Потому что нам впихнули это под видом дополнительной подготовки "Цифровые технологие".
И*.
Это первая
f = [int(n) for n in input().split()]
m = [int(n) for n in input().split()]
print(max(f) + min(m))
NENUGNAYA_PEREMENNAYA = False
tmp_name = 'jigurda'
proper_parts = ('hui', 'pizda','urda')
for p in proper_parts:
if tmp_name.find(p) != -1:
NENUGNAYA_PEREMENNAYA = True
break
Мне нужно сделать бота для дискорда, который будет ловить вебхуки от моего сервака и отправлять их нужным пользователям. По отдельности никаких проблем нет, а вот скрестить это у меня не выходит.
Каким образом я могу скрестить бота (discord или nextcord) и приём вебхук (aiohttp, quart)?
Буду рад, если кто-то поможет
Да пох на финд. Как без ненужной_переменной обойтись? Надо чтобы проверялись все proper_parts и только если ни один не найден то return, а если хоть один найден то функция продолжается.
NENUGNAYA_PEREMENNAYA = False
tmp_name = 'jigurda'
proper_parts = ('hui', 'pizda','urda')
for p in proper_parts:
if p in tmp_name:
NENUGNAYA_PEREMENNAYA = True
break
if not NENUGNAYA_PEREMENNAYA:
return
def tupoy_pidoras(tmp_name):
for p in ('hui', 'pizda', 'urda'):
if p not in tmp_name:
return
print(tmp_name)
Ой , тут я тупой пидорас, если тебе надо проверить все, а не первый попавшийся, тот тут можно сделать через any.
Вот именно что ты тупой пидорас и обосрался. Только хотел написать. Обзываться плохо.
Ладно. А any она ленивая или нет? Ну т.е. если у меня proper_parts километровый, но в основном есть совпадение в начале она сразу прервется или будет дальше проверять?
Ленивый, если какой-то элемент итерабла будет True, то он сразу будет True.
for e in list:
А чтобы сразу менять элемент в списке нужно вот так делать:
for i, e in enumeate(list):
list = ''
По другому нельзя?
Макаба квадратные скобки сьедает.
any(part in name for part in parts)
Глупость полная. Для aiohttp куча батареек тоже, просто тебе их не навязывают "из коробки". Но они officially supported https://docs.aiohttp.org/en/stable/third_party.html
Юзаю aiohttp там где раньше юзал tornado. Вот tornado умирает, но там слишком много легаси было типа поддержки второго питона.
А fastapi, во-первых, для api, во-вторых на любителя, мне например не нравится.
Но сам язык намного менее гибкий. Насчет быстрее - это на особо важно для 99% веб сервисов у которых узкое место БД либо IO(ожидание ответа от другого сервиса). У go есть своя ниша, но он скорее заменяет то, что раньше было написано на С++, хотя туда rust ещё лезет сейчас.
Просто писать на go так себе удовольсвие, если это не что-то совсем просто. Куда приятней scala, nim, elexir
if os.system("ping -W1 -c1 ya.ru &>/dev/null") == 0: print("it werks")
А можно ещё чуть инфы?
У меня затык в том, что они оба пытаются стартануть один и тот же loop у asyncio. И я не очень осознаю, как мне их разнести. Засунуть их в разные потоки и создать там для каждого потока свой лур - норм решение или нет? Как в питоне вообще с многопоточностью?
Зачем создавать разные loop`ы можно один использовать.
В aiohttp ты можешь добавить таск https://docs.aiohttp.org/en/stable/web_advanced.html#signals при запуске
С discord не работал, но судя по коду https://github.com/Rapptz/discord.py/blob/master/discord/client.py оно само подцепит loop который уже запущен ну или можешь в .loop его подсунуть.
Почитал дальше исходник discordа. Там блокирующей метод run, наверное с ним проблема?
Можешь вот так же сделать в твоем async task`е https://github.com/Rapptz/discord.py/blob/master/discord/client.py#L815
>>27453 (OP)
Как бы вы реализовали функционал таймера со стратистикой?
Услувно говоря - пользователь наживает старт - начинается отсчет. Пользовтаель нажимает паузу - начинается пауза. Нажимает стоп - отсчет прекращается.
Я пока не придумал ничего лучше, чем завести бд вида "пользователь-операция-время", а при нажатии, например, на старт писать в нее "пользователь1-старт-unixtime", а для подсчета статистики сделать отдельный скрипт с запросами в бд.
Вот есть функция которая эту строку обрабатывает и в конце обновляет переменную.
main_line = updated_line
Переменная в глобальной видимости, она не возвращается с return, такая логика.
Так плохо получилось, что в середине этой функции в редких случаях переменная тоже может быть обновлена и функция продолжится и в самом конце строка опять обновится уже без смысла.
...
main_line = updated_line
...
main_line = updated_line
...
Это вообще нормально? Стоит ли из за этого вводить ещё переменную например main_line_already_updated, чтобы предотвращать второе присвоение. Как это в питоне делается?
Мне нужна подсказка именно в этой ситуации. Про то что глобальные переменные зло - это на каждом столбе написано, в какой справочный материал не залезь там: НЕ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙТЕ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ С ВИДИМОСТЬЮ ИЗ ФУНКЦИЙ!!! НИКОГДА ЭТОГО НЕ ДЕЛАЙТЕ! БРАТ УМРЕТ!! СЕМЬ ЛЕТ НЕ БУДЕТ СЭКСА!!111 ПРОКЛЯНУУУ!!!!
Что на счет моего вопроса?
Забей, питон не про производительность.
Во-вторых, я конечно не знаю как устроен питон внутри, но если предположить что строки неизменяемые, то я бы закодил как то что каждая уникальная строка сохраняется под капотом внутри в особой структуре данных, а в переменной идёт указатель на номер строки. То есть когда у тебя значение появляется первый раз, оно копируется. Второе присваивание просто перезаписывает айдишник без серьёзных затрат, ну и там счётчик ссылок, можно ли удалять внутреннее представление. Но никакой гарантии что питон работает подобным образом и что это не измениться в следующей версии нету.
В общем, я бы рекомендовал сосредоточится на других аспектах, и это прям если тебе совсем нечего делать и ты вылизывания кода производишь - то можно написать тест и посмотреть бьёт по производительности лишнее копирование или лишняя проверка.
Какая-то дичь. Вообще ты можешь использовать ключевое слово global внутри функции чтобы изменять глобальную переменную
>Стоит ли из за этого вводить ещё переменную например main_line_already_updated, чтобы предотвращать второе присвоение.
А зачем его предотвращать? И вообще, мало ли у тебя несколько потоков, которые эту переменную присваивают и читают?
> — как мне отпилить себе ногу?
> — не отпиливай себе ногу
> — ну я знаю что не надо, но вот хочу дальше отпиливать себе ногу
По правде говоря, я не понял в чём суть вопроса. Что-то там, в какой-то сложной функции несколько раз пишется глобал. Ну и? В чём проблема? Пусть дальше пишется.
> чтобы предотвращать второе присвоение
Хуй знает зачем тебе это. Но я тебе предложить тупо возвращать из функции эту строку, и у тебя в принципе не получится никакого второго присвоения. А ты чёт раскукарекался что тебе морали читают. Ну сделай флаг, что уже присвоено, что тебе это даст?
Я эмоциональный человек, всё в порядке.
Суть вопроса выяснить, что в питоне хуже: излишний раз присваивать переменную или вводить флаг чтобы этого не происходило.
Хуже лишний раз посчитать значение. Присвоить переменную ничего не стоит. Разве что через переменную что-то может держаться в памяти, но это редко бывает проблемой.
Да, примерно так. Только, мне кажется, надо код в runner завернуть в цикл ещё, чтобы если экспепшн будет он пытался перезапуститься. В методе run в discord.py оно тоже как-то в цикле дергалось.
> loop = asyncio.get_event_loop()
> loop.create_task(...)
Так уже давно никто не делает. Во-первых get_running_loop, а во-вторых, можно вообще без loop, asyncio.create_task(...)
как это вообще получилось?
>Как это в питоне делается?
миллион способов, но лучше возьми свой пример, доведи до абсурда и реши, как лично тебе будет красивее выйти из этой ситуации:
https://www.online-python.com/9o8abPhgjN
Типа я хочу видеть, с какими именно данными мой метод справляется или не справляется.
Таблица параметров нужна, чтобы тестировать сходные методы. Они все по-разному работают, но должны выдавать идентичный результат( как ни странно)
Как в Пайчарме называется вот этот механизм - я навожу на переменную в коде и он мне показывает вот такую херню с описанием?
У меня на 2х машинах установлен Pycharm Pro. Но на одной все показывается а на другой - нет (обе Linux mint если че)
Ок, поправлю. Пасиб за замечение
1) Данные отправляются через new FormData() ?
2) Проверяй Content-Type, если ты отправляешь обычный application/json, схуяли он должен попадать в request.POST ?
Потому что ты заблудился между двух сосен. И соснул с проглотом.
а хули обсуждать? 4.0 выйдет - запилю
>a = input().split()
>if int(a[0]) > 1:
>__print('0')
>else:
>__print('1')
Зачем ты так с ним?
def govno(a, b):
rng = range(a, b + 1)
k = [0] * len(rng)
for i in rng:
if (i + 1) % i == 0:
k = i
return [i if i > 0 else 0 for i in k if k > 0]
print(govno(1, 5)) # [1]
шакал ебучий
>Это сразу было понятно, анонче, однако это не делает твоё решение верным.
Покажи пример инпута, когда моё решение даст неверный ответ, или выйдет за пределы ограничений времени/рам.
Оно хоть условиям удовлетворяет. Твоё улетит за ограничение премени при простой проверке диапазона из задачи
1 1000000000000000000
Не предусмотрел, действительно.
Даже с 100000000 тайм констрейнт похерен в двадцать раз. А как сам препод отреагирует на твоё решение, как думаешь?
>>52847
В чем разбираться? Для экономии времени заранее создан лист с элементами 0 в диапазоне принимающих функцией чисел (т.к. создание списка в цикле занимает в полтора раза больше времени), через цикл фор проверяется условие, при выполнении которого возвращается элемент из листа, который больше нуля (2/1 == 1), т.е. первый и единственный.
> заранее создан лист с элементами
И нахрена?
Если потом выбрасываешь оттуда всё кроме одного значения?
Это копия, сохраненная 6 февраля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.