Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы: https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации https://dumpz.org/ - можно постить листинги, не требует регистрации https://pastebin.com/ - для листингов, регистрация не обязательна https://goonlinetools.com/snapshot/share/ - для листингов, без регистрации, но с капчей
— Какие книги считаются лучшими? На слуху чаще всего Лутц, но там очень много воды. Ещё на слуху Марк Саммерфильд, Эл Свейгарт "Автоматизация рутинных задач с помощью python". Эти книги рекомендуют чаще всего, но книги довольно старые, а питон развивается.
— А как учить джангу? Нахожу только книги по джанге 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
— Как можно без лишней возни ускорить программу на питоне 1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь. 2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
Кстати, напоминаю, что Питон - ненастоящий язык, который годится только для небольших скриптов и математических научных дрочилен. Питон используют опытные погромисты как вспомогательный язык, поэтому если вы думаете, что можете вкатиться в айти, зная питон - вы глубоко ошибаетесь.
>>2748795 >куд-кудах, а ищу твитор на питуне сделон Тебе же русским по белому написали, что питухон вспомогательный. Это максимилизированная версия поговорки - "изи ту лерн хард ту мастер" Ты можешь выучить питухон и идти с ним на хуй, потому что что применение у него есть, только если ты нормальный погромист и используешь питухон для подсосных скриптовых задач.
>>2748769 → Спасибо что ответил, я действительно ценю ваш фидбэк и если какую херню пишу или думаю говорите. 1) Я собираюсь в дальнейшем восстанавливать математику отдельно для того чтобы закрыть вышку, а большинство курсов по Data Science дают, на мой неопытный взгляд, меньше питона и программирования, а стоят они на 70 к больше чем тот же курс по питону. Data science скорее долгосрочная цель потому что мне сложно представить что за 2 месяца (курс 5, считай 3 питон 2 математика) вообще можно их математики запомнить. По крайней мере мне всегда код (C++, Wolfram Alpha тогда учили) на порядок легче давался чем теоремы из мат анализа. Может нах не нужны в Data Science эти теоремы но даже если мы просто берём применение их правил я затрудняюсь представить сколько я за пару месяцев смогу запомнить и как я буду в этом соревноваться с кем то кто только что из вуза с мат специальностью туда идёт.
2) Hexlet и Skypro приглянулись но у них нет интенсивов/буткемпов. Если можешь поподробней описать чем Практикум лучше скиллфактори рад буду услышать. Стоит удовольствие на 70 к больше и длится на 2 месяца дольше, впрочем с меньшей нагрузкой в чём есть свои плюсы. Дело в том что мне в принципе курсы нужны не только, и не столько для того чтобы выучить питон, а для того чтобы получить хорошую базу,т.е. понимать что сегодня вообще хотят от кодеров, что такое фреймворки с чем их едят и т. д., и т. п., начать портфолио потому что как я писал в прошлом треде мне сложно самому себе задачи придумывать ибо в инете почти всегда есть способы это решить вопрос проще, быстрее и более организовано, чем самому писать. Может для опытного кодера это иначе но мой опыт пока такой и проще на курсах решать задачи из индустрии. У меня есть идея для пет проекта, может к тому времени как выучу питон еще что придумаю но хочется себя обезопасить.
3) Я уже начал вчера, эксперимента ради, Поколение Python, подошёл к 1му экзамену, пока немного скучно потому что в основном восстановление и переиначивание всяких принтов с слишком большим количеством на мой вкус закрепления материала, но в целом мне нравится. Чтобы выучить питон сам по себе я думаю меня самого хватит, но по моему в разы быстрее получится пойти на курсы чем разбираться самому какие еще связанные скилы нужны, как к ним подойти, как их связывать и как их лучше учить.
>>2748821 Рилли, гайс, шо за боринг шит... Сириосли, никому не нужны бар лэнгвиджи, ни питон, ни джава, ни другие. Стек технолоджисов нужен, в зависимости от филда. И компетеншн по программинку вообще.
И что значить "выучить питон"? Сюда модули socket, threading, asyncio входят?
>>2748799 Все производные JVM не от оракла медленно но верно подыхают, причем груви с кложой уже трепыхаются в предсмертной агонии, а скала просто медленно умирает обосравшись с 3-й версией.
>>2748808 >Тебе же русским по белому написали, что питухон вспомогательный. И зачем в компаниях выше висят вакансии на программистов у которых основной язык питон?
>>2748808 Как гласит народная мудрость, начни обсуждать любой язык програмирования, как сразу появится джаваеб, который расскажет, что ваш язык говно без задач
>>2748870 >Нужны тебе сокеты, смотришь доки на сокет. пока ты не понимаешь, как сети работают, смотреть доки примерно бесполезно. Ну или ты будешь очень долго смотреть.
Нужно 5 раз исполнить функцию, которая иногда выдает ошибку (из-за внешних факторов). Чекните пикрелейтед, это так делается? Почему-то кажется что что-то не то.
>>2748706 (OP) https://pastebin.com/Pg6SnyfL Братаны, пытаюсь отменить назойливую таску в asyncio, которая иногда может зависать. Очевидно чт ов asyncio можно использовать wait_for с указанием таймаута, я так и делаю, но все что он делает это просто бросает эксепшн при истечении таймаута, таска в бекграунде в другом треде или процессе продолжает исполняться. Как ее кильнуть? Вроде все делаю как надо а эта мразь все равно крутится и не умирает (я поставил sleep на 10 секунд просто для простоты, мой условный sleep длится минут 10 и он блокирующий)
>>2748770 Питон -- топовый язык для экспериментирования, прототипирования и моделирования, за счет ебейшей интерактивности (не на уровне лиспа конечно, но близко) отладка и ходьба по граблям выходит на совершенно новый уровень. Потом можно уже разработанный алгоритм перевести на "серьезный" язык, если это необходимо.
>>2749592 Но джава реально хуйня для макак. В нулевые ее воспринимали хуже, чем сейчас питон. Над теми, кто писал на джаве, насмехались, был даже стереотип, что типичный джава-разработчик это максимально тупой индус, который не способен писать на более сложных языках. И в принципе стереотип был недалек от истины, до сих пор значительная часть легаси на джаве была разработана теми самыми тупыми индусами.
>>2749758 >был даже стереотип, что типичный джава-разработчик это максимально тупой индус жирно аж течёт никогда такого не было, жава всегда была пафосной, сложной, с высоким порогом входа, типа если ты пишешь на ней, то ты крут. А вот скриптовые языки, все, всегда имели имидж языков для начинающих.
Сейчас, конечно, всё поменялось, но всё равно, порог входа в питон ниже, меньше понимать надо и учиться, чтобы хоть чего-то учебное суметь написать.
>>2749871 >сложной Мантра придуманая индусами-джавистами. Статическая типизация - это ведь сложно! x = "string" это хуйня которую напишет даже собака, не то что str x = "string", а потом еще и ide сама скажет, если ты к x будешь обращатсья как не положено, вот где хардкор!
>>2749871 >никогда такого не было Чел, ну кому ты пиздишь? Джава все девяностые и нулевые продвигалась как простой и понятный язык, который поймет даже полный дебил, и постоянно противопоставлялась "сложному и запутанному" С++. Идея джавы - сделать простой язык с максимальной защитой от идиота, чтобы программист не смог выстрелить себе в ногу даже если бы он очень этого захотел.
Анончики, а как у вас в команде к пикрилу относятся? Имхо, отличная вещь, в своих хуитках я её всегда прикручиваю и конфигурирую на максимальную строгость, но вот на работе ситуация послежнее: в проекте вроде как есть mypy в зависимостях, но 1) со скручеными настройками строгости 2) все ложили болт на это дело - в CI тайпчекинга нет, половина комманды про mypy просто не знает, а для "типизации" иногда использует имена переменных с её типом в начале или в конце а-ля "users_list", "cached_data_map" сссука, пишет код обмазанный с ног до головы конструкциями типа "if hasattr(var, 'field')...", "getattr(var, 'field', None)" с аргумениацией в пользу этого по типу "ну бля а вдруг там нет этого поля, тогда эесепшен поднимется, а так всё хорошо будет ыыы" ссссука х2, при этом подшучивают над теми кто пишет на JS без тайпскрипта - ведь о Боже там же если интеджер со строкой сложить то какая-то хуйня получится и поэтому нужно весь фронтенд типами обмазывать а то там бля кнопка не в тот цвет покрасится!!!11!!! а на бэке тем временем даже аннотаций типов в функциях не ставят даже в простейших случаях где аргументы типа int, str, None и т.д.
>>2750245 >Анончики, а как у вас в команде к пикрилу относятся? Обязательно нахуй, вместе с pydantic или датаклассами. Уже был опыт пожирания говна при переписывании чужого сервиса который мешал 6-уровневые джсонины без каких либо подсказок что где приходит. Считай это обязательной частью документации и какой-никакой валидацией.
запускаю проект состоящий из одной строки import contracts
Получаю. ImportError: cannot import name 'operatorPrecedence' from 'pyparsing' (/home/..../.pyenv/versions/3.9.7/lib/python3.9/site-packages/pyparsing/__init__.py)
Обновил пайпарсинг - опять такая-же ошибка. Начал откатывать пайпарсинги, откатил аж до 2.4.6 (c 3.1.0). Начал ругаться AttributeError: module 'numpy' has no attribute 'int'.
Подскажите как сделать чтоб вместе то что на скрине 1 заработало. Код на скрине 2 работает. Так вот как их вместе подружить чтоб yt-dlp.exe запускался по ф4 и паузы на ф2 работали. Пробовал и асинхронно и трединг, и так и так получается хрень. Для меня это новая тема и хочу понять как это всё правильно запускать вместе. Суть в том что по ф4 запускается скачивание видосов, а нажимая ф2 приостанавливаешь процесс yt-dlp.exe или отжимаешь паузу, в зависимости от состояния.
import psutil, datetime, keyboard, subprocess, time # Получаем список всех процессов с заданным именем processes = [p for p in psutil.process_iter(['name', 'status']) if p.info['name'] == "yt-dlp.exe"] def YTD_proc(): for process in processes: if process.status() == "running":process.suspend() elif process.status() == "stopped":process.resume() print(f'YT-DLP.exe is {processes[0].status()} TIME {str(datetime.datetime.now()).split(".")[0]}') def YTD_run(): subprocess.run('c:\\python\\yt-dlp\\yt-dlp.exe --continue --merge-output-format mp4 --format "137+140" -a c:\\python\\yt-dlp\\links.txt') keyboard.add_hotkey('F4', YTD_run) keyboard.add_hotkey('F2', YTD_proc) while True:pass
>>2749498 Сюрприз: прибитая таска вовсе не означает прибитый процесс. Таска-то прибивается, а то что в фоне крутится отдельный тред или процесс, жрущий ресурсы, ивент лупу похеру
>>2749361 И как в эту херню передавать коллбеки? сука, в очередной раз убеждаюсь что динамическая типизация - ебаный кал, как вы блять в этом дерьме разбираетесь? вот что эта сигнатура значит? что блять метод принимает?
>>2750245 Тайп-чекинг в петухоне одобряю. Единственное, я считаю, что строгий тайп-чекинг нужен для либ, а для декларативного слоя можно вообще не юзать или юзать по минимому. У своих шкетов требую тайп аннотации, как часть документации. Сижу и веду проекты на Pyright, плюс он в питоновский экстеншон VScode вшит, что тоже круто. mypy использую для малых проектов, либо без проектов с какой-то поддержкой, чтобы спустя время понимать, что происходит, но сейчас думаю вообще все на Pyright перевести. Год назад разбирал подкапотье майпай и некоторые моменты там очень кривые.
Самый большой недостаток от введения тайп-чекинга на проектах - васяны начинают считать, что если функция проаннотирована, то она может быть калом. В итоге часто вижу кривое разбиение более сложных процессов на функции, которые возвращают сложный объект с аннотацией на 3 строки. Но решилось написание плагина на флейк.
>>2751850 Дык, ООП и ФП, как обычно. Мозгов нет — хуй осилишь. Или тебе именно из особенностей конкретного языка? В Питоне сложно, что типизация динамическая. Заёбывает иногда ошибки искать. Ну и шиза и выебоны лично Опоссума, которого благополучно послали нахуй недавно, слава богу. То case-switch ему не нравится, то тернарный оператор весь как гавно собачье, то ++ нихатюнибуду. Блядь сапогом бы по еблу.
>>2752767 А я ни одной книжки по Питону в своей жизни не открыл. Единственное, что я изучал по книжке, это наверное Джаву, и то потому что маленький и глупый был Самое сложное для меня лично это мультитрединг (сделан он как то странно, возможно из-за GIL), FFI и костылики вроде Numba.
>>2752853 Ну так и пиши так, кто тебе запрещает? Насмотрелся "эффективных" решения во всяких кодворсах, где все пытаются запихнуть все решение в одну строку? Так то говноеды
>>2753386 Знал бы ты настоящие языки программирования, то догадывался бы, что ++ можно использовать в выражении, причём, как до переменной, так и после. Что не только изящно, но и довольно интересно расширяет применение. Но увы, твоя планка — скрипты.
>>2754568 Просто с одной стороны неочевидно, где на самом деле задаётся значение и где его искать, а с другой... У меня есть функция, которой нужно было бы передавать значение через весь стек на глубину в 5-6 вызовов, в каждой из промежуточных функций добавляя ещё один аргумент. И таких функций - несколько, так что всего мне по хардкору понадобится добавить десятки передач, чтобы где-то там внутри параметр явно пришёл как параметр... Всё, разумеется, происходит в пределах одного модуля.
>>2754575 Можешь вверх вынести значения-константы. Эта хуитка с нейм делается, чтобы не было левого выполнения при импорте. Присвоение значений в целом похуй, тем более, если оно будет использоваться в импортирумых функциях.
>>2754575 >Просто с одной стороны неочевидно Все очевидно, просто ты учишь питон по васянским книгам\гайдам. В питоне (как и в любом языке программирования) есть области видимости, в случае питона у тебя их 4 https://data-flair.training/blogs/python-variable-scope/ Первая ссылка из инета, не читал, насколько хорошо подан материал
А то, что тебе надо передавать что то на глубину в 5-6 вызовов, это проблема дизайна твоего кода, очевидно, эту хуйню надо переписать, у нас же не джава что бы закапываться в 40 коллбеков что бы написать хелоу ворлд и потом смотреть всех как на говно
>>2754568 >. Пытаюсь понять: это нормальный кейс? Нет, совсем нет. Глобальные переменные принципиальное зло. В крайнем случае, хотя не надо так делать, заведи какой-нибудь словать glob и в нём храни данные. Но не надо так делать,
Скорее тебе нужно смотреть на классы и объекты, скорее всего, если тебе надо проносить данные на несколько уровней вглубь, у тебя реально твои функции работают с одними данными и их следует оформить как методы, а переменные хранить как атрибуты класса
В реальной жизни твой кейс почти никогда не встречается. Бывает клиника, но тебе туда не надо
Аноны, может кто видел на гитхабе репозиторий с софтом для простановки тагов картинкам (+ другим файлам) и их просмотра в этом же софте. Приздец просто, такая прикладная задача же - поставлять тэги и фильтровать файлы на основе этих тэгов, а нормального софта для этого нет в 2023 году. Хоть сам садись писать. Я бы и написал, но время нет и не будет.
Уже десяток софтин перепробовал и везде какое-то говно не эргономичное. Самое близкое к идеалу TagSpaces, но в нем тоже много косяков, таких как например то, что программа ужасно медленная и всю инфу о тагах хранит в виде отдельных файлов а не в базе данных.
>>2754912 Насиделся на бурах? Оно кажется привлекательным на первый взгляд, но ты быстро забьешь и станет бесполезным. Вот с коммьюнити работает норм, потому что достаточное количество тегозадротов есть.
Ознакамливаюсь тут с вашим питоном, одна математика. Все ЯП такие? Он для чего то подходит кроме создания калькуляторов и разных статистических расчётов?
В данный момент я пишу на PHP, но конкретный язык здесь большого значения не имеет, я вообще задумался над этим, когда пилил проект на Python, так что позволю себе спросить в нескольких тредах. Что рекомендуете почитать на тему обработки исключений? А именно, меня интересует два аспекта:
1. Как понять, в каких случаях стоит бросать исключения, а в каких нет? Например, есть у меня класс, который производит определённые манипуляции над файлами. Поскольку проект может быть запущен в несколько процессов, файлы я блокирую при работе, и блокировщик используется самописный, потому что так нужно. Блокировщик имеет два метода - заблокировать/разблокировать файл, над которым производятся манипуляции. Возникает вопрос - что делать, если выполняется метод unlock над файлом, который и так не заблокирован? Стоит ли в этом случае бросать исключение, которое говорит - атятя, ты пытаешься разблокировать файл, который не заблокирован? Или вести себя так, как будто файл был разблокирован? По сути ведь, результат такой же, как и при разблокировке. Разница лишь в том, что в данном случае файл изначально не был заблокирован. С одной стороны, если бросать исключение, то это как-то более подробно что ли. Ведь по логике не должно быть ситуации, в которой я пытаюсь разблокировать незаблокированный файл. Если такая ситуация возникла, то это как бы не страшно вообще, но и не то, чего я ожидал. Брошенное исключение будет явно заметно и я что-то изменю в алгоритме. А если так и надо, то сделаю что-то типа `try { $lck->unlock("file.bin") } catch (FileDontLockedException $e) { ... }`. С другой стороны... несколько противоречит KISS, не? В сущности, результатов работы у метода `unlock` может быть два: либо файл разблокирован и свободен для манипуляций, либо нет и лови исключение. Ситуации "файл был успешно разблокирован" и "файл изначально не был заблокирован" по своему результату идентичны. Вот и как решить?
2. Есть две крайности. Одна - всякий раз кидать \Exception. Вторая - для каждой ситуации, в которой может быть брошено исключение, создавать собственный класс. Ну, может, в совсем уж одинаковых ситуациях использовать уже имеющийся класс исключения. Вопрос - как найти в этом золотую середину? Если на первый вопрос ответить "кидать исключение", то достойна ли ситуация "файл изначально не был заблокирован" отдельного класса исключения? А ситуация "ты пытаешься разблокировать файл, который был заблокирован другим процессом, и поскольку флаг forced не был передан - соси бибу"? А ещё какая-нибудь?
>>2756551 >сли выполняется метод unlock над файлом, который и так не заблокирован? Исключения нужно бросать туда, где они могут возникнуть. То что ты описываешь это баг, баги надо фиксить, а не ловить в рантайме и обрабатывать
>>2754578 >Можешь вверх вынести значения-константы. Оно получает значение посреди кода, в реальной задаче это не константа. Константы - да, вытащены наверх и помечены UPPER_CASE'ом. >Эта хуитка с нейм делается, чтобы не было левого выполнения при импорте. Это я тоже в курсе, я не первый день пишу код а второй.
Вопрос в легитимности использования в обычной функции типа-глобальной переменной (abc), получающей значение где-то ещё (или не получающей). Эксперимент показывает, что переменная видится и доступна. Мне с первого взгляда не понравились оба варианта. И 100500+ передач и использование в функции переменной, которая ХЗ, где получает значение.
>>2754656 >В питоне (как и в любом языке программирования) есть области видимости Это азы, спасибо. >в случае питона у тебя их 4 А вот это интересно. Особенно потому, что VS-Code показывает ДВА слоя (пик). Видимо, это потому, что в питоне есть только функции `globals()` и `locals()` (ну, ещё `vars()`, но это детали). То что переменная недоступна за пределами места, где она объявлена это просто и понятно. А вот такой случай... Был не очень понятен. В целом по этому материалу стали лучше понятны некоторые детали. В частности делать так, как на пиках в целом - норма.
>А то, что тебе надо передавать что то на глубину в 5-6 вызовов, это проблема дизайна твоего кода, очевидно, эту хуйню надо переписать А вот тут ты хуйню спизднул, конечно. Причём полную. Расщепление кода на отдельные методы несёт две цели: 1. Дедупликапция и переиспользование кода. В частности чтобы не было кучи мест, в которых при случае нужно вносить исправления: лучше ошибиться один раз и потом тысчу раз обратиться к этой ошибке, чем ошибиться в тысяче мест; и, если надо обновить логику, доработать функционал и т.п., то не надо искать все вхождения такого кода. 2. Дробление методов, чтобы каждый из них был достаточно компактным и проще отлаживался.
То есть если у тебя есть кусок, который всплывает неоднократно, есть смысл выделить его в отдельный метод. Если твой метод разросся, то его надо дробить, иначе его правка превратится в кромешный ад. Обычная рекомендация: метод должен помещаться на один экран, чтобы его можно было охватить взглядом, хотя при современных размерах экранов это может быть много, PyLInt со своей стороны, например, рекомендует обойтись по-умолчанию 50 инструкциями и 12 ветками на метод, весьма разумное ограничение на мой взгляд.
Так что появление такого стека (максимум по коду 7 уровней, включая уровень модуля, т.е. 6 ретурнов до модуля) это уже результат оптимизации и рефакторинга. И это в модуле на 900+ LoC, то есть далеко не хэлоуворлд.
Собственно говоря, вопрос возник как раз в процессе рефакторинга, в частности сейчас я избавляюсь от глобальных переменных (оставляю только глобальные константы), избавился от присваивания им значение в функциях через `global`, возвращаю их в модуль ретурнами, обнаружил, что оно продолжило работать без проброса. Посмотрев примеры, прихожу к выводу, что так - норм (лишь бы имена не пересекались, вот это реально ПЛОХО).
>>2754773 >Нет, совсем нет. Я жопой чую, что что-то не так, но как математически выразить... Ну и нашёл в сети немало примеров, которые используют подобный подход. Так что скорее "не совсем", нежели "совсем нет". >Глобальные переменные принципиальное зло. Аще не спорю. >заведи какой-нибудь словать glob и в нём храни данные А чем это вообще отличается от словаря globals(), если уж на то пошло? >Скорее тебе нужно смотреть на классы и объекты Не тот случай, пожалуй. На самом деле это довольно изолированный, пусть и большой скрипт, выполняющий одну конкретную понятную и нетрудную работу по валидации и сортировке данных. Он из категории "шоб работало" и из другого места его вызов просто не предусмотрен. То есть обернуть всё в класс - вопрос небольшого времени и вообще совет понятен, я даже думал об этом, но решил, что нахуй-нахуй: я от этого не получу ВООБЩЕ ничего, кроме означенного места хранения некоторых переменных. Ни наследования, ни полиморфизма, ни инкапсуляции. Даже двух объектов этого класса никогда не появится просто по дизайну.
>>2756551 Сложно вообще понять чего ты пытаешься достичь. Похоже на то, что у тебя так программа и работает, что вызываются методы объекта, которые ничего с ним не делают, это твое "снятие блокировки". Это не исключение, это изъян в логике программы либо просто рядовое условие, называй как хочешь. if super_blokirovka: pook else srenk.
>>2756986 Э, нет. В начале работы проверяется, заблокирован ли файл (технически - есть ли файл data.bin.locked, который является признаком того, что data.bin заблокирован). Если он заблокирован, то N раз ждём и проверяем заблокированность ещё раз, спустя какое-то время пукаем и обмякаем, заявив, что файл заблокирован и разблокироваться не собирается, видимо. Если он не заблокирован, то блокируем (создаём data.bin.locked) и начинаем работу. В конце работы обратно разблокируем (удаляем data.bin.locked).
>>2756800 >Есть мнение, что исключений лучше вообще избегать, т.к. они запутывают логику и стэк вызовов Нет такого мнения. Ты тредом ошибся, уходи отсюда вот сюда: >>2740805 (OP)
>>2756950 >А чем это вообще отличается от словаря globals(), если уж на то пошло? Документированностью, возможностью контроля. Всё-таки globals() это одна общая куча без возможности контроля.
Когда ты делаешь свой glob, ты уже видишь, где это используется, при желании ты можешь дополнительные инструменты реализовать, вместо обычного словаря чтобы это был объект, с возможностью контролировать, кто в него пишет и т.п.
Скачал ворованый курс по питону, там какой-то чвякающий хуесос. Пытался по нему заниматься, но вот просто невероятно противно гундосит в микрофон, плюс ошибки в слайдах, плюс шизофреническая непоследовательность в темах. А ведь люди за это деньги платят. Открыл книжку и сразу пошло-поехало нормально. Только чет сегодня охуел с упражнения. Оказывается для того, чтобы его сделать надо следующую главу прочитать было, но все равно насколько же книга превосходит какие-то слитые курсы.
>>2757221 >Документированностью, возможностью контроля. Хм-м. Какой-то смысл в этом есть, НО. Всё-равно получается что у тебя глобальная переменная, при чём особый смак, что опять же ты ГДЕ-ТО пишешь в глобальную переменую. Вроде и более понятно, что это именно она, но её заполнение всё-равно будет где-то реализовано и, если ты успешно избавился от "redefining name from outer scope", то разницы считай нет, это ровно такая же запись в глобальную переменную. Только ещё вычурнее потому что для изменения в функции глобальной переменной со строкой тебе нужно в функции явно сделать global. А добавлять в dict новые записи можно без него и теперь вместо "а где у меня появляется эта переменная?" нужно думать "а где у меня в этот дикт добавляется такое поле?" и не факт, что это удобнее. Тогда уж лучше бессмысленные классы.
>>2757230 Чувак. Вот представь. У тебя есть портянка. Если весь код вытянуть в линию, то это будут тысячи строк. Ты берешь и чикаешь его и у тебя 50 000 строк превращаются в 7000 строк с функциями и глубиной в 2 уровня. А потом берёшь и чикаешь ещё, в итоге у тебя три уровня и 2 500 строк и 3 уровня, потом повторяешь ещё, видишь, что тебе сложно охватить целый метод и преврящаешь метод на 200 строк в три метода на 50 строк плюс россыпь вспомогательных, совсем уже по 3-10 строк (и ОПА, у тебя уже 5 уровней). Зато в другом месте ты делаешь универсальный метод и вместо 4 одинаковых методов ты получаешь один даже чуть-чуть поменьше и четыре чекера, передаваемых аргументами. А где-то на самом конце стека будет вообще двухстрочная фитюлина, хитро склеивающая строки с джойном и форматом, но вызываемая постоянно из самых разных мест. В итоге ты получаешь стек длинной до десятка ретурнов на ровном месте, зато поддержка кода не требует вообще никаких усилий потому что всегда можно легко и быстро понять, какой маленький кусочек кода что делает и поменять именно его. При этом сам код модуля у меня, например, 40 строк с комментариями. Разделение кода на несколько функций приводит к тому, что у тебя увеличивается количество вызовов этих функций из разных мест. Неизбежно.
Даже большие системы теперь делают по схожему модульному принципу: компактные контейнеры плюс кубер, который ими погоняет и организует связи.
Глобальные переменные официально не считаются зашкваром, есть даже модуль contextvars, в котором эти контекстные переменные подразумевают, что бы будешь глобально ими пользоваться. Он, конечно, для другого нужно, это просто показывает отношение.
словарь свой бы легко может прогрепать, плюс ещё у может быть несколько словарей для разных задач
на практике вот когда это встречается, это когда у тебя глобальный конфиг, из которого берутся параметры
Что ещё возможно: ты можешь при необходимости свой словарь подменять на какой-нибудь другой объект, без переписывания кода. Этот объект может геттеры-сеттеры реализовывать, мы можешь отследить, кто какую переменную меняет (и откуда), настроить логирование и т.п. Конечно это больше гипотетически, вряд ли кто так часто делает.
>>2757333 Добавлю еще ложку говна в курсы. Проявляется вообще очень важная проблема характерная для плохих преподавателей. Преподаватель ассоциирует ученика с собой. Он реально считает, что раз он (преподаватель) что-то знает, то знает и ученик и объясняет исходя из этого. А в книге исходят из того, что ты ничего не знаешь, ты вообще инопланетянин с планеты жопа, тебе сразу говорят, что ты конечно ничего не понимаешь, но тебя можно научить и учат.
>>2757333 >какой-то чвякающий хуесос Хуёво. Но вообще курсы курсам рознь. И самое главное в них - не видосики, а поддержка: есть, к кому обратиться за пояснением, если нихуя не понял. Так-то и без этого есть на ютапчике куча приличных плейлистов. Я, например, по одному такому джангу изучал, годно вышло. Книги, кстати, тоже бывают разные. По коду: в целом неплохо и соответствует ТЗ, насколько я могу судить, не запуская, а это главное (мне, правда, показалось, что там должен быть int(), а не float(), но это толком не оговорено, а значит так можно). Но кое-что стоит поправить. 1. Нейминг. У меня от "chisla" глаза закровоточили. Даже "числа" смотрится лучше, но они оба хуже, чем "numbers". 2. Объявление переменной через вызов list()... Вроде, и норм, но как-то больше принято использовать литералы. Я сам предпочитаю typig + literal, то есть я бы сделал "numbers: list = []" 3. "if inp == 'done': break" лучше всё-таки разделить на две строки. Это не очень критично, но всё-таки улучшит читаемость. 4. Принты лучше сгруппировать после всех расчётов, чтобы ты сначала считал, потом выводил. 4.1. Я бы обошёлся одним принтом. 4.2. Добавить пробел внутри кавычек - стронгли рекомендед! 5. Пожалуй, самое главное: у тебя два вызова "sum(chisla)", то есть ты дважды проходишь по списку чисел и делаешь математику, хотя сумму ты сохранил и можешь использовать её ещё раз. Просто представь, что пользователь ввёл миллиард чисел, в этом случае ты сначала считаешь сумму миллиарда чисел, а потом... ещё раз её считаешь, чтобы разделить её на миллиард. МОжно же обойтись. 6. Добро пожаловать в 2023-й год, в наше благословенное время в питоне есть f-строки, категорически рекомендую применять именно их потому что так быстрее. Пруфы: https://habr.com/ru/articles/462179/ , бонус: https://habr.com/ru/companies/wunderfund/articles/674866/
>>2757360 Это не проблема курсов, а проблема издателей. Любой даун может переварить и высрать в своем изложении ту же книгу или даже доку на ютубчик или какой-то удеми, чтобы заработать денег (принеся деньги и платформе, так что им это в любом случае выгодно). Книжному издателю нужен вменяемый автор (которому надо заплатить), всякий там QC, подготовка-оформление, иногда ещё и печать (лул). Так что говно делать невыгодно и можно попасть на деньги. Переводить говнокниги тоже смысла мало, тем более на нищерынке вроде постовка, так что берут самые ходовые оригиналы. Вот так и получается.
>>2757370 ИМХО критичнее то, что нет проверки на пустой список Если пользователь сразу введёт done, то будет исключение от деления на ноль. Лучше сразу привыкать думать о подобных случаях
>>2757370 Сохраню твой пост и поковыряю на выходных. А вообще это считай все же первые шаги в питоне, но мне нравится. Я не форсирую изучение, сразу по несколько тем за день не делаю хотя соблазн есть. Не хочу кашу информационную в голове, хочу все по полочкам. Очень приятное ощущение, кстати, когда пишешь, не получается, что-то, а потом раз и заработало. Этакая мозговая щекотка.
>>2757336 >Чувак. Вот представь. У тебя есть портянка. Если весь код вытянуть в линию, то это будут тысячи строк Еще раз, ты путаешь теплое с мягким. ПРи чем тут калбекхел и расложения кода на классы\методы?
>>2757380 Кстати, да. Не подумал. >>2757383 А вот это предполагал, но это неочевидно, так что от новичка я такого не жду. >>2757381 Я лично учился по вот этому: https://pythonworld.ru/samouchitel-python Годно и на русском. Но хорошо бы что-то уметь заранее. Иначе - Лутц - маст хэв. У него целый океан воды, зато если читатель воспримет 10% материала - этого уже будет достаточно.
>>2757481 Ты шизу какую-то написал с вытягиванием кода в линию и т.п. Вообще не понятно, о чём.
Я предполагаю, что то просто от недостатка опыта и понимания, как выглядит программирование. Откуда берутся разные решения, почему так делают. Хотя на самом деле в половине случаев разрами сами не знаю, что больно... Код с глубокой вложенностью тяжело поддерживать.
Причём ты сам же это описывает в своём примере, где ты хочешь глобальные переменные использовать, типа сложно проносить данные вглубь и т.п. Как раз иллюстрация одной из проблем.
>>2757582 Чувак, ты всерьез споришь с чсв вкатывальщиком без опыта? Он прогает пару недель, но уже готовиться писать свои книги по питону и давать платные курсы. Забей.
В одном легаси проекте мне надоела портянка ручных джойнов данных из кучи разных источников. Хочу написать мини либу, в котором можно описать "таблицы" (условно датакласс который имеет разные id по которым его можно получать) Создать связи между ними(просто набор ребер соединяющие таблицы по id). Дальше иметь возможность выбрать какое-то подмножество полей этих таблиц и эффективно получать эти данные и формировать результат содержащий таблицу со строками из всех запрошенных полей.
Собственно написать не сложно, но любопытно мб есть хорошее готовое решение, кажется что подобное нужно много кому
>>2757582 >Ты шизу какую-то написал Просто довёл до абсурда. Шизу написал чувак, который говорит, что код углублять нельзя и "функция" + ", в коде которой есть вызов функции" * x не имеет права на существование. Он как раз предпочёл бы плоский код без вызовов, видимо. А на самом деле пока я не перешёл к этой модели код вообще не писался, любой более-менее сложный кусок приходилось вчитывать часами, а когда достаточно расщепил - всё само получилось. >Код с глубокой вложенностью тяжело поддерживать. Код без вложенности поддерживать сложнее. А когда абстрагируешься от реализации вложенной функции и принимаешь её как данность (ты же не лезешь, например, в код функции print(), ты просто принимаешь, что она работает), то всё становится хорошо. > сложно проносить данные вглубь Если бы текущая задача не была самостоятельным куском в себе, я бы переписал на классы, благо это реально на уровне "добавить 2 строки, поправить отступы, проставить перед переменными, использующимися за пределами функции 'self.'", я такое уже делал, но тогда от этого была практическая польза: было несколько объектов и потенциальный импорт модуля. >>2757597 >уже готовиться писать свои книги по питону и давать платные курсы В отличии от тебя - нет. Я вообще не называю себя этим грязным словом "программист". Я - практик, который время от времени пишет разный код. Рабочий код, ЧСХ. И никто на сложность поддержки не жаловался.
>>2757917 Мне точно не хочется тратить время и менять то как весь этот мусор хранится. Опишу ещё раз Есть процесс 1. В запросе shit_keys = [key1...keyn]
2. shits = fetch_shits(shit_keys) shit_items = fetch_shit_items(shits) ... Очень длинная хуевая цепочка где могут быть shit_shit_shit_items(..)
После весь этот мусор надо объединить.
Я вижу лёгкий способ сделать все это по человечески собственно в начальном посте я это описал
>>2757879 >Просто довёл до абсурда. Шизу написал чувак, который говорит, что код углублять нельзя и "функция" + ", в коде которой есть вызов функции" * x не имеет права на существование. Он как раз предпочёл бы плоский код без вызовов, видимо. Ты это сам придумал, и выдал за мои слова. Я сказал, что ты не знаком с азами дизайна, и из твоих постов очевидно, что ты зеленый нуб, но ты на серьезных щщах пытаешься делать вид, что ты неебаться хакер. Со стороны это выглядит, как будто ребенок пытается объяснить взрослому как заполнить налоговую декларацию. Выглядит глупо. Успойся.
>>2757879 >Я - практик, который время от времени пишет разный код >Не знает про скоупы >ДУмает что ооп это про классы >Не знает азов дизайна Нет дядя, ты - дурак
>>2757930 Выглядит так, будто тебе реально нужен OLAP, собирающий разнородные данные, сейчас всяких DWH-решений уйма потому что любой бизнес старается анализировать всё вокруг. Одно из решений Greenplum - он через PXF'ы цепляется ко всем возможным источникам (для невозможных придётся написать драйвер) и предлагает лютую мощь по выплёвыванию аналитики. Можешь кликхаус покурить ещё, там тоже было что-то подобное. Даже писать ничего не надо.
>>2756449 >Все ЯП такие? Нет, конечно же. Рекомендую присмотреться к линейке С*.
>>2756449 >Он для чего то подходит кроме создания калькуляторов и разных статистических расчётов? Это язык для ковыряние в статистике и аналитике при помощи т.н. «ноутбуков» (типа Юпитера). Самое оно сидеть и вертеть табличку с какими-нибудь данными, которые тебе мнс высрал за месяцы, пытаясь натянуть выхлопа на публикацию в научжурнале.
>>2756551 Друзья-милорды на Петоне быстренько накидывают прототип проекта, чтобы посмотреть, чо как, а потом переписывают на нормальном языке по всей науке.
Получаю лист вот такого вида [{'name': 'test1', 'price': '123', 'number': '321'}, {'name': 'test2', 'price': '456', 'number': '789'}, ..., ] Как с таким листом работать? Мне нужно из этого листа сформировать новый лист со всеми значениями "price", как это сделать? Во всех гайдах по листам в списках просто перечисление элементов. Или это словарь? Но type() возвращает list
>>2759508 Синьор тимлид в треде. Вот твой код, не благодари.
lst = [{'name': 'test1', 'price': '123', 'number': '321'}, {'name': 'test2', 'price': '456', 'number': '789'}, ] global price_list price_list = [] for e, index in enumerate(reversed(lst)): if index in list(lst) and type(e): for index2 in index: if index2 == 'price': price_list.extend([lst[e][index2]]) print(price_list)
>>2759818 Да що ты будешь делать. Опять отступы украли. Ну ничего я не гордый.
lst = [{'name': 'test1', 'price': '123', 'number': '321'}, {'name': 'test2', 'price': '456', 'number': '789'}, ] global price_list price_list = [] for e, index in enumerate(reversed(lst)): ....if index in list(lst) and type(e): ........for index2 in index: ............if index2 == 'price': ................price_list.extend([lst[e][index2]]) print(price_list)
Петюня, что посоветуешь для динамического автодополнения аргументов для пинонячего скрипта из под беша?
Короче, написал программку, использую argparse чтобы принимать аргументы на входе. Один из аргументов это имена png картинок из одной определённой папки (количество может менятся от старта к старту). Хочу чтоб работало автодополнение из беша. Как решается?
>>2760394 >Хочу чтоб работало автодополнение из беша. Ставишь fzf просто поверх баша, потом Ctrl+T жмешь когда файл нужный надо найти. В винде еще можно поставить поверх павершелла. Даже если я не по теме ответил, fzf -- охуенная штука, всем рикамендую.
Господа петухонщики, вы как там, нормально у вас всё?
Качал тут на днях дипфейк тулзы (для гачи мемов), устанавливал все, настраивал. Крашнулась сборка из-за отсутствия Build Tools 2022. Ну ничё такого, установил, начал весь процесс по новой.
И ТУТ Я ПРОСТО ОХУЕЛ. Этот ваш PIP конченный уже скачанные пакеты валидирует и достает из кеша просто ЕБУЧУЮ ВЕЧНОСТЬ. Процесс, который в теории должен проходить за 10 секунд, длится минут 10, еще при этом периодически нагружая на фулл не самый слабый проц.
Более того, обратил внимание, что разные версии пакетов не встают на разных минорных версиях петухончика. Причем происходит это без каких-либо адекватных сообщений. Блядь, пришлось еще даунгрейдится с 3.11 на 3.10, чтобы всё завелось.
>>2760507 >Этот ваш PIP конченный уже скачанные пакеты валидирует и достает из кеша просто ЕБУЧУЮ ВЕЧНОСТЬ Проблема на твоей стороне >Более того, обратил внимание, что разные версии пакетов не встают на разных минорных версиях петухончика. А схуяли должны? >Причем происходит это без каких-либо адекватных сообщений. Там буквально написано, что не встало и почему
>>2760393 Можно быстрее, в одну строку: > float(str[str.find(':')+1:]) Чтобы её прочитать быстро нужен навык, зато кода сильно меньше и не забиваешь голову промежуточными переменными и их неймингом. Опять же нейминг: "number"? Число то бишь? Что за число? Что оно значит? Получил ты не абстрактное число, а позицию, на которой находится искомый символ. "end_number"? Конечное число? Число конца? Порнография какая-то пошла в общем. Неочевидные названия - зло, если они используются не в двух строках подряд, но и там вопрос, нужно ли оно тебе.
>>2760783 Как бы я решил задачу я уже написал. Полный вариант типа такого (пишу код прямо в форме ответа, без проверки): > import sys > str = "abracadabra:0.123" > try: > ....number = float(str[str.find(':')+1:]) > except ValueError: > ....print(f"После двоеточия не float, а {str[str.find(':')+1:]}", file=sys.stderr) > ....sys.exit(1) Тут как бы в переменной number уже есть целевое число, дальше можно с ним делать, что хочешь.
Но если прямо нужно сохранить промежуточный параметр, то это позиция, на которой находится двоеточие, то есть что-то типа "colon_position".
В рамках задачи у тебя просто число (поэтому в коде выше оно названо "number"), но если подумать, то, судя по формату, тут это значение некоего параметра "abracadabra", так что впоследствии его будет удобно использовать в духе "abracadabra_value".
Если предположить, что у тебя таких параметров много, то уместнее будет сделать словарь, скорее всего, это тебе опишут чуть позже, так что раскрывать мысль не буду.
КСТАТИ. Важный момент. Упустил. Тебе же ещё ТОГДА: >>2757333 рассказали про try-except. Почему ты их не использовал? Тебе эта строка могла прийти откуда угодно: пользователь ввёл руками, прочитал из файла и т.п. Почему ты не предположил, что входной параметр может быть некачественным?.. Он ведь может и к этому нужно быть готовым.
И ещё про ТОТ случай: хорошим тоном является указывать, какую ошибку ты ловишь в эксцепте. Например, тут - "except ValueError:". Это нужно в частности потому, что можно обрабатывать разные эксцепшны в этом куске кода и конструкция может быть такой: try - except - except - except - else - finally.
>>2760508 Как интересно... Я спрашивал, как правильно подставлять окончания слов в зависимости от количества и не получил ответа (вернее мне сказали, что я делаю это неправильно, но как правильно - не сказали, это тут вообще платина), а на той неделе всплыл строковый метод `format`, которым я теперь пользуюсь с большим удобством. Ранее я спрашивал, как удобно запускать скрипты во внешней консоли и не получил никакого ответа, а сегодня вижу ЭТО. Ну, пожалуй, для случаев с МНОГАТЕКСТА "console": "externalTerminal" по-прежнему удобнее, но и в таком подходе, как в видосике немало профита. Одно бесит: то, что он называет штатным функционалом работу плагина и при этом неочевидно, какого. Для ЛЛ - плагин вот этот: https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter В пипе ставится (vs поставит сам) ipykernel (плюс он по зависимостям тянет ещё 29 модулей), так что лучше сделать venv.
>>2760514 Если ты полный анальный раб винды, советую перейти на WSL (это не требует почти ничего), если нет - на Ubuntu. На линуксах просто не всплывает большое количество "особенностей", которые на виндах заёбывает решать.
1. Ебу мамку ОПа а. Сильно функция f_1a() б. Слабофункция f_1b() в. Не стоит совсемфункция f_1v() q. Выход из режима трахафункция f_1q()
2. ёбу батьку на спине мамки а. аж возбудилсяфункция f_2a() б. Слабо, не кончилфункция f_2b() в. Не стоит писяфункция f_2v() q. Выход из режима трахафункция f_2q()
inp = input("комманда?").strip().lower()
Как можно реализовать такой трах? В консоли, на чистом пистоне.
1. Ебу мамку ОПа а. Сильно функция f_1a() б. Слабофункция f_1b() в. Не стоит совсемфункция f_1v() q. Выход из режима трахафункция f_1q()
2. ёбу батьку на спине мамки а. аж возбудилсяфункция f_2a() б. Слабо, не кончилфункция f_2b() в. Не стоит писяфункция f_2v() q. Выход из режима трахафункция f_2q()
inp = input("комманда?").strip().lower()
Как можно реализовать такой трах? В консоли, на чистом пистоне.
>>2760519 Я тоже так думал пока сам не стал дата-дебилом Даже если не использовать активно Юпитер в разработке (типа накидал код сниппетов - обернул их в функции - скопипастил в модули), быстро проверить как работает какая-нибудь фича языка или либы бывает полезно. А в обычном REPL это делать не очень удобно. >>2760514 Ну посмотри видос то, лучше один раз увидеть. >>2761086 >для случаев с МНОГАТЕКСТА "console": "externalTerminal" по-прежнему удобнее Я просто пайпом в файл скидываю обычно.
>>2761528 >Я просто пайпом в файл скидываю обычно. Если интерактив, пожавлуй, не слишком удобно. Как минимум на этапе отладки взаимодействия: нужно видеть что было раньше и иметь возможность стопнуть и посмотреть, что в переменных.
>>2761691 Интересно, а шебаги там не показывали?.. Ну, похуй тащемта, это приятная мелочь.
М-м. А ты вообще тестировал свой скрипт?.. Хорошо тестировал?..
В принте пасхалки ты выводишь не ту строку, которую предлагают выводить в примере. Исправь. Это делается легко, есть два способа, по-хорошему найди их оба. Файл открывается без параметров (кодировка, чтение/запись/етц). Файл не закрывается! Это плохо. Вообще рекомендую работать с файлами по возможности через `with`. Намного удобнее. `continue` лучше вынести на отдельные строки. Хотя есть способ ещё лучше: > if line.startswith("blah-blah-blah-param"): И не надо ни сплитить неустраивающие тебя строки, ни ещё чего. Код можно сделать чище: > count += 1 > sum += ratio `average` надо считать не внутри `for`, а после потому что он не используется и ты вхолостую гоняешь процессор. Это здесь и сейчас небольшая проблема, но однажды может вырасти.
Теперь вернёмся к вопросу про тестирование. А что будет, если в файле нет НИ ОДНОЙ подходящей строки? Если вычисление `average` будет как сейчас, то на последней строке ты упадёшь с `NameError: name 'average' is not defined`. Если вынесешь его расчёт за цикл - упадёшь с ошибкой `ZeroDivisionError: division by zero`. Можно, конечно, сначала (перед циклом) объявить его, скажем, тоже равным нулю, но правильнее сделать так: цикл проходит, потом проверить (не траем, а ифом), не равен ли каунт нулю и в зависимости от этого выдать либо одни сообщения, либо другие.
И ещё. Рекомендую завести полезную привычку: поставь себе flake8 (для него тоже есть плагины, покури тему сам) и pylint и добавь в VS соответсвующие плагины: https://marketplace.visualstudio.com/items?itemName=ms-python.flake8 https://marketplace.visualstudio.com/items?itemName=ms-python.pylint После этого на вкладке "problems" появятся вещи, которые линтеры считают неправильными, постарайся каждый раз избавиться ото всех них. Линтеры (т.е. статические анализаторы кода, программы, которые оценивают твой код и находят потенциально проблемные места) писали опытные люди и
>>2761857 Сходу костыль (скорее всего, внутри оно всё будет так же): > def round_down(number, ndigits=0): > ....return int(number * 10 ndigits)/10 ndigits
>>2761885 Пробуй. На самом деле есть два очень-очень простых варианта, и ХЗ, сколько менее простых. Я итак дал пару готовых советов по коду, попробуй с этим разобраться сам.
>>2761867 >шебаги Опечатка. Должно быть "шебанги".
>>2761910 У меня есть вторая версия этой программы, но она ублюдская и мне не нравится. Прям вот отвращение вызывает. Там как раз через if делал, но, повторюсь, мерзотно. Даже я, совсем не разбирающийся в питоне понимаю, что получился какой-то франкенштейн, та версия которую показал получилась лучше. За советы спасибо, поковыряюсь.
>>2762026 Ни одно СМИ в мире ни разу в истории не опубликовало ни одной true story. Если не считать научных журналов, но и там мягко говоря не всё истина.
>>2760675 Нюфаня плз. Если не знаешь весь подкпот пайтона то хоть не позорься, всё что там написано сделано с определенной целью - понимание приходит только с долгим опытом разработки.
>>2761956 Ходишь по "русскоязычных новостных сайтов" и смотришь, есть ли у них "бесплатные API".
У яндекса наверняка есть апи раздающее новости, у любых остальных ресурсов скорее всего нет просто никому это не нужно, а кому нужно просто парсер себе сделает.
Помогите с openpyxl. Хотел сделать в файле экселя границы ячеек. Подключил from openpyxl.styles import Side, Border Сделал границы Thin_border_top = Border(top=Side(style='thin')) Применяю эти границы к ячейке sheet.cell(row=1, column=3, value=1).border = Thin_border_top и не работает. Не делает в ячейке границу. Я даже пробовал полностью копировать примеры из инета, тоже не работает. Запись всякого в ячейки работает, шрифты работают.
>>2761528 А еще есть такая фишка. Разделить код скрипта на две клетки, в одном импорты и всякая инициализация, а в другом основной код. И если нужно отладить, то первая клетка запускается один раз, а дальше отлаживается чисто вторая клетка. Так можно сократить время между перезапусками дебаггера. Импорт торча например занимает несколько секунд, из-за этого перезапускать дебаггер каждый раз немного грустно.
Привет, двач. Тыкаюсь в http. Есть задача по моделированию умного дома. Эмулирую хаб, который всем руководит.
Информация по сети гуляет пакетами. В двоичном виде. Закодирована с помощью URL-encoded unpadded Base64. Все пробельные символы отбрасываются. type packet struct { length byte(беззнаковое 8-битное значение) payload bytes(массив байтов) crc8 byte(беззнаковое 8-битное значение) }; length - длина поля payload payload - полезная информация crc8 - контрольная сумма.
Делаю запрос. Получаю, например, b'DbMG_38IBgaMwsm1lDE5'. Декодирую через base64.urlsafe_b64decode(). Получаю b'\r\xb3\x06\xff\x7f\x08\x06\x06\x8c\xc2\xc9\xb5\x9419'.
Вообще не понимаю, что с этим делать дальше. Как из этого получить пакет? Каак? Помогите, пж
>>2762584 >Делаю запрос >Получаю >Как из этого получить пакет? Каак? Так ты его уже получил, дебил. Сначала в закодированном виде, потом перегнал в строку.
Чота я в сомнениях. Заглянул в лекции по питону от МФТИ, а там черепаху гоняют! Я тоже хочу черепаху гонять, а не текст уныло дрочить. Вот и думаю, сделать паузу в книге и уйти учиться по мфти или добить книжку и уже с книжными знаниями черепаху дергать?
>>2762682 Вангую, что долбоебы реально вручную считали, чтобы получить этот важнейший факт, ещё до того, как придумали ЭВМ. Можно было бы подумать, что нет, но долбоебы они на то и долбоебы, так-то.
>>2762682 Ты вообще читаешь замечания к своему коду тут? Правишь скрипты по советом анонов?.. Если нет, то не вижу смысла разбирать. Давай так. Пости все свои исправленные по советам выше скрипты и тогда я продолжу комментирование кода.
>хочу черепаху гонять Можешь хоть лысого гонять. Черепашка предназначена для понимания алгоритмов вообще и всяких там циклов и функций уровня пика. Знать по хорошему нужно всё, но задачки на черепаху более абстрактные и от них до реального кода отрыв больше, чем у книжек.
>>2762959 Замечания читаю, кое что в прошлых переделал, но новые упражнения делаю прежде всего так, как в книге написано. Сначала функциональность, а потом вылизывание кода, все эти чеки ошибок и прочее, на что ты обращал внимание. Касательно дальнейших комментариев твоих - я не принуждаю, можешь не комментировать.
>>2762969 >все эти чеки ошибок и прочее А на ус намотать и не повторять больше не хочешь? Почему у тебя опять файл не закрывается? Не поверю, что в книжке не говорилось об этом. Почему без with? Как раз в данном случае with даёт огромное преимущество потому что тогда файл предстаёт как генератор, а ты в своём коде просто берёшь и сразу его целиком читаешь, что намного менее эффективно в плане памяти. Загружать в память всего шекспира за раз - крайне сомнительная идея. А когда файлы будут не по 5-10 МБ, а по 5-10 ГБ? Тоже будешь грузить целиком?
Привет, подскажите пожалуйста с одной задачей. Нужно в экселе на основании данных из одной таблицы отредактировать данные в другой, то бишь сравнить столбцы двух таблиц и если есть совпадения, то добавить несколько символов в одну из них. Как это можно реализовать? А хуй знает.
С ебучими продуктами пакета офис я вообще не взаимодействовал и не ебу с какой стороны заходить, поэтому первая мысль была про циклы в пистоне.
>>2763688 Есть всего несколько библиотек для работы с экселевскими файлами - все в гугле хорошо описаны не ошибешся. Все они примерно одинаковые. Наверно самая популярная это openpyxl. Но если ты совсем нюфаня в погромировании, то лучше сразу забей, порог вхождения в эту ебанину выше среднего.
>>2763711 >>2763688 Добавлю, что если тебе нужно просто сравнение таблиц лучше делай это средствами самого эксела, там у него ещё и какой-то скриптовый язык свой есть. я помню 10 лет назад даже что-то писал на нем. Питон в этой задаче будет костылем, его имело бы смысл применять если бы тебе надо было жонглировать кучей файлов и управлять таблицами из другой прилажухи, а так - проще в самом экселе сделать.
>>2763733 Да уже не помню точно, кажется да, VBA. Для сравнения двух таблиц более чем достаточно. Впрочем сравнить две таблицы можно наверное даже в ячейке внутри экселя с помощью формул
>>2763733 >Бэйсик? В экселе от мелкомягких - всегда был только он. Вернее его допиленный вариант "Visual Basic for Applications" (VBA). Одна из вещей, которые мне особо нравятся в Libre Office здорового человека: там тебя так не ограничивают и ЯП куда больше, среди них JS и Python. Так что, если MS не принципиален, можно сделать всё в либре.
>>2763162 > with даёт огромное преимущество потому что тогда файл предстаёт как генератор Тащемта файл он всегда генератор, был генератором еще когда with и в проекте не было. И тот факт что файл это генератор к расходу памяти никакого отношения не имеет.
>>2765232 Ты какую-то хуйню написал. В контексте именно файла генератор как раз нужен чтобы большие файлы, которые в память целиком не влезут, обрабатывать маленькими кусками.
>>2765240 >вызываешь .read() И в этот момент прочитается весь файл.Да. я вижу дополнительные параметры, но ты попробуй так сделать с текстовыми файлами и дай гарантию, что слово не порвётся посередине. Для текстовых файлов зайдёт readline().
Сука, пол дня сегодня проебался с простейшей задачей на степике. Если мне тяжело такое решать - у меня есть шансы, просто нужна практика, или программирование это не моё?
>>2766500 Не факт, что такое решение предусматривалось, но def get_biggest(arr): ____return int(''.join(sorted(map(str, arr), reverse=True))) if arr else -1
>>2766550 Это как раз первое, что мне пришло в голову, но это не работает. Например, у нас на входе числа 7, 71, 72 - такой код выдаст 72717, а должно быть 77271.
>>2766557 >>2766555 не, можно чуть проапгрейдить и сделать в одну строчку return int(''.join(sorted(map(str, arr), reverse=True, key=lambda x: x+'z'))) if arr else -1
>>2766571 Я просто по тестам, прилагающимся к задаче, прогнал и первый зафейлившийся тест выложил. Выше приводили более простой аналогичный пример - >>2766564
>>2766552 > пузырьковой сортировкой https://www.youtube.com/watch?v=6nQZVS657Ew Сильно неоптимально. >>2766500 Вижу два пути, но придумывать реализацию лень. 1. Перебрать комбинации, выбрать максимальную. Реализуется максимально просто (например, через itertools.product), результат гарантирован, но работать будет пиздец медленно. 2. Сначала перегнать числа в текст, потом сортнуть по алфавиту (от сортировки по числам, понятно, придётся отказаться), потом склеить и перегнать назад в число. Но есть тонкости. Например, если начало совпадает: в 2, 21 короткое число должно быть раньше, а в 1, 12 - позже.
>>2766612 >Ты, к слову, понимаешь, почему это решение работает? Ну я не знал про cmp-функции и про то, что их можно запихнуть в сортировку, но вроде разобрался, спасибо.
>>2766767 > Ну я не знал про cmp-функции и про то, что их можно запихнуть в сортировку
Я скорее не про реализацию говорил - с ней-то всё понятно более-менее, а про сам алгоритм. Понятно ли, почему алгоритм (который ты сам в общем-то реализовал) выдаёт правильный ответ? Впрочем, если говоришь, что разобрался, то уже и не важно. Всё хорошо, значит.
>>2748706 (OP) Двач, только начал учить питон. Есть задача - получить код страницы dzen.ru. В браузере показывает код нормальный - пик1. Но через GET запрос на питоне выдает вообще другую хуету - pic2. А вот если кинуть ссылку на двач, например, то код дает нормальный код страницы.
Слегка загуглив, нашел, что это пидоры владельцы сайта там какую то ссаную защиту от парсинга установили. Как обойти эту защиту ебучую, может кто в курсе?
>>2767323 > А зачем это тут? > Это же функция которая конвертирует cmp(). которого в питоне 3 больше нет?
Ты сам на свой вопрос только что ответил. В python3 у sorted() нет параметра cmp, а есть только параметр key. Поэтому если ты хочешь использовать для sorted кастомный компаратор (то есть callable, принимающий 2 параметра, а не один), то его надо каким-то образом конвертировать в то, что ожидает на вход key, то есть в callable, принимающий на вход 1 параметр.
>>2767237 >Как обойти эту защиту ебучую, может кто в курсе? Эти "защиты ебучие" разрабатывают серьёзные дяди за большие деньги, та что раз ты так быстро сдулся и пошёл спрашивать - то никак :)
>>2767437 Параметр key ожидает на вход callable c одним параметром. Что это за callable? Это callable, который принимает на вход один элемент массива и возвращает "ключ". Ключ - это какой-то объект, который и будет использоваться при сравнении вместо непосредственно элемента массива, по которому он был построен. То есть представь себе процесс сортировки. В какой-то момент у тебя возникает необходимость сравнить элементы a и b. Вместо того, чтоб сравнивать их непосредственно, алгоритм делает так: key_a = build_key(a) key_b = build_key(b) is_greater = key_a > key_b где build_key - это ровно тот callable, который был передан в sorted через параметр key.
А что же делаеть, если всё-таки хочется использовать кастомный компаратор. То есть ф-цию, которая принимает на вход 2 параметра и говорит, какой из них больше? Обзовём эту ф-цию compare(a, b). Тогда можно поступить так. Создадим класс TKey, в котором конструктор принимает на вход число (которым в итоге будет элемент массива) и компаратор (то есть какой-то callable, принимающий 2 параметра). Число положим в поле value, а компаратор в поле cmp. И перегрузим метод __le__ для этого класса (напоминаю, что это метод отвечающий за то, что к объектам класса можно применять оператор сравнения <= ). Так вот внутри __le__, на вход которого приходит тоже один параметр (назовём его other), мы просто вызовем self.cmp(self.value, other.value).
Теперь можно легко определить лямбду, которая принимает на вход произвольный компаратор и возвращает объект, пригоный для передачи в key. Эта лямбда определяется так: lambda cmp: lambda x: TKey(x, cmp)
зы. В functools почти наверняка реализация более красивая. Наверняка там можно как-то использовать метаклассы или что-то в этом духе, чтоб не передавать явным образом компаратор в конструктор. В частности, это бы дало гарантию, что у всех сраниваемых объектов одинаковые компараторы (в моей реализации такой гарантии строго говоря нет).
>>2766590 >> сортировка за квадрат - слишком не оптимально Она долгая. Если уж ебаться со своей сортировкой, то чего бы не реализовать что-то более приличное. >> в качестве альтернативы предлагает полный перебор Не столько предлагаю, сколько... IRL делал такое. Всегда приходится решать задачи, исходя из компромиссов. Так вот, иногда на решение отводится минимум времени и в этом случае можно вместо дорогого времени программиста использовать, пусть и неэффективно, дешёвое время процессора. Код с полным перебором уже написан и займёт две-три простые, понятные и легко воспроизводимые строки. Для разовых задач считаю допустимым. Если кто-то тут заявит, что он прям никогда так не деле, то он либо лжец, либо никогда не решал практических продуктовых задач. > Ебать ты клоун. Дык, ёпта.
>>2767435 >та что раз ты так быстро сдулся и пошёл спрашивать Я не сдулся, а пытаюсь решить проблему, в том числе интерактивно, спросив на дваче. А так то я уже нашел инфу в гугле.
>>2767526 Ничосе питон для продвинутых пользователей пк. Надеюсь без практики я это не забуду через пол года. Т.е. мы с помощью functools заменяем этот компаратор в сортировке на свой в виде лямбды. Странно, почему деды не встроили по умолчанию в сортировку для этого отдельный параметр key=foo, cmp=bar...
Впрочем это слишком сложно для меня ещё, я лучше напишу 5,10,20 строчек в отдельном блоке кода чем такое буду применять. Мое абстрактное мышление со скрипом осознает и представляет в виде объектов все эти многоэтажные перекаты из одного callable в другой. Впрочем, раньше и рекурсию со скрипом понимал, а сейчас более-менее ясно вижу.
>>2768306 ОТМЕНА, ЛОЖНАЯ ТРЕВОГА это прост DEFAULT ARGUMENTS фух, чуть не обосрался от страха думал, что какой-то новый синтаксис, который я не знаю мимо помидор
>>2769951 Тебе вообще не надо их импортировать, алембик сам из метадаты их подтягивает (из registry если быть точным). У тебя скорее всего какая-то проблема с моделью/генерацией миграций. Покажи класс Companies и покажи какой командой генерируешь миграции.
>>2768410 Двачую, помидору лет 20, устрашился лямбды, я хуею. Я миддл с этим сталкиваюсь уже года два и упраздняю в чужом говнокоде, потому что только упоротые дегенераты пихают лямбду там, где не надо и наоборот не используют, раздувая код на +20 строк, там где можно одной лямбдой обойтись.
>>2770682 >Тебе вообще не надо их импортировать, алембик сам из метадаты их подтягивает. Откуда они возьмутся в метадате если их не импортировать ни разу по твоему? Как раз таки импортировать модуль с модельками в env.py норм практика.
>>2771642 Какие же все-таки уебищные лямбды в плюсах. По сравнению с этим пиздецом, лямбды в питоне просто верх совершенства.
Хуже чем лямбды в плюсах разве что только типы в питоне. Вот в камле типы божественные, а в питоне они нахрен все портят. По крайней мере то как пишет большинство уважаемых коллег. Городят те же сраные спагетти но со стрелочками.
>>2769824 Шварпист залётный. Его язык настолько хорош, что он не может не поделиться с нами, сирыми и убогими сокровенным знанием о том, что на самом деле наш ЯП - вообще не ЯП.
>>2748706 (OP) Учил питон последний год, и вот теперь узнаю, что появился МОДЖО который его заменит. И что теперь делать? Получается я впустую потратил время на устаревшее говно?
>>2774012 Он еще не вышел, не факт, что взлетит, и Питон он скорее всего никогда не заменит, т.к. большинству юзеров Питона он не нужен, они подрочат на скорость циклов и вернутся в CPython.
>>2774184 Ну ты не будешь же новую именованную функцию объявлять чтобы передать ее в map или filter. Просто в Питоне вместо мапов и фильтров часто используют лист компрехеншены, т.к. они сразу дают лист, а не ебучий генератор, поэтому ньюфаги не знают, олдфаги не помнят. А в ФП наоборот мапы и фильтры юзают чаще, чем компрехеншены, потому что лаконичнее.
Кто пишет в VS Code? Там есть темы с неоновой подсветкой, типа Synthwave84( https://github.com/robb0wen/synthwave-vscode ). Но у меня подсветка не работает НИХУЯ. Погуглил, типа надо менять файлы, либо откат до 1.6Х версии делать, потому жлектрон-браузер удалили. Откат не пробовал, но пробовал править вручную, по гайдам, запускал от администратора ясен хуй, но один хрен не светится. Вот на стаковерфлоу( https://stackoverflow.com/questions/73266964/why-cant-synthwave-84-enable-neon-dreams-on-windows ) писали как типа сделать можно, но не помогло. Один хуй не светится А я хочу чтоб светилось красиво и я себя ощущал дохуя мамкиным хакером таинственным, буду кодить калькулятор в маске Гая Фокса и т.д. ЧЯДНТ? ЩИТО ДЕЛОТЬ? Пизда красиво, я хуею нахуй, хочухочухочу.
Привет, парни. Поясните за смысл метаклассов. Я понял как они работают, но не понял зачем они нужны. Мудреная залупа какая-то. Типо, они не позволяют создавать экземпляры класса наследника, если в нем не унаследованы все функции из метакласса указанные через декоратор. Вопрос... А нахуя это надо то? Где это используется? Обычная защита от дураков?
>>2777634 То, что ты описал, называется абстрактные классы, а не метаклассы. Нужны как база для наследования, когда нечего писать в методе, потому что может очень гибко использоваться.
Питоняшки, дайте совет нуфагу. Допустим вам понадобился компилируемый язык в пару к питону. Ну не знаю, например, чтобы "обходить острые углы производительности" каких-нибудь йоба-циклов. Какой вы бы выбрали: С++, Rust, Golang или что-то иное?
Тайп хинты не нужны. В чем я не прав? Юнит тесты все равно писать нужно, а если есть тест, то типы проверять смысла нет. Единственное стоящее применение это валидация во всяких пайдантиках.
У меня есть папка backend. Внутри имеется папка app и tests.
Внутри папки app: __init__.py, main.py и папка routers внутри которой __init__.py, auth.py. Я делаю импорт в main.py: from routers.auth import auth_router. Все работает.
Переходим в папку tests внутри которой: __init__.py и test_main.py. Я делаю следующий импорт внутри test_main.py: from app.main import app и нихуя не работает. Дает: from routers.auth import auth_router E ModuleNotFoundError: No module named 'routers'
>>2777812 Выбирай язык, который знаешь или хотел бы узнать. Или более подходящий под задачу. К сожалению, не существует универсальных языков. В каждом есть свои плюсы и минусы.
>>2777965 > print(lambda ... ) Ой бля... Чел, а ты понимаешь вообще, что такое лябмда? И ещё вопрос на засыпку: тебя не смущает, что у тебя вот в твою ф-цию get_biggest передаётся некий arg, но в теле ф-ции он нигде не используется?
>>2778569 >А в чём была проблема с запуском исходной версии кода? В том, что с запуском никаких проблем нет, я вывести значение не мог. Вот и всьо.
>>2778570 Изначально он возвращал последнее наибольшее значение, сейчас он возвращает последнее наибольшее значение из комбинации трех чисел. Щас я понял, что задача была немного в другом. Нужно было вернуть наибольшее число из этих трех чисел игнорируя повторяющиеся числа. Но мне похуй на эти сентименты.
>>2778584 >ты понимаешь вообще, что такое лябмда Да. >передаётся некий arg Не обращай внимания, я просто много что перепробовал и забыл исправить перед скрином. Кстати, результат я вывести всё-таки смог.
>>2778658 Чел, забудь про этот cmp_to_key. Тебе это не пригодиться в ближайшие 2 года точно, только голову себе забиваешь. А если куда-то и применишь, то потом только жалеть будешь т.к. читаемость в разы снизилась. Тем более если у тебя возникают вопросы уровня "как это запустить", то тебе это точно не нужно. Вот когда станешь тимлидом 300к в наносекунду как все мы в треде, вот тогда к этому вопросу вернешься, да и то врядли.
>>2778673 >только голову себе забиваешь Ну, я как бы это коплю, сортирую и сохраняю всякую интересную фигню у себя в облаке, чтобы вернуться к этому потом и по изучать, а чтобы применять повседневно подобное, до конца не разобравшись, у меня и в мыслях даже не было.
>>2779470 >А это нихуя не работает. Чел, сколько дней ты уже тред засираешь, уймись уже. Тебе самому не стыдно? Пошел бы уже давно и сам разобрался, нет двадцать постов надо написать что ничего не работает. Это говорит только о том, что ты даже базовый синтаксис питона не знаешь.
import functools foo = lambda arr: print(int(''.join(sorted(map(str, arr), reverse=True, key=functools.cmp_to_key(lambda x, y: -1 if x+y < y+x else 0 if x+y==y+x else 1)))) if arr else -1) foo([19, 8, 7])
>>2779840 Я не про то. Ты ее запускал вообще? В задачке же прямо сказано: найдите НАИБОЛЬШЕЕ число которое можно составить из трех чисел. Взгляни на образец в примере. Если же прогнать через эту лямбду список вида [16, 9, 321], то она выдаст 932116. Правильным решением будет 963211, как у меня, потому что это наибольшее число.
>>2779918 У тебя логика сломана. Задача была вернуть число "составленное из чисел из списка" Например [16, 9, 321] 16 это число из списка, числа 6 в списке нет. А ты зачем-то рассматриваешь числовой элемент списка "16" как строку и извлекаешь из этого элемента числовые символы "1" и "6". Этого согласно условиям задачи делать не нужно.
>>2779918 >как у меня Твое ошибочное понимание задачки, только упрощает её, кстати. arr = [16, 9, 321] print (int(''.join(sorted(''.join(map(str, arr)),reverse=True))))
>>2780163 Зачем ты его так приложил. Он хоть и тред засрал, но по крайней мере не выебывается. А ведь часто заходят такие вкатуны, которые как только почюяли, что припустили в протки - сразу закатывают глаза и начинают агрессивный ультровизг т.к. признавать свои ошибки это не по их понятиям.
>>2780207 Так этот долбоёб тоже своих ошибок не признаёт. И учить нихуя не хочет. Он тут насрал 20 однотипных постов с "посмотрите какой кал я в очередной раз высрал, теперь всё работает. А, кстати, а то что вы писали до этого - не работает и не запускается". Причём ему указыавешь на ошибки, а он всё это тупо игнорирует и говорит, что это уже не актуальные версии кода. Ну не актуальные, так хули ты тут срёшь своей шизой вообще?
Этот даун даже условие задачи за несколько дней не смог понять. А после того, как ему наконец разжевали, что надо сделать, он тут же высрался, что составители задачи тупые, а сама задача триавиальная (при том что он даже более простую её вариацию решил через жопу, лол).
>>2780225 Чел, там выше >>2767526 анон два километра текста накатал объясняя подкапот сортировки и компаратор, в прошлом треде рандомному залетуну тг бота написали. Это буквально самый лучший и отзывчивый тред на всей доске, а ты не ценишь. Может проблема в тебе.
>>2766608 >key=functools.cmp_to_key(lambda x, y: -1 if x+y < y+x else 0 if x+y==y+x else 1) Двач 2023, итоги. Нахуя это здесь, кроме как перед вкатунами-школьниками повыёбываться? Рабочее решение всегда будет O(n * log n) из-за сортировки, но ты зачем-то игнорируешь reverse, насильно пропихивая туда ключи, обмазанные говном. Ты ебанутый?
>>2780656 > Игнорируешь reverse Так он не игнорируется лол. Ебать ты дурачок. И при чем тут вообще асимптотика. Выше обсуждалось, как решение в одну строчку записать. Вот это был ответ.
>>2780758 Нахуя ты сортируешь по ключам, какая практическая польза от этого, кроме быдлокода, в котором ещё надо две минуты потратить, чтобы разобраться, что хотел шиз? 1. >def get_biggest(numbers: list) -> int: >__return int(''.join(sorted((str(x) for x in numbers), reverse=True))) if numbers else 1
2. >get_biggest = lambda numbers: int(''.join(sorted((str(x) for x in numbers), reverse=True))) if numbers else 1
3. если список небольшой, то давай просрём ресурсы на факториал, но сделаем это явно >print(int(max([''.join(map(str, perm)) for perm in permutations(a)]) if a else 1))
>>2780801 Чел... А ты понимаешь, что первые два приведенных тобой пункта не решают поставленную задачу?))
Ты бы вместо того, чтоб орать как ебанутый, лучше бы попробовал подумать, как и почему решается задача. Заодно бы понял, зачем там кастомный компаратор и чем он отличается от стандартного сравнения строк.
>>2780821 На всякий случай. Тот кастомный компаратор, с которого ты подорвался, реализует предпорядок, но не частичный порядок. Это если тебе эти слова хоть о чем-то говорят, продвинутый ты наш.
>>2780850 Хорошо, вафел, убедил. Тем не менее, свой шизокод никому больше не показывай. Для сортед достаточно ключа key=lambda x: str(x) * 2, чтобы сортировка проходила как следует, а не твоё говно говна.
>>2780861 >убедил При чем тут "убеждение" ты же просто обосрался, обкакунькался, насрал под себя, с ноги ворвался в нить, но споткнулся об порог и упал лицом в говно. Имей же достоинство хотя бы признать свои ошибки, зачем ты усугубляешь свой позор.
>>2780864 Я признал свою неправоту, обосанный, но это не отменяет того, что ты шизобыдлокодер, который выехал на вауэффектах и полной обфускации своего говна. Я показал решение лучше и проще, но ты продолжаешь тявкать из под шконаря. Олсо ты проехался по условию, если список пуст, чекай за щекой.
>>2780869 Охуенно ты ворвался, братан. Задачу не понял, ни одной строчки кода правильно не написал, зато визг выше гор стоит. Сразу видно синьора тимлида.
>>2780163 Пффффх. Пожалуйста, если ты не мог сам решить такую простую задачку, даже поняв ее смысл с первого хода, то не далек тот момент, когда снова себя таковым почувствуешь.
>>2780879 Аноны, а уж случайно не самый ли жёсткий попуск в истории треда мы только что наблюдали? Полное многократное обоссывание агрессивного долбоёба... Да уж.
Год не работал на питочеке, подвыпал из темы. Вопрос сколько денег просить в спб. Опыта работы 6 лет. Хочется шобэ не слишком заебно было. В асинхронность и эти ваши асинкайо не могу.
>>2780869 >Я показал решение лучше и проще, но ты продолжаешь тявкать из под шконаря. Блядь, ты не показал ни одного работающего решения, только шизу свою показал.
Пиздец. Туча петухонистов решают 1 тупую задачку и дрочат друг друга. Прям анекдот про 10 %профессия_нейм% и 1 лампочку. Кста решение через однострочник лямбду кал. Сидеть разбирать это говно мало кому потом захочется. А если нужен перфоманс то уж переписали бы на cython
>>2782136 Жалкий клоун, тебя уже обоссали и ты решил другим аноном прикинуться? Только вот ты тут ни кого не обманешь, петушок, ты сильно палишься своей попоболью и манерой построения фраз.
>>2782136 Была только одна цель - написать решение в одну строчку с сохранением асимптотики. Цели оптимизировать внутреннюю константу/оптимизировать что-то там под какое-то железо/whatever что там тебе ещё в голову пришло не было. Цели сделать код читаемым тоже не было (иначе бы в одну строчку никто бы не пытался ничего запихать).
>>2782288 Я вообще-то другой анон, могу даже скрин скинуть. Чтобы ответ получился как в задаче, надо всего лишь сортировать числа по стрингам и сджойнить. Зачем ты тупишь? Сколько тебе лет?
>>2782307 > надо всего лишь сортировать числа по стрингам и сджойнить. Почитай, пожалуйста, тред хотя бы за вчерашний день и найди в сообщениях контрпример к своего утверждению.
>>2782307 Так что же это получается... Значит наш герой и правда не так хорош как он о себе рассказывал? Мда... Стыдно, товарищи, стыдно. Но ничего, в охранники вот требуются...
>>2782539 > А, это древняя хуйня. Ее можно сделать множеством способов. Задачу, в которой надо дословно сделать то, что написано словами, можно сделать кучей способов. Хуя ты умный... Наверно phd по computer science. Никак не меньше.
>>2782832 >Нужно чтобы так было: 1, 2, 3, 8, 9, 4, 7, 6, 5. По-моему ты задачу не понял, надо чтобы по спирали шло как на пике. И да я проебался. В одном месте то ли мкба зажевала то ли я криво скопировал, но нет и ещё в одном месте "rev" с "res" перепутал.
Вот так всё работает и на больших массивах состоящих .
>>2782863 Ещё упростил, теперь масив не крутится а все манипуляции только с указателем. работает вроде на матрицах любого размера. Готов принять ваши оферты на работу от 300к в наносекунду.
def spiral_transposition(mtx, rev=False, res=[]): ....res.extend(mtx.pop(-1)[::-1] if rev else mtx.pop(0)) ....for i in range(len(mtx)-1,-1,-1) if rev else range(len(mtx)): ........res.append(mtx.pop(0 if rev else -1)) ....if mtx: ........spiral_transposition(mtx, rev=False if rev else True, res=res) ....return res
>>2783175 Нет, просто я отдельно писал несколько разных лямбд, чтоб отлаживать было удобнее. А в конце уже их все вместе склеил. Поэтому получился кусок говна. Ну от ванлайнера ничего другого и не стоило ожидать.
Аноны, как красивее всего записать длинное уродливое мерзкое условие вот такого вида:
if _elm is None or \ ...."data ts" not in _elm or \ ...._d["data"] != _elm["data2"] or \ .... _elm["data"] not in _elm["synch"] or \ ...._elm["data2"] not in _elm["synch"]: ........continue
Я сначала думал про any\all, но они принимают в качестве аргумента список условий, и этот список сразу же натурализуется на месте. А мне надо чтобы было ленивое поведение. Например >if True or int('text'): pass Тут всё будет нормально, потому что int('text') не выполнился из за ленивой природы такого условия.
>if any((True, int('text'))): pass Тут будет ошибка, потому что значения в списке натурализуются и только потом обрабатываются. Таким образом мне это не подходит.
Как быть? Как красиво записать длинное условие чтобы оно было ленивым?
Есть задачка студентская про транспиляцию небольшого субсета шелл-скриптов в питон. Курс собственно по основам бидона и шелла. Как они предполагают это решать, регулярками дрочить штоле? Это явно не про парсеры реальные.
>>2787630 Я думаю, подразумевается итерация или регулярки. Хотя итерироваться по тем же форам или вайлам будет весьма ебано, регулярки в этом плане проще. Может скомбинировать, хз.
>>2787978 Это не мне надо. Есть такая задачка, предлагают решить за деньги, я вот думаю. Портировать ничего не надо. Базовую хуйню вроде echo for while, присваивание-интерполяция переменных, а всякие ls/cat через subprocess.
>>2788134 В условиях не было писать one-liner, а неявные вызовы лямбды с передачей компараторов это обфускация уровня пидора >print(list(filter(None, map(lambda y: y reduce(lambda x, y: x y != 0, map(lambda x,y=y: y % x,range(2, int(pow(y, 0.5)+1))),1), range(2, 100))))) Сколько времени потребуется, чтобы разобраться, что за код? Наверное поболее, чем минута.
>>2789757 Нет и не будет. Гуи сдохли, потому что не смогли изобрести гуй одинаково работающий под win32 / browser api (wasm/js) / android / xlib (wayland).
Как можно распарсить джейсонину вида, {"a": {"b": "c": [{"d": {"e": [{"x": "1", "z": "2"}, {...}]}]}}
Нужно добраться до значений x y. Я щнаю, что можно For i in myjson['a']['b']['c']: For j in i['d']['e']: Print(j['x'], j['y'])
Но выглядит это как-то громоздко, сожет есть более короткие варианты для парсинга "глубоких" джейсонин, без двойных и более циклов и кучи ключей в квадратных скобках?
>>2789823 Я ебошу все на tkinter. Он был первоначально сделан для очень странного ебанутого языка Tcl. Там была (еще когда Tcl'ем кто-то хоть немного пользовался) концепция мегавиджетов. Эта концепция намного лучше реализуется как раз на питоне. Вообще tkinter единственное, что без бубна работает на разных платформах. Странно, что его под браузер только не сделали, хотя гуи вероятно действительно пожраны залупой WebView, которая кстати многим не нравится.
>>2790797 Если хочешь нейросетку в свой микросервис, то с голанг сразу учи кресты, чтобы ее через них затаскивать. То есть, например, обучаешь во фреймвокре TensorFlow, используя питон, потом в прямом направлении она у тебя работает через C++, а коннектишь в программу на Go с помощью CGO через точку входа на plain C. Вот только кресты кстати надо нормально знать, потому что документация нейросетевых либ для крестов отстает или ее местами вообще нет, потому что подразумевается, что крестовики-то сами во всем разберутся.
Решил перекотится с реакта на питон, вакансий побольше и зарплаты хорошие, даже мидл реакт разработчиком +4 года опыта мне приходилось искать работу по 3-4 месяца. Надеюсь в питоне с этим получше.
С утра жру кофе и не могу решить как правильно сделать модель в Джанго. И можно ли так вообще сделать без костылей:
Необходимо два поля в таблице оба обычные целые. А и Б. Первое может принимать любое значение, второе должно быть "автоинкрементом" но связанным с первым. То есть у каждого значения А должен быть собственный next_id для Б. Скорее всего придется делать всё руками.
>>2790928 >мидл реакт разработчиком +4 года Без пезды чел, если ты за 4 года не можешь найти работу, то ты точно не мидл. Ты знаешь, что такое абстрактные структуры и модели, как работает нода с прототипами, чем движок V8 отличается от V7, какие его преимущества и недостатки? Это не говно о теории, это бейсед. Я три месяца кручусь в джаваскрипт и два года в пайтоне, собесы на джуна прохожу, но офферы не принимаю, потому джиэс - это помойка.
>>2791213 >ты за 4 года не можешь найти работу У меня чистый опыт работы 6 лет, на тот момент в 2021 году было +4 года опыта уже начались проблемы с поиском работы, слишком много вкатунов, слишком большая конкуренция, нужно пройти сотни собеседований что бы найти работу.
>Ты знаешь, что такое абстрактные структуры и модели, как работает нода с прототипами, чем движок V8 отличается от V7, какие его преимущества и недостатки? Знание этой хуиты никак не помогает в работе. То что ты описал нужно узкоспециализированым инженерам которые работают на крупные ИТ корпорации. Скажи как отличается код на реакте без знания и знанием этой хуйни?
>Это не говно о теории, это бейсед. Потому что ты так скозал?
>собесы на джуна прохожу Я в начале 2017 года нашел свою первую работу за две недели пройдя только не более 5 собеседований, без знания редукса, мне на тот момент был не понятен. Но мне кажется что ты пиздабол, на данный момент никто не берт джуна во фронтенд слишком дохуя кандидатов и не нужно здесь пиздеть маняхуйню что все они тупые а ты один умный, фронтенд не настолько сложный, через полгода работы из джуна можно спокойно вырастить в мидла который спокойно может с нуля сделать проект любой сложности.
сап аноны есть таск: напечатать кучу хуйни всякой в ворде. 300 единиц. с одним подводным: надо менять в документе серийный номер. на каком языке ( и можно ли ) написать скрипт, который поставить на печать ряд документов, и при этом пропишет в определенной графе серийный номер. например 10 .docx файлов, и в каждом номер - 001, следующий 002 и т.п.
>>2792041 Статус бар это если какой интерфейс есть. У меня всё в сонсоли, но например копируешь ссылки на ютаб и чтоб точно знать что она скопирована желательно какую-то всплывающую подсказку сделать, но нормальный тултип не могу найти.
>>2792500 аноны вы можете мне подсказать в таком случае как будет выглядеть код и как его запустить? ну или хотя бы кинуть линк где инструкция. я полез в эти макросы, ну нихуя непонятно
мне нужно чтобы в 3 полях на разных страницах в word документе просто менялся автоматически номер при печати. типа 12345-001, 12345-002 и тп.
я попробовал сделать в тех местах закладки, и через них задат нумерацию, но нихуя не работает
>>2792764 А еще DRF, Docker, SQL, базовый JS, профильная вышка и год коммерческой разработки - тогда может быть рассмотрят на должность стажера и младшего помощника джуниора на зарплату 20к рублей.
>>2793094 да нихуя. достаточно выбрать одно направление и достичь там нормальных результатов (можно самостоятельно) ты столько всего перечислил что это уже на мидла тянет, но уж точно не на стажера/джуна
>>2793288 Будем честны, для джуновских задач докер учится за пару часов, делается рабочий манифест и потом переходит из проекта в проект, sql учится ну за пару недель с учетом простых джоинов, базовый js вообще опционален. Ну а насчет дрф - как правило человеки-фреймворки сейчас учат что-то сразу. Про год коммерческой разработки - ерунда.
Душу пистона немного. Почему ваш пистон и sqlite3 так долго обрабатывает запрос "select count(*) from myanusbase where kind=1;" ??? База - 7.2Гб Индексы по всем полям есть. Ну вот как ускорить писю?
Аноны, посоветуйте годный курс по Джанге, можно на ангельском. Заебало смотреть всратые гайды на ютубе, где половина спизженные с другого канала, вторая половина недоделанные и тд, хочу отвалить бабла и хапнуть концентрированной базы без всякого говняка.
В FastAPI можно вернуть несколько изображений в респонсе, желательно вместе с именами, не кодируя их в текст? Уже несколько часов дрочусь, допрашивая чатботов, но они выдают какую то хуйню. Вроде в POST реквесте так делать можно, и в респонсе тоже. Но как сгенерировать такой респонс в фастапи не ясно. Или всё-таки это невозможно в HTTP?
>>2794700 >>2794750 Ясно, жалко. Проебался еще полтора часа после этого, не то, чтобы мне это нужно, можно было бы и в base64 конвертить, но у меня проснулся азарт. Спасибо за ответы.
Аноны, кому не впадлу прочтите мой текст и сориентируйте пожалуйста по дальнейшим действиям, в первую очередь обращаюсь к опытным или тем кому хотя бы уже удалось вкатиться. Питухон изучаю уже ~полгода, хапнул всю базовую базу до основ ООП (а также основы БД и гит), запилил пару первых петов - бота для мморпг на OpenCV и телеграм бот-магазин, параллельно курю Чистый Код Мартина. Щас по идее как пора углубляться в непосредственное направление, решил не метаться и идти именно в веб разработку как изначально и хотел, т.к. это мне наиболее интересно а вкатиться в тестировщики/аналитики как я понял нихуя не проще, везде свои подводные. Так вот сейчас по моей логике мне надо браться за Django, и отсюда возникает первый вопрос, правильно ли я понимаю что в принципе уже в ходе изучения джанги можно будет подтянуть свое понимание ООП? Т.к. я чувствую прям недостаток знаний и опыта в этой теме, то есть теорию понимаю но практкики было мало. Или нужно как-то отдельно подкачать ООП и дальше уже браться за джанго? Далее, я себе отдаю отчет что я в принципе склонный к демотивации и забиванию хуя чел, поэтому для обучения мне больше подходит курс/ментор, где меня будут подпинывать и помогать на моих затупах, тем самым сглаживая углы на которых будет возникать желание все дропнуть. Ментора в принципе могу себе позволить, хотя и дороха, но имхо это избыточно на начальном этапе, поэтому я пытаюсь найти какой-то курс который подходит мне по лвлу, но чет на какой не посмотрю они либо начинаются с полного нуля, либо там полно какого-то говняка который явно напихан тупо для объема. Короче кто знает пиздатый курс (можно на ангельском, но лучше на ру) где именно нужные вещи для веба, джанга там, всякие эти редисы, брокеры сообщений и тд без говняка - посоветуйте плиз. Желательно чтобы по ходу обучения это все закреплялось на проекте. Воот епты бля, ну собственно и все, подскажите кто шарит как и по каким материалам дальше развиваться чтобы быстрее достичь состояния личинки разработчика.
Ананасы, как оцениваете работу в web scraping/crawling/parsing в плане профессионального развития? Есть возможность залететь на такую вакуху (сейчас перекладываю джейсоны грубо говоря) с повышением зп, но вот только сложилось ощущение что это примитивная дрочь даже по сравнению с погрузкой жысонов и есть риск запачкать резюме работой с этим, потом не возьмут вертеть высоконагруженные микросервисы и пукать в кафку. Что скажете, насколько соответстует реальности такая оценка этой области?
Есть помидоры? Как вы проверяете наличие одного из последних ключей глубокого словаря? Условие такое, что на пути к ключу предыдущий ключ может просто отсутствовать и соответственно выполнять условие дальше, не вызывая эксепшн, не имеет смысла. Попробовал моржа, но выглядит всрато.
>>2795614 Да, чел, ну ты хуйнёй озадачил. Вот тут ты зачем-то просто вызываешь рекурсивную функцию, но не записываешь результат и не выполняешь никаких действий, код работает без пользы. Так исправь и пробуй.
>>2795743 >рекурсивную функцию, но не записываешь результат Там увеличивается счетчик next_letter, до тех пор, пока он встретит или не встретит условие.
>>2795717 Ну так блят логику включи, это значит что ошибка не в той конструкции вложенности, а где-то в другом месте. Ты видимо вообще слабо представляешь как твой код работает и просишь других его распутать всё понять что куда передается и починить. Неплохо ты придумал.
>>2794658 >>2796018 У скулайта нет сервера, норкоманы, это просто бинарная либа с питоньими биндингами. Там нечему тормозить, если у тебя не десятки миллионов записей. Скачай соснольный шелл и там пробуй свои запросы. https://www.sqlite.org/download.html Последняя опция под шиндовс.
>>2796144 пися девчачья. Я же выше писал, размер дб в 7,2Гб примерно. Как тебе такое, илон маск? сикулайт сможет перебрать все записи, и посчитать коунт(*)?
>>2796449 7.2 гб это мало, записей сколько? >>2796454 слепой штоле? > A bundle of command-line tools for managing SQLite database files, including the command-line shell program, the sqldiff program, and the sqlite3_analyzer program.
Всем чмоки Вкатываюсь в ит не ради работы, но ради интереса.
Сейчас учу питон, уже прочел половину укуса питона и параллельно посмотрел +- треть видеокурса, утащенного с торрентов. (Не просто смотрю/читаю, повторяю сам, пытаюсь копаться)
По окончании хочу попробовать освоить машинное обучение. С математикой на Вы, но попробую все равно.
Как дочитаю укус, хочу прочесть ещё что-то подобное, но уже на инглише, чтобы привыкнуть к кошерной терминологии и закрепить материал.
>>2796486 >укус То что ты пробежался глазами по укусу и максимум перепечатал себе примеры кода в IDEшку, позапускал и сказал "ага это я понял" дает тебе весьма печальное понимание питухона, надо все теоретические знания закреплять на практике решая какие-то задачки.
>>2796887 >Как апнуться до мидл+ Просто стань опытным и компетентынм
>какой проект нужно запилить Никакой
>осмелиться претендовать на это повышение? >повышение Проще при переходе на другую работу. В текущей компании у всех вогруг уже сформировался образ тебя как джуна (если ты сейчас джун, как я понял), а для нового работодателя ты - чистый лист
Пытаюсь в ЧА/ДДД, и пока куча тупых вопросов только назрело. Вот есть таблица User. Есть в domnain/entity/User сущность (агрегат). Есть в infra/db/model/User модель. Есть в infra/db/repository/UserRepository имплементация репы. Есть в app/dto/User дто. Есть в interface/grpc/pb2/User структура запроса-ответа для gRPC. Есть в interface/rest_api/pb2/User структура запроса-ответа для API.
1) Что нужно возвращать в методах репы? Сущность / модель / дто? 2) Если мне нужно делать селекты, минуя бизнес-логику, можно ли сразу конвертить запросы-ответы для gRPC/API в модели или нужно всё равно их конвертить в дто? 3) Если структура модели отличается от структуры дто или запроса-ответа, под каджый случай пилить свой маппер?
Ну про неделю понятно что фантазия, но внятный ответ сколько занимает изучение пытона я тоже не нахожу. Ответы варьируются от 2 месяцев до года, курсы всевозможные видел и на 3 месяца, и на 14... Так сколько, анон?
>>2796459 4млн. записей. Может ноут так себе. Но для бд - это позор вообще-то так считать. Только если он сначала грузит дб в память, а потом имеет её. Но это позор, видимо даже хэша нет полноценного.
>>2798906 На этот вопрос нет простого ответа. Это не станок с ЧПУ освоить на заводе. Ты например можешь выучить синтаксис языка и встроенные функции за пару недель, и что? После этого сядешь на стул и скажешь "всё, теперь я у мамы погромист". Нет, этого не достаточно. Надо типы данных учить, алгоритмы, ооп, стандарты написания кода. Достаточно этого? Опять нет, надо дальше учить - подкапот языка, что куда перекатывается, разные обязательные либы, тысячи их. Хватает? Опять нет, нужна практика - пишешь петпроект, смотришь как дургие пишут, пишешь, пишешь, пишешь. Всё свободное время туда. Хватает? Опять нет, да что ты будешь делать - кабан кабаныч, куда ты пойти хотел, требует от тебя другие знания - идешь. учишь, ковыряешься разбираешься.
Суть в том, что надо непрерывно учиться и нет такой точки куда ты доучился и остановился, потому тебе и сроки никто не скажет. Ну а синтаксис питона и его встроенные функции + некоторые обязательные либы за пару недель можно выучить.
>>2798906 Я хапнул именно базу самого питухона (начиная от переменных и заканчивая основами ООП) за 3 месяца, занимался в среднем часов 10-15 в неделю, при этом все закрепляя на практике. А так вот эти вопросы "сколько времени надо чтобы X" вообще неуместны, ты можешь быть нереально увлеченным и замотивированным чуваком который будет по 15 часов в день дрочить и соответственно через пару месяцев уже будет что-то там шарить, а можешь быть ленивым хуем которому это айти нахуй не всралось и он каждый вечер чисто заставляет себя на полчаса открыть купленный курс и через год даже ничего не вдуплить.
Паца, нид хелп. Шапку прочитал, но не увидел ничего.
Суть: нужно какое-то чтиво (желательно с обилием практики), для сисадминчика, чтобы быстренько вкатиться в питон. Знаю баш, немного кодил на руби. Питон нужен чисто для сисадминских/девопсовских нужд. Перебрал несколько учебников, там все разнится: от введения в питон для детей (чисто БАЗА на 500+ страниц), до обзорных гайдов по возможностям питона без погружения (python и девопс Гифта, например).
Когда на вашем нахрюке программирования добавят статическую типизацию как у белых нахрюков? А производительность как у сисек? А джаву када заменит? А GIL када уберут? Я всего этого очень сильно хочу и жду уже наверное лет пять
>>2800476 >производительность как у си Уже Cython >джаву када заменит? Никогда >GIL када уберут? Уже (cython.nogil) в 3.13 зкспериментально возможно, лет через 5 в стабильном билде
>>2800580 Верно подмечено, каллега. Не зря ведь такой резкий хайп и агрессивный всплеск курсов по питону, чтобы люди не могли пейсать на нормальных язычках, таких как хуйскелл, раст итд. В итоге мы получаем дешевую рабочую силу в лице шаолиньков питонистов, которые будут готовы выжигать глаза смотря на код в мониторе в белом режиме JupyterLab ради смуси и сушеных кузнечиков. И они будут счастливы
>>2748706 (OP) Анонче, подскажи, как запаковать программку в exe из ипитона, чтобы она работала на винде где среды нет? Какие инструменты лучшие, программка для баловства, окошко и пара кнопок.
>>2826135 есть всякая хуета для преобразования. я использую тяжелый вариант, который ты не поймешь. погугли про embedded python, а еще важно понять, что ты можешь дописать любой текст в конец exe файла. я делаю так: пишу прогу на С++, используя библиотеку питона, которая позволяет исполнять код, копирую код на питоне в конец скомпилированного файла. важно, чтобы между кодом программы и вставленным скриптом была какая-нибудь строка, которая будет использоваться как разделитель, программа на Си должна прочитать содержимое самой себя, найти строку-разделитель, считывать код после этой строки-разделителя, и затем при помощи "встроенного питона" исполняет этот код. этот вариант ебанутый, тут нужны нетривиальные знания