Это копия, сохраненная 29 сентября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий: >>2721548 (OP)
Литература:
https://ln2.sync.com/dl/cf2c1d070#xq4s328t-xbbjys2z-9r6j7ss7-gf4e9dv6 <-- Книжки, новое собрание
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://goonlinetools.com/snapshot/share/ - для листингов, без регистрации, но с капчей
#######################################
Вопросы-ответы:
— С чего начать изучать питон?
У питона намного лучше официальная документация, чем у большинства других языков. Есть там и учебное пособие для начинающих: https://docs.python.org/3/tutorial/introduction.html , неофициальный перевод на русский язык: https://digitology.tech/docs/python_3/tutorial/introduction.html (для питона версии 3.8, но разницы почти нет)
— Какие книги считаются лучшими?
На слуху чаще всего Лутц, но там очень много воды. Ещё на слуху Марк Саммерфильд, Эл Свейгарт "Автоматизация рутинных задач с помощью python". Эти книги рекомендуют чаще всего, но книги довольно старые, а питон развивается.
— Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0
— А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать даже для версий 1.x, т.к. принципы остаются теми же. Но лучше хотя бы с версии 2.0, слишком много мелких изменений в базе.
— Какие веб-фреймворки стоит учить в начале двадцатых?
Что бы не говорили, Джанго живее всех живых и умирать не собирается (и Django REST Framework), очень перспективный асинхронный FastAPI, асинхронный AioHTTP. Flask ещё где-то используется, но уже legacy. Прочие фреймворки или у нас экзотика, или это вымирающее легаси как Торнадо.
— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но частично переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Ролик на американском языке про многопоточность и асинхронность, построение своего event loop с нуля, помогает понять, как устроена асинхронность внутри: https://www.youtube.com/watch?v=MCs5OvhV9S4
— Можно ли на питоне делать мобильные приложения?
Да, смотри на фреймворк Kivy https://en.wikipedia.org/wiki/Kivy_(framework) https://kivy.readthedocs.io но народ на него жалуется
— Как можно без лишней возни ускорить программу на питоне
1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь.
2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.
— Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём
Брат, смотри книжки по ссылкам в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
старая версия шапки, треды 90-148 и ранее: https://dumpz.org/bASGKD8cCFDf
ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником.
текущий исходник: https://goonlinetools.com/snapshot/code/#8gd2g1snu3l8i26k0bc6k9
Питон используют опытные погромисты как вспомогательный язык, поэтому если вы думаете, что можете вкатиться в айти, зная питон - вы глубоко ошибаетесь.
>куд-кудах, а ищу твитор на питуне сделон
Тебе же русским по белому написали, что питухон вспомогательный. Это максимилизированная версия поговорки - "изи ту лерн хард ту мастер" Ты можешь выучить питухон и идти с ним на хуй, потому что что применение у него есть, только если ты нормальный погромист и используешь питухон для подсосных скриптовых задач.
Да не, просто тролль совсем оскуфел, лениво перекатился в новый трет и лениво толсто набросил
Спасибо что ответил, я действительно ценю ваш фидбэк и если какую херню пишу или думаю говорите.
1) Я собираюсь в дальнейшем восстанавливать математику отдельно для того чтобы закрыть вышку, а большинство курсов по Data Science дают, на мой неопытный взгляд, меньше питона и программирования, а стоят они на 70 к больше чем тот же курс по питону. Data science скорее долгосрочная цель потому что мне сложно представить что за 2 месяца (курс 5, считай 3 питон 2 математика) вообще можно их математики запомнить. По крайней мере мне всегда код (C++, Wolfram Alpha тогда учили) на порядок легче давался чем теоремы из мат анализа. Может нах не нужны в Data Science эти теоремы но даже если мы просто берём применение их правил я затрудняюсь представить сколько я за пару месяцев смогу запомнить и как я буду в этом соревноваться с кем то кто только что из вуза с мат специальностью туда идёт.
2) Hexlet и Skypro приглянулись но у них нет интенсивов/буткемпов. Если можешь поподробней описать чем Практикум лучше скиллфактори рад буду услышать. Стоит удовольствие на 70 к больше и длится на 2 месяца дольше, впрочем с меньшей нагрузкой в чём есть свои плюсы. Дело в том что мне в принципе курсы нужны не только, и не столько для того чтобы выучить питон, а для того чтобы получить хорошую базу,т.е. понимать что сегодня вообще хотят от кодеров, что такое фреймворки с чем их едят и т. д., и т. п., начать портфолио потому что как я писал в прошлом треде мне сложно самому себе задачи придумывать ибо в инете почти всегда есть способы это решить вопрос проще, быстрее и более организовано, чем самому писать. Может для опытного кодера это иначе но мой опыт пока такой и проще на курсах решать задачи из индустрии. У меня есть идея для пет проекта, может к тому времени как выучу питон еще что придумаю но хочется себя обезопасить.
3) Я уже начал вчера, эксперимента ради, Поколение Python, подошёл к 1му экзамену, пока немного скучно потому что в основном восстановление и переиначивание всяких принтов с слишком большим количеством на мой вкус закрепления материала, но в целом мне нравится. Чтобы выучить питон сам по себе я думаю меня самого хватит, но по моему в разы быстрее получится пойти на курсы чем разбираться самому какие еще связанные скилы нужны, как к ним подойти, как их связывать и как их лучше учить.
Спасибо что ответил, я действительно ценю ваш фидбэк и если какую херню пишу или думаю говорите.
1) Я собираюсь в дальнейшем восстанавливать математику отдельно для того чтобы закрыть вышку, а большинство курсов по Data Science дают, на мой неопытный взгляд, меньше питона и программирования, а стоят они на 70 к больше чем тот же курс по питону. Data science скорее долгосрочная цель потому что мне сложно представить что за 2 месяца (курс 5, считай 3 питон 2 математика) вообще можно их математики запомнить. По крайней мере мне всегда код (C++, Wolfram Alpha тогда учили) на порядок легче давался чем теоремы из мат анализа. Может нах не нужны в Data Science эти теоремы но даже если мы просто берём применение их правил я затрудняюсь представить сколько я за пару месяцев смогу запомнить и как я буду в этом соревноваться с кем то кто только что из вуза с мат специальностью туда идёт.
2) Hexlet и Skypro приглянулись но у них нет интенсивов/буткемпов. Если можешь поподробней описать чем Практикум лучше скиллфактори рад буду услышать. Стоит удовольствие на 70 к больше и длится на 2 месяца дольше, впрочем с меньшей нагрузкой в чём есть свои плюсы. Дело в том что мне в принципе курсы нужны не только, и не столько для того чтобы выучить питон, а для того чтобы получить хорошую базу,т.е. понимать что сегодня вообще хотят от кодеров, что такое фреймворки с чем их едят и т. д., и т. п., начать портфолио потому что как я писал в прошлом треде мне сложно самому себе задачи придумывать ибо в инете почти всегда есть способы это решить вопрос проще, быстрее и более организовано, чем самому писать. Может для опытного кодера это иначе но мой опыт пока такой и проще на курсах решать задачи из индустрии. У меня есть идея для пет проекта, может к тому времени как выучу питон еще что придумаю но хочется себя обезопасить.
3) Я уже начал вчера, эксперимента ради, Поколение Python, подошёл к 1му экзамену, пока немного скучно потому что в основном восстановление и переиначивание всяких принтов с слишком большим количеством на мой вкус закрепления материала, но в целом мне нравится. Чтобы выучить питон сам по себе я думаю меня самого хватит, но по моему в разы быстрее получится пойти на курсы чем разбираться самому какие еще связанные скилы нужны, как к ним подойти, как их связывать и как их лучше учить.
Рилли, гайс, шо за боринг шит... Сириосли, никому не нужны бар лэнгвиджи, ни питон, ни джава, ни другие. Стек технолоджисов нужен, в зависимости от филда. И компетеншн по программинку вообще.
И что значить "выучить питон"? Сюда модули socket, threading, asyncio входят?
Все производные JVM не от оракла медленно но верно подыхают, причем груви с кложой уже трепыхаются в предсмертной агонии, а скала просто медленно умирает обосравшись с 3-й версией.
>Тебе же русским по белому написали, что питухон вспомогательный.
И зачем в компаниях выше висят вакансии на программистов у которых основной язык питон?
Как гласит народная мудрость, начни обсуждать любой язык програмирования, как сразу появится джаваеб, который расскажет, что ваш язык говно без задач
У вас имеется некий гештальт, не находите?
>Нужны тебе сокеты, смотришь доки на сокет.
пока ты не понимаешь, как сети работают, смотреть доки примерно бесполезно. Ну или ты будешь очень долго смотреть.
Так и документацию бесполезно зубрить.
Примерно так и решается. Можно чуток упростить. while i < 5 и инкрементируй при успехе.
Неправильно же. in 5 не имеет смысла. Нужен range(5).
https://pastebin.com/Pg6SnyfL
Братаны, пытаюсь отменить назойливую таску в asyncio, которая иногда может зависать. Очевидно чт ов asyncio можно использовать wait_for с указанием таймаута, я так и делаю, но все что он делает это просто бросает эксепшн при истечении таймаута, таска в бекграунде в другом треде или процессе продолжает исполняться. Как ее кильнуть? Вроде все делаю как надо а эта мразь все равно крутится и не умирает (я поставил sleep на 10 секунд просто для простоты, мой условный sleep длится минут 10 и он блокирующий)
Думал попытаться вручную отправить kill сигнал этому процесу (а это процесс т.к. ProcessPoolExecutor), но как его pid узнать?
>>749209
Почему ты не делаешь это через asycnio.subprocess?
https://docs.python.org/3/library/asyncio-subprocess.html
там поддержка всего есть, сейчас слёту код не приведу, но есть, делал такое
poolExecuter для другого, то когда тебе надо много задач считать
Сочи хуй, быдло, есть только один настоящий язык - ассемблера и ближайший к нему С. И твоя джава рядом не стоит.
Питон -- топовый язык для экспериментирования, прототипирования и моделирования, за счет ебейшей интерактивности (не на уровне лиспа конечно, но близко) отладка и ходьба по граблям выходит на совершенно новый уровень. Потом можно уже разработанный алгоритм перевести на "серьезный" язык, если это необходимо.
Но джава реально хуйня для макак.
В нулевые ее воспринимали хуже, чем сейчас питон. Над теми, кто писал на джаве, насмехались, был даже стереотип, что типичный джава-разработчик это максимально тупой индус, который не способен писать на более сложных языках. И в принципе стереотип был недалек от истины, до сих пор значительная часть легаси на джаве была разработана теми самыми тупыми индусами.
>был даже стереотип, что типичный джава-разработчик это максимально тупой индус
жирно аж течёт
никогда такого не было, жава всегда была пафосной, сложной, с высоким порогом входа, типа если ты пишешь на ней, то ты крут. А вот скриптовые языки, все, всегда имели имидж языков для начинающих.
Сейчас, конечно, всё поменялось, но всё равно, порог входа в питон ниже, меньше понимать надо и учиться, чтобы хоть чего-то учебное суметь написать.
poolExecuter нужен в первую очередь чтобы мейн луп не блокировать интенсивными задачами
>сложной
Мантра придуманая индусами-джавистами.
Статическая типизация - это ведь сложно! x = "string" это хуйня которую напишет даже собака, не то что str x = "string", а потом еще и ide сама скажет, если ты к x будешь обращатсья как не положено, вот где хардкор!
>никогда такого не было
Чел, ну кому ты пиздишь? Джава все девяностые и нулевые продвигалась как простой и понятный язык, который поймет даже полный дебил, и постоянно противопоставлялась "сложному и запутанному" С++.
Идея джавы - сделать простой язык с максимальной защитой от идиота, чтобы программист не смог выстрелить себе в ногу даже если бы он очень этого захотел.
ProcessPoolExecutor клал хуй на GIL
>Чтобы пытался исполнить, пока не получится
Анус поставишь, что не заблочишь прогу каким-нибудь говном?
>Анончики, а как у вас в команде к пикрилу относятся?
Обязательно нахуй, вместе с pydantic или датаклассами. Уже был опыт пожирания говна при переписывании чужого сервиса который мешал 6-уровневые джсонины без каких либо подсказок что где приходит. Считай это обязательной частью документации и какой-никакой валидацией.
https://pypi.org/project/PyContracts3/
пишу pip install PyContracts3
в pip list отображается.
PyContracts 1.8.12
PyContracts3 3.0.2
python-contracts 0.1.4
запускаю проект состоящий из одной строки
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'.
Как мне подружиться с pycontracts?
Так вот как их вместе подружить чтоб 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
Я свой код валидирую периодически, чужой заебешься переписывать. Только майпай медленный сука.
Сюрприз: прибитая таска вовсе не означает прибитый процесс. Таска-то прибивается, а то что в фоне крутится отдельный тред или процесс, жрущий ресурсы, ивент лупу похеру
Это не прога, а скрипт, если что я его просто вырублю.
И как в эту херню передавать коллбеки?
сука, в очередной раз убеждаюсь что динамическая типизация - ебаный кал, как вы блять в этом дерьме разбираетесь? вот что эта сигнатура значит? что блять метод принимает?
Тайп-чекинг в петухоне одобряю. Единственное, я считаю, что строгий тайп-чекинг нужен для либ, а для декларативного слоя можно вообще не юзать или юзать по минимому. У своих шкетов требую тайп аннотации, как часть документации.
Сижу и веду проекты на Pyright, плюс он в питоновский экстеншон VScode вшит, что тоже круто. mypy использую для малых проектов, либо без проектов с какой-то поддержкой, чтобы спустя время понимать, что происходит, но сейчас думаю вообще все на Pyright перевести.
Год назад разбирал подкапотье майпай и некоторые моменты там очень кривые.
Самый большой недостаток от введения тайп-чекинга на проектах - васяны начинают считать, что если функция проаннотирована, то она может быть калом. В итоге часто вижу кривое разбиение более сложных процессов на функции, которые возвращают сложный объект с аннотацией на 3 строки. Но решилось написание плагина на флейк.
Пра гразнайе гавняная ачько старага педираста из Техникума Трасянки, каторый тут ищет малодиньких хуйцов.
Да блять...
может быть проще перестать использовать старое говно, которое никто не поддерживает, а поискать другое говно?
научиться программировать и понять как работают компьютеры
Никак, subrpocess это отдельный процесс который может быть вообще не на питоне, какие нахрен калбеки.
Дык, ООП и ФП, как обычно. Мозгов нет — хуй осилишь. Или тебе именно из особенностей конкретного языка? В Питоне сложно, что типизация динамическая. Заёбывает иногда ошибки искать. Ну и шиза и выебоны лично Опоссума, которого благополучно послали нахуй недавно, слава богу. То case-switch ему не нравится, то тернарный оператор весь как гавно собачье, то ++ нихатюнибуду. Блядь сапогом бы по еблу.
...сказал твой папка про гандоны. А зря...
А я ни одной книжки по Питону в своей жизни не открыл. Единственное, что я изучал по книжке, это наверное Джаву, и то потому что маленький и глупый был
Самое сложное для меня лично это мультитрединг (сделан он как то странно, возможно из-за GIL), FFI и костылики вроде Numba.
Какой уебан это придумал?
Почему бы просто не писать:
Для х из набора_х:
....делай херню с х.
че за пиздец?
гопота-бот?
В чём проблема с компрехеншенсами, вкатутося?
Ну так и пиши так, кто тебе запрещает? Насмотрелся "эффективных" решения во всяких кодворсах, где все пытаются запихнуть все решение в одну строку? Так то говноеды
Чел без личной жизни, унылое говно по жизни, у которого есть один питон и больше нихуя.
Помню, на реддите был тип с тремя питонами, бывает же.
Это тот шизойд, что картинки с приглашением в свою секту форсит?
>++ нихатюнибуду
i += 1 блестяще решает эту задачу, прекрасно считываясь и не оставляя пространства для выстрела в ногу.
Знал бы ты настоящие языки программирования, то догадывался бы, что ++ можно использовать в выражении, причём, как до переменной, так и после. Что не только изящно, но и довольно интересно расширяет применение. Но увы, твоя планка — скрипты.
>думать что есть настоящие\сложные\трушные языки программирования
Ваш iq - вафелька. Не сопротивляйтесь.
Или хуйня из-под коня и в функции нормально использовать только то, что ей явно передаётся.
Просто с одной стороны неочевидно, где на самом деле задаётся значение и где его искать, а с другой...
У меня есть функция, которой нужно было бы передавать значение через весь стек на глубину в 5-6 вызовов, в каждой из промежуточных функций добавляя ещё один аргумент.
И таких функций - несколько, так что всего мне по хардкору понадобится добавить десятки передач, чтобы где-то там внутри параметр явно пришёл как параметр...
Всё, разумеется, происходит в пределах одного модуля.
Можешь вверх вынести значения-константы.
Эта хуитка с нейм делается, чтобы не было левого выполнения при импорте. Присвоение значений в целом похуй, тем более, если оно будет использоваться в импортирумых функциях.
>Просто с одной стороны неочевидно
Все очевидно, просто ты учишь питон по васянским книгам\гайдам.
В питоне (как и в любом языке программирования) есть области видимости, в случае питона у тебя их 4
https://data-flair.training/blogs/python-variable-scope/
Первая ссылка из инета, не читал, насколько хорошо подан материал
А то, что тебе надо передавать что то на глубину в 5-6 вызовов, это проблема дизайна твоего кода, очевидно, эту хуйню надо переписать, у нас же не джава что бы закапываться в 40 коллбеков что бы написать хелоу ворлд и потом смотреть всех как на говно
>. Пытаюсь понять: это нормальный кейс?
Нет, совсем нет.
Глобальные переменные принципиальное зло. В крайнем случае, хотя не надо так делать, заведи какой-нибудь словать glob и в нём храни данные. Но не надо так делать,
Скорее тебе нужно смотреть на классы и объекты, скорее всего, если тебе надо проносить данные на несколько уровней вглубь, у тебя реально твои функции работают с одними данными и их следует оформить как методы, а переменные хранить как атрибуты класса
В реальной жизни твой кейс почти никогда не встречается. Бывает клиника, но тебе туда не надо
Почему ОНО работает тормознее не только по сравнению с 3.11, но и часто 3.10?
Я ожидал, что ещё ускорят. Но не ждал, что продолбают перворманс
Скидывай свои тесты
Приздец просто, такая прикладная задача же - поставлять тэги и фильтровать файлы на основе этих тэгов, а нормального софта для этого нет в 2023 году. Хоть сам садись писать. Я бы и написал, но время нет и не будет.
Уже десяток софтин перепробовал и везде какое-то говно не эргономичное. Самое близкое к идеалу TagSpaces, но в нем тоже много косяков, таких как например то, что программа ужасно медленная и всю инфу о тагах хранит в виде отдельных файлов а не в базе данных.
Насиделся на бурах?
Оно кажется привлекательным на первый взгляд, но ты быстро забьешь и станет бесполезным. Вот с коммьюнити работает норм, потому что достаточное количество тегозадротов есть.
Питон сейчас язык номер 1 для всякой разной автоматизации
Грузить джейсоны можно ещё
1. Как понять, в каких случаях стоит бросать исключения, а в каких нет? Например, есть у меня класс, который производит определённые манипуляции над файлами. Поскольку проект может быть запущен в несколько процессов, файлы я блокирую при работе, и блокировщик используется самописный, потому что так нужно. Блокировщик имеет два метода - заблокировать/разблокировать файл, над которым производятся манипуляции. Возникает вопрос - что делать, если выполняется метод unlock над файлом, который и так не заблокирован? Стоит ли в этом случае бросать исключение, которое говорит - атятя, ты пытаешься разблокировать файл, который не заблокирован? Или вести себя так, как будто файл был разблокирован? По сути ведь, результат такой же, как и при разблокировке. Разница лишь в том, что в данном случае файл изначально не был заблокирован.
С одной стороны, если бросать исключение, то это как-то более подробно что ли. Ведь по логике не должно быть ситуации, в которой я пытаюсь разблокировать незаблокированный файл. Если такая ситуация возникла, то это как бы не страшно вообще, но и не то, чего я ожидал. Брошенное исключение будет явно заметно и я что-то изменю в алгоритме. А если так и надо, то сделаю что-то типа `try { $lck->unlock("file.bin") } catch (FileDontLockedException $e) { ... }`.
С другой стороны... несколько противоречит KISS, не? В сущности, результатов работы у метода `unlock` может быть два: либо файл разблокирован и свободен для манипуляций, либо нет и лови исключение. Ситуации "файл был успешно разблокирован" и "файл изначально не был заблокирован" по своему результату идентичны.
Вот и как решить?
2. Есть две крайности. Одна - всякий раз кидать \Exception. Вторая - для каждой ситуации, в которой может быть брошено исключение, создавать собственный класс. Ну, может, в совсем уж одинаковых ситуациях использовать уже имеющийся класс исключения. Вопрос - как найти в этом золотую середину? Если на первый вопрос ответить "кидать исключение", то достойна ли ситуация "файл изначально не был заблокирован" отдельного класса исключения? А ситуация "ты пытаешься разблокировать файл, который был заблокирован другим процессом, и поскольку флаг forced не был передан - соси бибу"? А ещё какая-нибудь?
1. Как понять, в каких случаях стоит бросать исключения, а в каких нет? Например, есть у меня класс, который производит определённые манипуляции над файлами. Поскольку проект может быть запущен в несколько процессов, файлы я блокирую при работе, и блокировщик используется самописный, потому что так нужно. Блокировщик имеет два метода - заблокировать/разблокировать файл, над которым производятся манипуляции. Возникает вопрос - что делать, если выполняется метод unlock над файлом, который и так не заблокирован? Стоит ли в этом случае бросать исключение, которое говорит - атятя, ты пытаешься разблокировать файл, который не заблокирован? Или вести себя так, как будто файл был разблокирован? По сути ведь, результат такой же, как и при разблокировке. Разница лишь в том, что в данном случае файл изначально не был заблокирован.
С одной стороны, если бросать исключение, то это как-то более подробно что ли. Ведь по логике не должно быть ситуации, в которой я пытаюсь разблокировать незаблокированный файл. Если такая ситуация возникла, то это как бы не страшно вообще, но и не то, чего я ожидал. Брошенное исключение будет явно заметно и я что-то изменю в алгоритме. А если так и надо, то сделаю что-то типа `try { $lck->unlock("file.bin") } catch (FileDontLockedException $e) { ... }`.
С другой стороны... несколько противоречит KISS, не? В сущности, результатов работы у метода `unlock` может быть два: либо файл разблокирован и свободен для манипуляций, либо нет и лови исключение. Ситуации "файл был успешно разблокирован" и "файл изначально не был заблокирован" по своему результату идентичны.
Вот и как решить?
2. Есть две крайности. Одна - всякий раз кидать \Exception. Вторая - для каждой ситуации, в которой может быть брошено исключение, создавать собственный класс. Ну, может, в совсем уж одинаковых ситуациях использовать уже имеющийся класс исключения. Вопрос - как найти в этом золотую середину? Если на первый вопрос ответить "кидать исключение", то достойна ли ситуация "файл изначально не был заблокирован" отдельного класса исключения? А ситуация "ты пытаешься разблокировать файл, который был заблокирован другим процессом, и поскольку флаг forced не был передан - соси бибу"? А ещё какая-нибудь?
>сли выполняется метод unlock над файлом, который и так не заблокирован?
Исключения нужно бросать туда, где они могут возникнуть. То что ты описываешь это баг, баги надо фиксить, а не ловить в рантайме и обрабатывать
Есть мнение, что исключений лучше вообще избегать, т.к. они запутывают логику и стэк вызовов.
>Можешь вверх вынести значения-константы.
Оно получает значение посреди кода, в реальной задаче это не константа.
Константы - да, вытащены наверх и помечены UPPER_CASE'ом.
>Эта хуитка с нейм делается, чтобы не было левого выполнения при импорте.
Это я тоже в курсе, я не первый день пишу код а второй.
Вопрос в легитимности использования в обычной функции типа-глобальной переменной (abc), получающей значение где-то ещё (или не получающей). Эксперимент показывает, что переменная видится и доступна.
Мне с первого взгляда не понравились оба варианта. И 100500+ передач и использование в функции переменной, которая ХЗ, где получает значение.
>>754656
>В питоне (как и в любом языке программирования) есть области видимости
Это азы, спасибо.
>в случае питона у тебя их 4
А вот это интересно. Особенно потому, что VS-Code показывает ДВА слоя (пик). Видимо, это потому, что в питоне есть только функции `globals()` и `locals()` (ну, ещё `vars()`, но это детали).
То что переменная недоступна за пределами места, где она объявлена это просто и понятно. А вот такой случай... Был не очень понятен.
В целом по этому материалу стали лучше понятны некоторые детали. В частности делать так, как на пиках в целом - норма.
>А то, что тебе надо передавать что то на глубину в 5-6 вызовов, это проблема дизайна твоего кода, очевидно, эту хуйню надо переписать
А вот тут ты хуйню спизднул, конечно. Причём полную.
Расщепление кода на отдельные методы несёт две цели:
1. Дедупликапция и переиспользование кода. В частности чтобы не было кучи мест, в которых при случае нужно вносить исправления:
лучше ошибиться один раз и потом тысчу раз обратиться к этой ошибке, чем ошибиться в тысяче мест;
и, если надо обновить логику, доработать функционал и т.п., то не надо искать все вхождения такого кода.
2. Дробление методов, чтобы каждый из них был достаточно компактным и проще отлаживался.
То есть если у тебя есть кусок, который всплывает неоднократно, есть смысл выделить его в отдельный метод.
Если твой метод разросся, то его надо дробить, иначе его правка превратится в кромешный ад. Обычная рекомендация: метод должен помещаться на один экран, чтобы его можно было охватить взглядом, хотя при современных размерах экранов это может быть много, PyLInt со своей стороны, например, рекомендует обойтись по-умолчанию 50 инструкциями и 12 ветками на метод, весьма разумное ограничение на мой взгляд.
Так что появление такого стека (максимум по коду 7 уровней, включая уровень модуля, т.е. 6 ретурнов до модуля) это уже результат оптимизации и рефакторинга. И это в модуле на 900+ LoC, то есть далеко не хэлоуворлд.
Собственно говоря, вопрос возник как раз в процессе рефакторинга, в частности сейчас я избавляюсь от глобальных переменных (оставляю только глобальные константы), избавился от присваивания им значение в функциях через `global`, возвращаю их в модуль ретурнами, обнаружил, что оно продолжило работать без проброса. Посмотрев примеры, прихожу к выводу, что так - норм (лишь бы имена не пересекались, вот это реально ПЛОХО).
>Можешь вверх вынести значения-константы.
Оно получает значение посреди кода, в реальной задаче это не константа.
Константы - да, вытащены наверх и помечены UPPER_CASE'ом.
>Эта хуитка с нейм делается, чтобы не было левого выполнения при импорте.
Это я тоже в курсе, я не первый день пишу код а второй.
Вопрос в легитимности использования в обычной функции типа-глобальной переменной (abc), получающей значение где-то ещё (или не получающей). Эксперимент показывает, что переменная видится и доступна.
Мне с первого взгляда не понравились оба варианта. И 100500+ передач и использование в функции переменной, которая ХЗ, где получает значение.
>>754656
>В питоне (как и в любом языке программирования) есть области видимости
Это азы, спасибо.
>в случае питона у тебя их 4
А вот это интересно. Особенно потому, что VS-Code показывает ДВА слоя (пик). Видимо, это потому, что в питоне есть только функции `globals()` и `locals()` (ну, ещё `vars()`, но это детали).
То что переменная недоступна за пределами места, где она объявлена это просто и понятно. А вот такой случай... Был не очень понятен.
В целом по этому материалу стали лучше понятны некоторые детали. В частности делать так, как на пиках в целом - норма.
>А то, что тебе надо передавать что то на глубину в 5-6 вызовов, это проблема дизайна твоего кода, очевидно, эту хуйню надо переписать
А вот тут ты хуйню спизднул, конечно. Причём полную.
Расщепление кода на отдельные методы несёт две цели:
1. Дедупликапция и переиспользование кода. В частности чтобы не было кучи мест, в которых при случае нужно вносить исправления:
лучше ошибиться один раз и потом тысчу раз обратиться к этой ошибке, чем ошибиться в тысяче мест;
и, если надо обновить логику, доработать функционал и т.п., то не надо искать все вхождения такого кода.
2. Дробление методов, чтобы каждый из них был достаточно компактным и проще отлаживался.
То есть если у тебя есть кусок, который всплывает неоднократно, есть смысл выделить его в отдельный метод.
Если твой метод разросся, то его надо дробить, иначе его правка превратится в кромешный ад. Обычная рекомендация: метод должен помещаться на один экран, чтобы его можно было охватить взглядом, хотя при современных размерах экранов это может быть много, PyLInt со своей стороны, например, рекомендует обойтись по-умолчанию 50 инструкциями и 12 ветками на метод, весьма разумное ограничение на мой взгляд.
Так что появление такого стека (максимум по коду 7 уровней, включая уровень модуля, т.е. 6 ретурнов до модуля) это уже результат оптимизации и рефакторинга. И это в модуле на 900+ LoC, то есть далеко не хэлоуворлд.
Собственно говоря, вопрос возник как раз в процессе рефакторинга, в частности сейчас я избавляюсь от глобальных переменных (оставляю только глобальные константы), избавился от присваивания им значение в функциях через `global`, возвращаю их в модуль ретурнами, обнаружил, что оно продолжило работать без проброса. Посмотрев примеры, прихожу к выводу, что так - норм (лишь бы имена не пересекались, вот это реально ПЛОХО).
Отклеилось.
>Нет, совсем нет.
Я жопой чую, что что-то не так, но как математически выразить...
Ну и нашёл в сети немало примеров, которые используют подобный подход. Так что скорее "не совсем", нежели "совсем нет".
>Глобальные переменные принципиальное зло.
Аще не спорю.
>заведи какой-нибудь словать glob и в нём храни данные
А чем это вообще отличается от словаря globals(), если уж на то пошло?
>Скорее тебе нужно смотреть на классы и объекты
Не тот случай, пожалуй. На самом деле это довольно изолированный, пусть и большой скрипт, выполняющий одну конкретную понятную и нетрудную работу по валидации и сортировке данных. Он из категории "шоб работало" и из другого места его вызов просто не предусмотрен.
То есть обернуть всё в класс - вопрос небольшого времени и вообще совет понятен, я даже думал об этом, но решил, что нахуй-нахуй: я от этого не получу ВООБЩЕ ничего, кроме означенного места хранения некоторых переменных. Ни наследования, ни полиморфизма, ни инкапсуляции. Даже двух объектов этого класса никогда не появится просто по дизайну.
Сложно вообще понять чего ты пытаешься достичь.
Похоже на то, что у тебя так программа и работает, что вызываются методы объекта, которые ничего с ним не делают, это твое "снятие блокировки". Это не исключение, это изъян в логике программы либо просто рядовое условие, называй как хочешь. if super_blokirovka: pook else srenk.
Э, нет. В начале работы проверяется, заблокирован ли файл (технически - есть ли файл data.bin.locked, который является признаком того, что data.bin заблокирован).
Если он заблокирован, то N раз ждём и проверяем заблокированность ещё раз, спустя какое-то время пукаем и обмякаем, заявив, что файл заблокирован и разблокироваться не собирается, видимо.
Если он не заблокирован, то блокируем (создаём data.bin.locked) и начинаем работу. В конце работы обратно разблокируем (удаляем data.bin.locked).
>Ознакамливаюсь тут с вашим питоном, одна математика.
Потому что у тебя одни математические задачи, очевидно же
>Есть мнение, что исключений лучше вообще избегать, т.к. они запутывают логику и стэк вызовов
Нет такого мнения. Ты тредом ошибся, уходи отсюда вот сюда: >>2740805 (OP)
>А чем это вообще отличается от словаря globals(), если уж на то пошло?
Документированностью, возможностью контроля. Всё-таки globals() это одна общая куча без возможности контроля.
Когда ты делаешь свой glob, ты уже видишь, где это используется, при желании ты можешь дополнительные инструменты реализовать, вместо обычного словаря чтобы это был объект, с возможностью контролировать, кто в него пишет и т.п.
Открыл книжку и сразу пошло-поехало нормально. Только чет сегодня охуел с упражнения. Оказывается для того, чтобы его сделать надо следующую главу прочитать было, но все равно насколько же книга превосходит какие-то слитые курсы.
>Документированностью, возможностью контроля.
Хм-м. Какой-то смысл в этом есть, НО. Всё-равно получается что у тебя глобальная переменная, при чём особый смак, что опять же ты ГДЕ-ТО пишешь в глобальную переменую. Вроде и более понятно, что это именно она, но её заполнение всё-равно будет где-то реализовано и, если ты успешно избавился от "redefining name from outer scope", то разницы считай нет, это ровно такая же запись в глобальную переменную. Только ещё вычурнее потому что для изменения в функции глобальной переменной со строкой тебе нужно в функции явно сделать global. А добавлять в dict новые записи можно без него и теперь вместо "а где у меня появляется эта переменная?" нужно думать "а где у меня в этот дикт добавляется такое поле?" и не факт, что это удобнее. Тогда уж лучше бессмысленные классы.
>>757230
Чувак. Вот представь. У тебя есть портянка. Если весь код вытянуть в линию, то это будут тысячи строк. Ты берешь и чикаешь его и у тебя 50 000 строк превращаются в 7000 строк с функциями и глубиной в 2 уровня. А потом берёшь и чикаешь ещё, в итоге у тебя три уровня и 2 500 строк и 3 уровня, потом повторяешь ещё, видишь, что тебе сложно охватить целый метод и преврящаешь метод на 200 строк в три метода на 50 строк плюс россыпь вспомогательных, совсем уже по 3-10 строк (и ОПА, у тебя уже 5 уровней). Зато в другом месте ты делаешь универсальный метод и вместо 4 одинаковых методов ты получаешь один даже чуть-чуть поменьше и четыре чекера, передаваемых аргументами. А где-то на самом конце стека будет вообще двухстрочная фитюлина, хитро склеивающая строки с джойном и форматом, но вызываемая постоянно из самых разных мест. В итоге ты получаешь стек длинной до десятка ретурнов на ровном месте, зато поддержка кода не требует вообще никаких усилий потому что всегда можно легко и быстро понять, какой маленький кусочек кода что делает и поменять именно его. При этом сам код модуля у меня, например, 40 строк с комментариями.
Разделение кода на несколько функций приводит к тому, что у тебя увеличивается количество вызовов этих функций из разных мест. Неизбежно.
Даже большие системы теперь делают по схожему модульному принципу: компактные контейнеры плюс кубер, который ими погоняет и организует связи.
>Документированностью, возможностью контроля.
Хм-м. Какой-то смысл в этом есть, НО. Всё-равно получается что у тебя глобальная переменная, при чём особый смак, что опять же ты ГДЕ-ТО пишешь в глобальную переменую. Вроде и более понятно, что это именно она, но её заполнение всё-равно будет где-то реализовано и, если ты успешно избавился от "redefining name from outer scope", то разницы считай нет, это ровно такая же запись в глобальную переменную. Только ещё вычурнее потому что для изменения в функции глобальной переменной со строкой тебе нужно в функции явно сделать global. А добавлять в dict новые записи можно без него и теперь вместо "а где у меня появляется эта переменная?" нужно думать "а где у меня в этот дикт добавляется такое поле?" и не факт, что это удобнее. Тогда уж лучше бессмысленные классы.
>>757230
Чувак. Вот представь. У тебя есть портянка. Если весь код вытянуть в линию, то это будут тысячи строк. Ты берешь и чикаешь его и у тебя 50 000 строк превращаются в 7000 строк с функциями и глубиной в 2 уровня. А потом берёшь и чикаешь ещё, в итоге у тебя три уровня и 2 500 строк и 3 уровня, потом повторяешь ещё, видишь, что тебе сложно охватить целый метод и преврящаешь метод на 200 строк в три метода на 50 строк плюс россыпь вспомогательных, совсем уже по 3-10 строк (и ОПА, у тебя уже 5 уровней). Зато в другом месте ты делаешь универсальный метод и вместо 4 одинаковых методов ты получаешь один даже чуть-чуть поменьше и четыре чекера, передаваемых аргументами. А где-то на самом конце стека будет вообще двухстрочная фитюлина, хитро склеивающая строки с джойном и форматом, но вызываемая постоянно из самых разных мест. В итоге ты получаешь стек длинной до десятка ретурнов на ровном месте, зато поддержка кода не требует вообще никаких усилий потому что всегда можно легко и быстро понять, какой маленький кусочек кода что делает и поменять именно его. При этом сам код модуля у меня, например, 40 строк с комментариями.
Разделение кода на несколько функций приводит к тому, что у тебя увеличивается количество вызовов этих функций из разных мест. Неизбежно.
Даже большие системы теперь делают по схожему модульному принципу: компактные контейнеры плюс кубер, который ими погоняет и организует связи.
Классы лучше
Глобальные переменные официально не считаются зашкваром, есть даже модуль contextvars, в котором эти контекстные переменные подразумевают, что бы будешь глобально ими пользоваться. Он, конечно, для другого нужно, это просто показывает отношение.
словарь свой бы легко может прогрепать, плюс ещё у может быть несколько словарей для разных задач
на практике вот когда это встречается, это когда у тебя глобальный конфиг, из которого берутся параметры
Что ещё возможно: ты можешь при необходимости свой словарь подменять на какой-нибудь другой объект, без переписывания кода. Этот объект может геттеры-сеттеры реализовывать, мы можешь отследить, кто какую переменную меняет (и откуда), настроить логирование и т.п. Конечно это больше гипотетически, вряд ли кто так часто делает.
Добавлю еще ложку говна в курсы. Проявляется вообще очень важная проблема характерная для плохих преподавателей. Преподаватель ассоциирует ученика с собой. Он реально считает, что раз он (преподаватель) что-то знает, то знает и ученик и объясняет исходя из этого. А в книге исходят из того, что ты ничего не знаешь, ты вообще инопланетянин с планеты жопа, тебе сразу говорят, что ты конечно ничего не понимаешь, но тебя можно научить и учат.
>какой-то чвякающий хуесос
Хуёво.
Но вообще курсы курсам рознь. И самое главное в них - не видосики, а поддержка: есть, к кому обратиться за пояснением, если нихуя не понял.
Так-то и без этого есть на ютапчике куча приличных плейлистов. Я, например, по одному такому джангу изучал, годно вышло.
Книги, кстати, тоже бывают разные.
По коду:
в целом неплохо и соответствует ТЗ, насколько я могу судить, не запуская, а это главное (мне, правда, показалось, что там должен быть 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/
Это не проблема курсов, а проблема издателей. Любой даун может переварить и высрать в своем изложении ту же книгу или даже доку на ютубчик или какой-то удеми, чтобы заработать денег (принеся деньги и платформе, так что им это в любом случае выгодно).
Книжному издателю нужен вменяемый автор (которому надо заплатить), всякий там QC, подготовка-оформление, иногда ещё и печать (лул). Так что говно делать невыгодно и можно попасть на деньги.
Переводить говнокниги тоже смысла мало, тем более на нищерынке вроде постовка, так что берут самые ходовые оригиналы.
Вот так и получается.
ИМХО критичнее то, что нет проверки на пустой список
Если пользователь сразу введёт done, то будет исключение от деления на ноль. Лучше сразу привыкать думать о подобных случаях
про учебные книги, одно из самых лучших пособий - прямо в официально документации на питон
https://docs.python.org/3/tutorial/introduction.html
где-то был перевод на русский документации, среднего качества
Сохраню твой пост и поковыряю на выходных. А вообще это считай все же первые шаги в питоне, но мне нравится. Я не форсирую изучение, сразу по несколько тем за день не делаю хотя соблазн есть. Не хочу кашу информационную в голове, хочу все по полочкам.
Очень приятное ощущение, кстати, когда пишешь, не получается, что-то, а потом раз и заработало. Этакая мозговая щекотка.
>Чувак. Вот представь. У тебя есть портянка. Если весь код вытянуть в линию, то это будут тысячи строк
Еще раз, ты путаешь теплое с мягким. ПРи чем тут калбекхел и расложения кода на классы\методы?
Кстати, да. Не подумал.
>>757383
А вот это предполагал, но это неочевидно, так что от новичка я такого не жду.
>>757381
Я лично учился по вот этому:
https://pythonworld.ru/samouchitel-python
Годно и на русском. Но хорошо бы что-то уметь заранее. Иначе - Лутц - маст хэв. У него целый океан воды, зато если читатель воспримет 10% материала - этого уже будет достаточно.
> Еще раз, ты путаешь теплое с мягким
Вот ты сейчас либо объясняешь, что хочешь сказать подробно, либо идёшь нахуй. Договорились.
>Вот ты сейчас либо объясняешь
Сам поймешь, когда найдешь работу с хорошим архитектором и поработаешь там пару лет.
Ниче не тормозит. Видимо у тебя проблемы.
Вижу у тебя какая-то совсем калечная логика. В любом случае это не исключение, это просто условие.
Вот именно, у тебя нет не опыта, не знаний, но ты распинаешься как будто ты рич хикки как минимум. Будь скромнее.
Знал бы ты питон, то догадывался что всё неявное подведение из него выпиливается.
Ты шизу какую-то написал с вытягиванием кода в линию и т.п. Вообще не понятно, о чём.
Я предполагаю, что то просто от недостатка опыта и понимания, как выглядит программирование. Откуда берутся разные решения, почему так делают. Хотя на самом деле в половине случаев разрами сами не знаю, что больно... Код с глубокой вложенностью тяжело поддерживать.
Причём ты сам же это описывает в своём примере, где ты хочешь глобальные переменные использовать, типа сложно проносить данные вглубь и т.п. Как раз иллюстрация одной из проблем.
Чувак, ты всерьез споришь с чсв вкатывальщиком без опыта? Он прогает пару недель, но уже готовиться писать свои книги по питону и давать платные курсы. Забей.
Хочу написать мини либу, в котором можно описать "таблицы" (условно датакласс который имеет разные id по которым его можно получать)
Создать связи между ними(просто набор ребер соединяющие таблицы по id). Дальше иметь возможность выбрать какое-то подмножество полей этих таблиц и эффективно получать эти данные и формировать результат содержащий таблицу со строками из всех запрошенных полей.
Собственно написать не сложно, но любопытно мб есть хорошее готовое решение, кажется что подобное нужно много кому
>Ты шизу какую-то написал
Просто довёл до абсурда. Шизу написал чувак, который говорит, что код углублять нельзя и "функция" + ", в коде которой есть вызов функции" * x не имеет права на существование. Он как раз предпочёл бы плоский код без вызовов, видимо.
А на самом деле пока я не перешёл к этой модели код вообще не писался, любой более-менее сложный кусок приходилось вчитывать часами, а когда достаточно расщепил - всё само получилось.
>Код с глубокой вложенностью тяжело поддерживать.
Код без вложенности поддерживать сложнее. А когда абстрагируешься от реализации вложенной функции и принимаешь её как данность (ты же не лезешь, например, в код функции print(), ты просто принимаешь, что она работает), то всё становится хорошо.
> сложно проносить данные вглубь
Если бы текущая задача не была самостоятельным куском в себе, я бы переписал на классы, благо это реально на уровне "добавить 2 строки, поправить отступы, проставить перед переменными, использующимися за пределами функции 'self.'", я такое уже делал, но тогда от этого была практическая польза: было несколько объектов и потенциальный импорт модуля.
>>757597
>уже готовиться писать свои книги по питону и давать платные курсы
В отличии от тебя - нет. Я вообще не называю себя этим грязным словом "программист". Я - практик, который время от времени пишет разный код. Рабочий код, ЧСХ. И никто на сложность поддержки не жаловался.
>Разные источники (хранилище в терабайты, всякие api, постгрес), чел бля.
Сразу бы так и писал.
Тогда GreenPlum. Удели особое внимание PXF.
Мне точно не хочется тратить время и менять то как весь этот мусор хранится.
Опишу ещё раз
Есть процесс
1. В запросе shit_keys = [key1...keyn]
2. shits = fetch_shits(shit_keys)
shit_items = fetch_shit_items(shits)
...
Очень длинная хуевая цепочка где могут быть shit_shit_shit_items(..)
После весь этот мусор надо объединить.
Я вижу лёгкий способ сделать все это по человечески собственно в начальном посте я это описал
>Просто довёл до абсурда. Шизу написал чувак, который говорит, что код углублять нельзя и "функция" + ", в коде которой есть вызов функции" * x не имеет права на существование. Он как раз предпочёл бы плоский код без вызовов, видимо.
Ты это сам придумал, и выдал за мои слова.
Я сказал, что ты не знаком с азами дизайна, и из твоих постов очевидно, что ты зеленый нуб, но ты на серьезных щщах пытаешься делать вид, что ты неебаться хакер. Со стороны это выглядит, как будто ребенок пытается объяснить взрослому как заполнить налоговую декларацию. Выглядит глупо. Успойся.
>Я - практик, который время от времени пишет разный код
>Не знает про скоупы
>ДУмает что ооп это про классы
>Не знает азов дизайна
Нет дядя, ты - дурак
Выглядит так, будто тебе реально нужен OLAP, собирающий разнородные данные, сейчас всяких DWH-решений уйма потому что любой бизнес старается анализировать всё вокруг.
Одно из решений Greenplum - он через PXF'ы цепляется ко всем возможным источникам (для невозможных придётся написать драйвер) и предлагает лютую мощь по выплёвыванию аналитики.
Можешь кликхаус покурить ещё, там тоже было что-то подобное. Даже писать ничего не надо.
>грязным словом "программист". Я - практик
Господин программист, можно посмотреть на ваш код. Дайте пожалуйса ссылочку на ваш репозиторий.
>грязным словом "программист"
Сразу запахло трёхнедельной мотнёй и шуточками про рваную анальную дырку.
Что в ней калечного?
>Все ЯП такие?
Нет, конечно же. Рекомендую присмотреться к линейке С*.
>>756449
>Он для чего то подходит кроме создания калькуляторов и разных статистических расчётов?
Это язык для ковыряние в статистике и аналитике при помощи т.н. «ноутбуков» (типа Юпитера). Самое оно сидеть и вертеть табличку с какими-нибудь данными, которые тебе мнс высрал за месяцы, пытаясь натянуть выхлопа на публикацию в научжурнале.
Друзья-милорды на Петоне быстренько накидывают прототип проекта, чтобы посмотреть, чо как, а потом переписывают на нормальном языке по всей науке.
Друзья-милорды на Петоне быстренько накидывают прототип проекта, чтобы посмотреть, чо как, а потом переписывают на JavaScript.
[{'name': 'test1', 'price': '123', 'number': '321'}, {'name': 'test2', 'price': '456', 'number': '789'}, ..., ]
Как с таким листом работать? Мне нужно из этого листа сформировать новый лист со всеми значениями "price", как это сделать?
Во всех гайдах по листам в списках просто перечисление элементов. Или это словарь? Но type() возвращает list
Ааа, это же список словарей, все, я понял.
Легче лёгкого.
Синьор тимлид в треде. Вот твой код, не благодари.
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)
Бля отступы проебал. Заработался просто зарабатывая 300кк в наносекунду, бывает.
Вот с ними.
https://www.online-python.com/3nHlwBZtOL
Да що ты будешь делать. Опять отступы украли. Ну ничего я не гордый.
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)
Василий, не хотите ли стать кодером всемирной закулисы, ваш код это что-то невероятное.
Рассмотрю ваш оферт в порядке очереди. Много вас таких, а я один. Высылайте на
Все баристы пидоры.
prices = map(lambda x: x['price'], list_name)
Чел, анон тимлид, ему лучше знать про питон.
Короче, написал программку, использую argparse чтобы принимать аргументы на входе. Один из аргументов это имена png картинок из одной определённой папки (количество может менятся от старта к старту). Хочу чтоб работало автодополнение из беша. Как решается?
Оно так и работает. Баш экспандит ДО передачи, если ты хочешь чтобы твоя хуйня обрабатывала такие маски, то так и надо делать.
>Хочу чтоб работало автодополнение из беша.
Ставишь fzf просто поверх баша, потом Ctrl+T жмешь когда файл нужный надо найти.
В винде еще можно поставить поверх павершелла.
Даже если я не по теме ответил, fzf -- охуенная штука, всем рикамендую.
Качал тут на днях дипфейк тулзы (для гачи мемов), устанавливал все, настраивал. Крашнулась сборка из-за отсутствия Build Tools 2022. Ну ничё такого, установил, начал весь процесс по новой.
И ТУТ Я ПРОСТО ОХУЕЛ. Этот ваш PIP конченный уже скачанные пакеты валидирует и достает из кеша просто ЕБУЧУЮ ВЕЧНОСТЬ. Процесс, который в теории должен проходить за 10 секунд, длится минут 10, еще при этом периодически нагружая на фулл не самый слабый проц.
Более того, обратил внимание, что разные версии пакетов не встают на разных минорных версиях петухончика. Причем происходит это без каких-либо адекватных сообщений. Блядь, пришлось еще даунгрейдится с 3.11 на 3.10, чтобы всё завелось.
А че не в юпитере делаешь? Удобнее же. В вскод еще и интерактивный режим есть, когда можно работать с тетрадкой как с текстовым файлом.
https://www.youtube.com/watch?v=lwN4-W1WR84
И чё?
>Этот ваш PIP конченный уже скачанные пакеты валидирует и достает из кеша просто ЕБУЧУЮ ВЕЧНОСТЬ
Проблема на твоей стороне
>Более того, обратил внимание, что разные версии пакетов не встают на разных минорных версиях петухончика.
А схуяли должны?
>Причем происходит это без каких-либо адекватных сообщений.
Там буквально написано, что не встало и почему
Вывод - ты ебанько
Можно быстрее, в одну строку:
> float(str[str.find(':')+1:])
Чтобы её прочитать быстро нужен навык, зато кода сильно меньше и не забиваешь голову промежуточными переменными и их неймингом.
Опять же нейминг:
"number"? Число то бишь? Что за число? Что оно значит?
Получил ты не абстрактное число, а позицию, на которой находится искомый символ.
"end_number"? Конечное число? Число конца? Порнография какая-то пошла в общем. Неочевидные названия - зло, если они используются не в двух строках подряд, но и там вопрос, нужно ли оно тебе.
Как бы я решил задачу я уже написал. Полный вариант типа такого (пишу код прямо в форме ответа, без проверки):
> 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".
Если предположить, что у тебя таких параметров много, то уместнее будет сделать словарь, скорее всего, это тебе опишут чуть позже, так что раскрывать мысль не буду.
КСТАТИ. Важный момент. Упустил. Тебе же ещё ТОГДА: >>757333
рассказали про try-except. Почему ты их не использовал? Тебе эта строка могла прийти откуда угодно: пользователь ввёл руками, прочитал из файла и т.п. Почему ты не предположил, что входной параметр может быть некачественным?.. Он ведь может и к этому нужно быть готовым.
И ещё про ТОТ случай: хорошим тоном является указывать, какую ошибку ты ловишь в эксцепте. Например, тут - "except ValueError:". Это нужно в частности потому, что можно обрабатывать разные эксцепшны в этом куске кода и конструкция может быть такой: try - except - except - except - else - finally.
Как интересно...
Я спрашивал, как правильно подставлять окончания слов в зависимости от количества и не получил ответа (вернее мне сказали, что я делаю это неправильно, но как правильно - не сказали, это тут вообще платина), а на той неделе всплыл строковый метод `format`, которым я теперь пользуюсь с большим удобством.
Ранее я спрашивал, как удобно запускать скрипты во внешней консоли и не получил никакого ответа, а сегодня вижу ЭТО.
Ну, пожалуй, для случаев с МНОГАТЕКСТА "console": "externalTerminal" по-прежнему удобнее, но и в таком подходе, как в видосике немало профита. Одно бесит: то, что он называет штатным функционалом работу плагина и при этом неочевидно, какого.
Для ЛЛ - плагин вот этот:
https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter
В пипе ставится (vs поставит сам) ipykernel (плюс он по зависимостям тянет ещё 29 модулей), так что лучше сделать venv.
>>760514
Если ты полный анальный раб винды, советую перейти на 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()
Как можно реализовать такой трах? В консоли, на чистом пистоне.
Я тоже так думал пока сам не стал дата-дебилом
Даже если не использовать активно Юпитер в разработке (типа накидал код сниппетов - обернул их в функции - скопипастил в модули), быстро проверить как работает какая-нибудь фича языка или либы бывает полезно. А в обычном REPL это делать не очень удобно.
>>760514
Ну посмотри видос то, лучше один раз увидеть.
>>761086
>для случаев с МНОГАТЕКСТА "console": "externalTerminal" по-прежнему удобнее
Я просто пайпом в файл скидываю обычно.
>Я просто пайпом
Не который pip, а юниксовые трубы
https://en.wikipedia.org/wiki/Pipeline_(Unix)
??
дибил, не видно что это препод ???
>Иногда скучающие или желающие немного повеселиться
программисты добавляют в свои программы безобидные «пасхальные яйца» (Easter Egg).
А вы, двачеры, сколько пасхальных яиц положили в свои программы?
>Я просто пайпом в файл скидываю обычно.
Если интерактив, пожавлуй, не слишком удобно. Как минимум на этапе отладки взаимодействия: нужно видеть что было раньше и иметь возможность стопнуть и посмотреть, что в переменных.
То есть из 0.45678 получить 0.456, а не 0.457.
Интересно, а шебаги там не показывали?.. Ну, похуй тащемта, это приятная мелочь.
М-м. А ты вообще тестировал свой скрипт?.. Хорошо тестировал?..
В принте пасхалки ты выводишь не ту строку, которую предлагают выводить в примере. Исправь. Это делается легко, есть два способа, по-хорошему найди их оба.
Файл открывается без параметров (кодировка, чтение/запись/етц).
Файл не закрывается! Это плохо.
Вообще рекомендую работать с файлами по возможности через `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" появятся вещи, которые линтеры считают неправильными, постарайся каждый раз избавиться ото всех них. Линтеры (т.е. статические анализаторы кода, программы, которые оценивают твой код и находят потенциально проблемные места) писали опытные люди и
Ещё почитай это:
https://habr.com/ru/companies/timeweb/articles/542286/
В том числе каменты, там, например, говорят про полезный
https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance
Интересно, а шебаги там не показывали?.. Ну, похуй тащемта, это приятная мелочь.
М-м. А ты вообще тестировал свой скрипт?.. Хорошо тестировал?..
В принте пасхалки ты выводишь не ту строку, которую предлагают выводить в примере. Исправь. Это делается легко, есть два способа, по-хорошему найди их оба.
Файл открывается без параметров (кодировка, чтение/запись/етц).
Файл не закрывается! Это плохо.
Вообще рекомендую работать с файлами по возможности через `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" появятся вещи, которые линтеры считают неправильными, постарайся каждый раз избавиться ото всех них. Линтеры (т.е. статические анализаторы кода, программы, которые оценивают твой код и находят потенциально проблемные места) писали опытные люди и
Ещё почитай это:
https://habr.com/ru/companies/timeweb/articles/542286/
В том числе каменты, там, например, говорят про полезный
https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance
Сходу костыль (скорее всего, внутри оно всё будет так же):
> def round_down(number, ndigits=0):
> ....return int(number * 10 ndigits)/10 ndigits
Блджад. Звёздочки. Фикс:
> def round_down(number, ndigits=0):
> ....return int(number ✱ 10 ✱✱ ndigits)/10 ✱✱ ndigits
>В принте пасхалки ты выводишь не ту строку, которую предлагают выводить в примере.
Кажись понял, надо repr() добавить?
А ещё есть целая либа decimal. Там этих округлений... 8(!) режимов:
https://docs.python.org/3/library/decimal.html#rounding-modes
Если используешь Decimal, то есть встроенные возможности.
У меня есть вторая версия этой программы, но она ублюдская и мне не нравится. Прям вот отвращение вызывает. Там как раз через if делал, но, повторюсь, мерзотно. Даже я, совсем не разбирающийся в питоне понимаю, что получился какой-то франкенштейн, та версия которую показал получилась лучше.
За советы спасибо, поковыряюсь.
Ни одно СМИ в мире ни разу в истории не опубликовало ни одной true story. Если не считать научных журналов, но и там мягко говоря не всё истина.
Нюфаня плз. Если не знаешь весь подкпот пайтона то хоть не позорься, всё что там написано сделано с определенной целью - понимание приходит только с долгим опытом разработки.
Ходишь по "русскоязычных новостных сайтов" и смотришь, есть ли у них "бесплатные API".
У яндекса наверняка есть апи раздающее новости, у любых остальных ресурсов скорее всего нет просто никому это не нужно, а кому нужно просто парсер себе сделает.
Не открывается. Но вроде у него есть как минимум RSS. Как и у большинства изданий.
Хотел сделать в файле экселя границы ячеек.
Подключил
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
и не работает. Не делает в ячейке границу.
Я даже пробовал полностью копировать примеры из инета, тоже не работает.
Запись всякого в ячейки работает, шрифты работают.
МЛ в медицине
А еще есть такая фишка.
Разделить код скрипта на две клетки, в одном импорты и всякая инициализация, а в другом основной код. И если нужно отладить, то первая клетка запускается один раз, а дальше отлаживается чисто вторая клетка. Так можно сократить время между перезапусками дебаггера. Импорт торча например занимает несколько секунд, из-за этого перезапускать дебаггер каждый раз немного грустно.
Информация по сети гуляет пакетами. В двоичном виде. Закодирована с помощью 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'.
Вообще не понимаю, что с этим делать дальше. Как из этого получить пакет? Каак? Помогите, пж
>Делаю запрос
>Получаю
>Как из этого получить пакет? Каак?
Так ты его уже получил, дебил. Сначала в закодированном виде, потом перегнал в строку.
Вангую, что долбоебы реально вручную считали, чтобы получить этот важнейший факт, ещё до того, как придумали ЭВМ. Можно было бы подумать, что нет, но долбоебы они на то и долбоебы, так-то.
Ты вообще читаешь замечания к своему коду тут?
Правишь скрипты по советом анонов?.. Если нет, то не вижу смысла разбирать. Давай так. Пости все свои исправленные по советам выше скрипты и тогда я продолжу комментирование кода.
>хочу черепаху гонять
Можешь хоть лысого гонять. Черепашка предназначена для понимания алгоритмов вообще и всяких там циклов и функций уровня пика.
Знать по хорошему нужно всё, но задачки на черепаху более абстрактные и от них до реального кода отрыв больше, чем у книжек.
Замечания читаю, кое что в прошлых переделал, но новые упражнения делаю прежде всего так, как в книге написано. Сначала функциональность, а потом вылизывание кода, все эти чеки ошибок и прочее, на что ты обращал внимание.
Касательно дальнейших комментариев твоих - я не принуждаю, можешь не комментировать.
>все эти чеки ошибок и прочее
А на ус намотать и не повторять больше не хочешь? Почему у тебя опять файл не закрывается? Не поверю, что в книжке не говорилось об этом.
Почему без with?
Как раз в данном случае with даёт огромное преимущество потому что тогда файл предстаёт как генератор, а ты в своём коде просто берёшь и сразу его целиком читаешь, что намного менее эффективно в плане памяти. Загружать в память всего шекспира за раз - крайне сомнительная идея. А когда файлы будут не по 5-10 МБ, а по 5-10 ГБ? Тоже будешь грузить целиком?
Скорее всего это и есть инфа которую приложуха использует для своей работы, дебс.
С ебучими продуктами пакета офис я вообще не взаимодействовал и не ебу с какой стороны заходить, поэтому первая мысль была про циклы в пистоне.
Есть всего несколько библиотек для работы с экселевскими файлами - все в гугле хорошо описаны не ошибешся. Все они примерно одинаковые. Наверно самая популярная это openpyxl.
Но если ты совсем нюфаня в погромировании, то лучше сразу забей, порог вхождения в эту ебанину выше среднего.
>>763688
Добавлю, что если тебе нужно просто сравнение таблиц лучше делай это средствами самого эксела, там у него ещё и какой-то скриптовый язык свой есть. я помню 10 лет назад даже что-то писал на нем. Питон в этой задаче будет костылем, его имело бы смысл применять если бы тебе надо было жонглировать кучей файлов и управлять таблицами из другой прилажухи, а так - проще в самом экселе сделать.
Да уже не помню точно, кажется да, VBA. Для сравнения двух таблиц более чем достаточно. Впрочем сравнить две таблицы можно наверное даже в ячейке внутри экселя с помощью формул
Ты хочешь чтобы тебя за твое сранье в треде все нахуй слали?
дибил, изыди из треда. Я в научных целях спросил, на примерах, доступных даже тебе, дибилу-школоте.
Братишка, давай в /dr/
>Бэйсик?
В экселе от мелкомягких - всегда был только он. Вернее его допиленный вариант "Visual Basic for Applications" (VBA).
Одна из вещей, которые мне особо нравятся в Libre Office здорового человека: там тебя так не ограничивают и ЯП куда больше, среди них JS и Python. Так что, если MS не принципиален, можно сделать всё в либре.
> with даёт огромное преимущество потому что тогда файл предстаёт как генератор
Тащемта файл он всегда генератор, был генератором еще когда with и в проекте не было.
И тот факт что файл это генератор к расходу памяти никакого отношения не имеет.
Ты какую-то хуйню написал. В контексте именно файла генератор как раз нужен чтобы большие файлы, которые в память целиком не влезут, обрабатывать маленькими кусками.
Просто вызываешь .read() в цикле и всё.
Никакие генераторы не нужны кроме как для украшательства
>вызываешь .read()
И в этот момент прочитается весь файл.Да. я вижу дополнительные параметры, но ты попробуй так сделать с текстовыми файлами и дай гарантию, что слово не порвётся посередине.
Для текстовых файлов зайдёт readline().
Использую питон больше года. Задавайте ответы.
И что тут может быть непонятного?
Ты больше года работаешь с питоном и до сих пор не знаешь, что bool наследован от int?
>В контексте именно файла генератор как раз нужен чтобы большие файлы, которые в память целиком не влезут
Ну так считывай контент файла по чуть-чуть а не целиком. И with тут ни при чём, он просто гарантирует закрытие файла
True это 1, False - 0.
Не факт, что такое решение предусматривалось, но
def get_biggest(arr):
____return int(''.join(sorted(map(str, arr), reverse=True))) if arr else -1
Ну я её в итоге решил неким подобием пузырьковой сортировкой, но это явно не оптимальное решение.
Это как раз первое, что мне пришло в голову, но это не работает.
Например, у нас на входе числа 7, 71, 72 - такой код выдаст 72717, а должно быть 77271.
Разумеется это неправильное решение, лол.
Тоже не будет работать, пикрил
какого-то хуя спам-фильтр не пропускает список чисел, поэтому пришлось делать скрин
> пузырьковой сортировкой
https://www.youtube.com/watch?v=6nQZVS657Ew
Сильно неоптимально.
>>766500
Вижу два пути, но придумывать реализацию лень.
1. Перебрать комбинации, выбрать максимальную. Реализуется максимально просто (например, через itertools.product), результат гарантирован, но работать будет пиздец медленно.
2. Сначала перегнать числа в текст, потом сортнуть по алфавиту (от сортировки по числам, понятно, придётся отказаться), потом склеить и перегнать назад в число. Но есть тонкости. Например, если начало совпадает: в 2, 21 короткое число должно быть раньше, а в 1, 12 - позже.
> сортировка за квадрат - слишком не оптимально
> в качестве альтернативы предлагает полный перебор
Ебать ты клоун.
Вот вам ванлайнер, работающий за NlogN:
lambda arr: 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
Учитесь, малята.
зы. Ну ванлайнер, по модулю того, что надо functools импортировать...
Впрочем, это то же, что у тебя на скрине, только сортировка заменена на более эффективную. Непонятно, что тебе помешало сделать то же самое.
Ты, к слову, понимаешь, почему это решение работает?
за NlogN \times MAX_STRING_LEN конечно же.
> Ну я не знал про cmp-функции и про то, что их можно запихнуть в сортировку
Я скорее не про реализацию говорил - с ней-то всё понятно более-менее, а про сам алгоритм. Понятно ли, почему алгоритм (который ты сам в общем-то реализовал) выдаёт правильный ответ? Впрочем, если говоришь, что разобрался, то уже и не важно. Всё хорошо, значит.
Двач, только начал учить питон. Есть задача - получить код страницы dzen.ru. В браузере показывает код нормальный - пик1. Но через GET запрос на питоне выдает вообще другую хуету - pic2. А вот если кинуть ссылку на двач, например, то код дает нормальный код страницы.
Слегка загуглив, нашел, что это пидоры владельцы сайта там какую то ссаную защиту от парсинга установили. Как обойти эту защиту ебучую, может кто в курсе?
>cmp_to_key
А зачем это тут? Это же функция которая конвертирует cmp(). которого в питоне 3 больше нет?
> А зачем это тут?
> Это же функция которая конвертирует cmp(). которого в питоне 3 больше нет?
Ты сам на свой вопрос только что ответил. В python3 у sorted() нет параметра cmp, а есть только параметр key. Поэтому если ты хочешь использовать для sorted кастомный компаратор (то есть callable, принимающий 2 параметра, а не один), то его надо каким-то образом конвертировать в то, что ожидает на вход key, то есть в callable, принимающий на вход 1 параметр.
>Как обойти эту защиту ебучую, может кто в курсе?
Эти "защиты ебучие" разрабатывают серьёзные дяди за большие деньги, та что раз ты так быстро сдулся и пошёл спрашивать - то никак :)
Оооо, ничего себе. А что именно тогда там лямбда принимает в качестве аргументов? Два следующих друг за другом значения из map ? 0_о
Параметр 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)
Пример кода на пастебин: https://pastebin.com/AA4X1wTk
зы. В functools почти наверняка реализация более красивая. Наверняка там можно как-то использовать метаклассы или что-то в этом духе, чтоб не передавать явным образом компаратор в конструктор. В частности, это бы дало гарантию, что у всех сраниваемых объектов одинаковые компараторы (в моей реализации такой гарантии строго говоря нет).
>> сортировка за квадрат - слишком не оптимально
Она долгая. Если уж ебаться со своей сортировкой, то чего бы не реализовать что-то более приличное.
>> в качестве альтернативы предлагает полный перебор
Не столько предлагаю, сколько... IRL делал такое. Всегда приходится решать задачи, исходя из компромиссов. Так вот, иногда на решение отводится минимум времени и в этом случае можно вместо дорогого времени программиста использовать, пусть и неэффективно, дешёвое время процессора.
Код с полным перебором уже написан и займёт две-три простые, понятные и легко воспроизводимые строки.
Для разовых задач считаю допустимым. Если кто-то тут заявит, что он прям никогда так не деле, то он либо лжец, либо никогда не решал практических продуктовых задач.
> Ебать ты клоун.
Дык, ёпта.
>та что раз ты так быстро сдулся и пошёл спрашивать
Я не сдулся, а пытаюсь решить проблему, в том числе интерактивно, спросив на дваче. А так то я уже нашел инфу в гугле.
поясните про этот синтаксис с lambda и равно внутри лямбда, чет раньше не встречал, и в инете инфы мало
Ничосе питон для продвинутых пользователей пк. Надеюсь без практики я это не забуду через пол года. Т.е. мы с помощью functools заменяем этот компаратор в сортировке на свой в виде лямбды. Странно, почему деды не встроили по умолчанию в сортировку для этого отдельный параметр key=foo, cmp=bar...
Впрочем это слишком сложно для меня ещё, я лучше напишу 5,10,20 строчек в отдельном блоке кода чем такое буду применять. Мое абстрактное мышление со скрипом осознает и представляет в виде объектов все эти многоэтажные перекаты из одного callable в другой. Впрочем, раньше и рекурсию со скрипом понимал, а сейчас более-менее ясно вижу.
ОТМЕНА, ЛОЖНАЯ ТРЕВОГА
это прост DEFAULT ARGUMENTS
фух, чуть не обосрался от страха думал, что какой-то новый синтаксис, который я не знаю
мимо помидор
оценил тебе защеку, проверяй
Бариста-помидор, новый сорт.
Тебе вообще не надо их импортировать, алембик сам из метадаты их подтягивает (из registry если быть точным). У тебя скорее всего какая-то проблема с моделью/генерацией миграций. Покажи класс Companies и покажи какой командой генерируешь миграции.
Двачую, помидору лет 20, устрашился лямбды, я хуею. Я миддл с этим сталкиваюсь уже года два и упраздняю в чужом говнокоде, потому что только упоротые дегенераты пихают лямбду там, где не надо и наоборот не используют, раздувая код на +20 строк, там где можно одной лямбдой обойтись.
>Тебе вообще не надо их импортировать, алембик сам из метадаты их подтягивает.
Откуда они возьмутся в метадате если их не импортировать ни разу по твоему? Как раз таки импортировать модуль с модельками в env.py норм практика.
Какие же все-таки уебищные лямбды в плюсах.
По сравнению с этим пиздецом, лямбды в питоне просто верх совершенства.
Хуже чем лямбды в плюсах разве что только типы в питоне.
Вот в камле типы божественные, а в питоне они нахрен все портят.
По крайней мере то как пишет большинство уважаемых коллег. Городят те же сраные спагетти но со стрелочками.
Все зло в мире от людей, как же я их ненавижу.
Шварпист залётный. Его язык настолько хорош, что он не может не поделиться с нами, сирыми и убогими сокровенным знанием о том, что на самом деле наш ЯП - вообще не ЯП.
Чел
Ступай к вьетнамцам. И так скинул.
Учил питон последний год, и вот теперь узнаю, что появился МОДЖО который его заменит.
И что теперь делать? Получается я впустую потратил время на устаревшее говно?
Да. Пиздуй в Дикси за кассу.
Пишут про какое-то там упрощение, но я увидел только усложнение.
По-быстренькому определять функции там, где их надо передать как параметр. Вот здесь хороший пример для сортировки: https://blogboard.io/blog/knowledge/python-sorted-lambda/
Кроме как использовать в качестве параметра, больше полезных применений нет.
Ебаная макаба испортила мне ответ.
Он еще не вышел, не факт, что взлетит, и Питон он скорее всего никогда не заменит, т.к. большинству юзеров Питона он не нужен, они подрочат на скорость циклов и вернутся в CPython.
Ну ты не будешь же новую именованную функцию объявлять чтобы передать ее в map или filter.
Просто в Питоне вместо мапов и фильтров часто используют лист компрехеншены, т.к. они сразу дают лист, а не ебучий генератор, поэтому ньюфаги не знают, олдфаги не помнят.
А в ФП наоборот мапы и фильтры юзают чаще, чем компрехеншены, потому что лаконичнее.
Пишу в вскод, юзаю дефолтную темную тему.
Рус айпи блокирнули? WTF?
Спасибо дядя, попрогромировал AI
https://lightning.ai/
С такой темой надо выглядеть как Карина, а не как кулхацкер...
пиздец
Выглядит как кошачья блевотина. С такой подсветкой глаза за пару часов кодинга из орбит вытекут и голова заболит.
Типо, они не позволяют создавать экземпляры класса наследника, если в нем не унаследованы все функции из метакласса указанные через декоратор.
Вопрос... А нахуя это надо то? Где это используется? Обычная защита от дураков?
То, что ты описал, называется абстрактные классы, а не метаклассы. Нужны как база для наследования, когда нечего писать в методе, потому что может очень гибко использоваться.
numbers = [1, 2, 3]
def get_biggest(arg = numbers):
if len(arg) > 1:
return sorted(numbers)[-1::]
else:
return 1
print(get_biggest())
Решил за 53 секунды. Такой вариант решения считается?
А, сорян. Я все перепутал. Спасибо за пояснения, теперь понял.
Допустим вам понадобился компилируемый язык в пару к питону. Ну не знаю, например, чтобы "обходить острые углы производительности" каких-нибудь йоба-циклов.
Какой вы бы выбрали: С++, 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'
Какого хуя?
И что твое решение делает?
Оно же просто сортирует лист по возрастанию и возвращает срез из одного последнего элемента.
Закинь папку tests в app
Возвращает самое большое число из отсортированного списка, либо единицу. В этом же была задача.
Возвращает самое большое число из отсортированного списка, либо единицу. В этом же была задача.
Почитай про относительный импорт.
Боже, что это такое. Как эту хуйню запустить, блять?
Ну ты хоть задачу прочитай внимательно.
Надо вернуть максимальное число, которое можно составить из чисел массива.
Если ты понятия не имеешь что это такое и как "это" запустить, то нахуя тебе это надо?
Чтоб знать как сортировать более эффективно и запускать подобные конструкции в дальнейшем.
>Питон - ненастоящий язык
Что это значит? Полагаю, что ты плохо разбираешься в языках и программировании вообще.
Обоснуй. На Питоне можно писать все то же самое, что и на других языках общего назначения.
Выбирай язык, который знаешь или хотел бы узнать. Или более подходящий под задачу. К сожалению, не существует универсальных языков. В каждом есть свои плюсы и минусы.
Кароч, так и не понял как эту залупу запустить.
>>777712
Все, переделал.
def get_biggest(arr):
if len(arr) > 1:
for i in arr:
for x in arr:
for k in arr:
lst = list(str(i)+str(x)+str(k))
return ''.join(lst)
else:
return 1
print(get_biggest([1, 2, 3]))
На это у меня ушло уже 8 минут. Знаю, что возможно есть способы лучше, но я нюфаг.
То есть ты просто написал свой код вместо старого? Это не называется "смог запустит". А в чём была проблема с запуском исходной версии кода?
> Все, переделал.
Что ты переделал лол? Что твой код вообще делает? А что изначальный код делал?
> print(lambda ... )
Ой бля... Чел, а ты понимаешь вообще, что такое лябмда? И ещё вопрос на засыпку: тебя не смущает, что у тебя вот в твою ф-цию get_biggest передаётся некий arg, но в теле ф-ции он нигде не используется?
Ладно.
>>778569
>А в чём была проблема с запуском исходной версии кода?
В том, что с запуском никаких проблем нет, я вывести значение не мог. Вот и всьо.
>>778570
Изначально он возвращал последнее наибольшее значение, сейчас он возвращает последнее наибольшее значение из комбинации трех чисел. Щас я понял, что задача была немного в другом. Нужно было вернуть наибольшее число из этих трех чисел игнорируя повторяющиеся числа. Но мне похуй на эти сентименты.
>>778584
>ты понимаешь вообще, что такое лябмда
Да.
>передаётся некий arg
Не обращай внимания, я просто много что перепробовал и забыл исправить перед скрином.
Кстати, результат я вывести всё-таки смог.
>Нужно было вернуть наибольшее число из этих трех чисел игнорируя повторяющиеся числа.
Вот, всего-то строчку надо было добавить.
Чел, забудь про этот cmp_to_key. Тебе это не пригодиться в ближайшие 2 года точно, только голову себе забиваешь. А если куда-то и применишь, то потом только жалеть будешь т.к. читаемость в разы снизилась.
Тем более если у тебя возникают вопросы уровня "как это запустить", то тебе это точно не нужно. Вот когда станешь тимлидом 300к в наносекунду как все мы в треде, вот тогда к этому вопросу вернешься, да и то врядли.
>только голову себе забиваешь
Ну, я как бы это коплю, сортирую и сохраняю всякую интересную фигню у себя в облаке, чтобы вернуться к этому потом и по изучать, а чтобы применять повседневно подобное, до конца не разобравшись, у меня и в мыслях даже не было.
>А это нихуя не работает.
Чел, сколько дней ты уже тред засираешь, уймись уже. Тебе самому не стыдно? Пошел бы уже давно и сам разобрался, нет двадцать постов надо написать что ничего не работает. Это говорит только о том, что ты даже базовый синтаксис питона не знаешь.
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])
Чтобы понять рекурсию нужно понять рекурсию.
Я не про то. Ты ее запускал вообще? В задачке же прямо сказано: найдите НАИБОЛЬШЕЕ число которое можно составить из трех чисел. Взгляни на образец в примере.
Если же прогнать через эту лямбду список вида [16, 9, 321], то она выдаст 932116.
Правильным решением будет 963211, как у меня, потому что это наибольшее число.
У тебя логика сломана.
Задача была вернуть число "составленное из чисел из списка"
Например [16, 9, 321] 16 это число из списка, числа 6 в списке нет. А ты зачем-то рассматриваешь числовой элемент списка "16" как строку и извлекаешь из этого элемента числовые символы "1" и "6". Этого согласно условиям задачи делать не нужно.
>как у меня
Твое ошибочное понимание задачки, только упрощает её, кстати.
arr = [16, 9, 321]
print (int(''.join(sorted(''.join(map(str, arr)),reverse=True))))
Я просто не верю, что такие дегенераты бывают на самом деле. Пожалуйста, скажите, что это троллинг.
//мимо
Наоборот сейчас курсы наносеков на каждом углу и это обычное дело.
> четкие ограничения
Что значит "чёткие ограничения"? Задача сформулирована чётче некуда блядь.
> хуйня задача
Жаль только, что ты её не решил.
Чел...
Судя по тому, какую хуйню ты тут нёс, едва ли ты понимаешь понимаешь решение этой задачи.
Зачем ты его так приложил. Он хоть и тред засрал, но по крайней мере не выебывается. А ведь часто заходят такие вкатуны, которые как только почюяли, что припустили в протки - сразу закатывают глаза и начинают агрессивный ультровизг т.к. признавать свои ошибки это не по их понятиям.
Кажется, я начинаю понимать почему даже сеньеры-помидоры редко стараются кому-то помогать.
Так этот долбоёб тоже своих ошибок не признаёт. И учить нихуя не хочет. Он тут насрал 20 однотипных постов с "посмотрите какой кал я в очередной раз высрал, теперь всё работает. А, кстати, а то что вы писали до этого - не работает и не запускается". Причём ему указыавешь на ошибки, а он всё это тупо игнорирует и говорит, что это уже не актуальные версии кода. Ну не актуальные, так хули ты тут срёшь своей шизой вообще?
Этот даун даже условие задачи за несколько дней не смог понять. А после того, как ему наконец разжевали, что надо сделать, он тут же высрался, что составители задачи тупые, а сама задача триавиальная (при том что он даже более простую её вариацию решил через жопу, лол).
>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, насильно пропихивая туда ключи, обмазанные говном. Ты ебанутый?
> Игнорируешь reverse
Так он не игнорируется лол. Ебать ты дурачок. И при чем тут вообще асимптотика. Выше обсуждалось, как решение в одну строчку записать. Вот это был ответ.
Нахуя ты сортируешь по ключам, какая практическая польза от этого, кроме быдлокода, в котором ещё надо две минуты потратить, чтобы разобраться, что хотел шиз?
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))
Нахуя, повторяю, ключи, обмазанные говном?
Чел... А ты понимаешь, что первые два приведенных тобой пункта не решают поставленную задачу?))
Ты бы вместо того, чтоб орать как ебанутый, лучше бы попробовал подумать, как и почему решается задача. Заодно бы понял, зачем там кастомный компаратор и чем он отличается от стандартного сравнения строк.
А может ты тред прочитаешь, а не будешь тут своим идиотизмом всем мозги ебать?
Вот тебе пример входа [2, 21].
На всякий случай. Тот кастомный компаратор, с которого ты подорвался, реализует предпорядок, но не частичный порядок. Это если тебе эти слова хоть о чем-то говорят, продвинутый ты наш.
Клоун, ты думаешь, я не в состоянии твой код скопировать что ли?)
212 они выводят. Иди обтекай, программист хуев.
Хорошо, вафел, убедил.
Тем не менее, свой шизокод никому больше не показывай. Для сортед достаточно ключа key=lambda x: str(x) * 2, чтобы сортировка проходила как следует, а не твоё говно говна.
>убедил
При чем тут "убеждение" ты же просто обосрался, обкакунькался, насрал под себя, с ноги ворвался в нить, но споткнулся об порог и упал лицом в говно. Имей же достоинство хотя бы признать свои ошибки, зачем ты усугубляешь свой позор.
Я признал свою неправоту, обосанный, но это не отменяет того, что ты шизобыдлокодер, который выехал на вауэффектах и полной обфускации своего говна.
Я показал решение лучше и проще, но ты продолжаешь тявкать из под шконаря. Олсо ты проехался по условию, если список пуст, чекай за щекой.
> Для сортед достаточно ключа key=lambda x: str(x) * 2
А зачем ты продолжаешь срать себе в штаны? Попробуй запустить свою хуйню на [2, 221]
Охуенно ты ворвался, братан. Задачу не понял, ни одной строчки кода правильно не написал, зато визг выше гор стоит. Сразу видно синьора тимлида.
Пффффх. Пожалуйста, если ты не мог сам решить такую простую задачку, даже поняв ее смысл с первого хода, то не далек тот момент, когда снова себя таковым почувствуешь.
Аноны, а уж случайно не самый ли жёсткий попуск в истории треда мы только что наблюдали? Полное многократное обоссывание агрессивного долбоёба... Да уж.
Задел "себялюбие" тем, что сам себе в штаны насрал несколько раз подряд?
Держим марку.
x = lambda x: ''.join(sorted(re.split('', ''.join(map(str, x))), reverse = True)) if x else 1
print(x([18, 21, 783]))
Вот самый правильный и оптимальный вариант.
> как правильно сортировать циферки по алфавиту.
А в этом треде никто такую задачу не решал... Откуда ты её взял?
Не знаю, кто-то подложил...
Ты хоть один пост можешь написать не обосравшись?
последний раз трудоустроенный соточку получал
Так он же вроде не спортсмен.
>Я показал решение лучше и проще, но ты продолжаешь тявкать из под шконаря.
Блядь, ты не показал ни одного работающего решения, только шизу свою показал.
Прям анекдот про 10 %профессия_нейм% и 1 лампочку.
Кста решение через однострочник лямбду кал. Сидеть разбирать это говно мало кому потом захочется. А если нужен перфоманс то уж переписали бы на cython
Жалкий клоун, тебя уже обоссали и ты решил другим аноном прикинуться? Только вот ты тут ни кого не обманешь, петушок, ты сильно палишься своей попоболью и манерой построения фраз.
sorted(['1', '2', '20', '110'], reverse = True)
sorted([1, 2, 20, 110], reverse = True)
Сможешь понять разницу?
Ну например 20 < 110, а соответствующие строки сравниваются наоборот. А при чем тут это, дебс?
Была только одна цель - написать решение в одну строчку с сохранением асимптотики. Цели оптимизировать внутреннюю константу/оптимизировать что-то там под какое-то железо/whatever что там тебе ещё в голову пришло не было. Цели сделать код читаемым тоже не было (иначе бы в одну строчку никто бы не пытался ничего запихать).
Я вообще-то другой анон, могу даже скрин скинуть. Чтобы ответ получился как в задаче, надо всего лишь сортировать числа по стрингам и сджойнить. Зачем ты тупишь? Сколько тебе лет?
> надо всего лишь сортировать числа по стрингам и сджойнить.
Почитай, пожалуйста, тред хотя бы за вчерашний день и найди в сообщениях контрпример к своего утверждению.
Ну вот в тред ты покакать не забыл, клоун.
Спешите видеть, этот даун уже даже на нужное сообщение не может ответить. icq его представили?
Так что же это получается... Значит наш герой и правда не так хорош как он о себе рассказывал? Мда... Стыдно, товарищи, стыдно. Но ничего, в охранники вот требуются...
На твое усмотрение.
А, это древняя хуйня. Ее можно сделать множеством способов. Лучше понаблюдаю как ее здесь местные решают.
> А, это древняя хуйня. Ее можно сделать множеством способов.
Задачу, в которой надо дословно сделать то, что написано словами, можно сделать кучей способов. Хуя ты умный... Наверно phd по computer science. Никак не меньше.
Рейт.
Раньше это упражнение не делал. Время выполнения минут 15 наверно.
matrix = [[1,2,3],[4,5,6],[7,8,9],]
def spiral_transposition(mtx, rev=False, res=[]):
....if rev:
........mtx.reverse()
....res.extend(mtx.pop(0)[::-1] if rev else mtx.pop(0))
....for i in range(len(mtx)-1):
........res.append(mtx.pop(0 if rev else -1))
....if mtx:
........spiral_transposition(mtx, rev=False if rev else True, res=res)
....return res
print(spiral_transposition(matrix))
matrix = [[1,2,3],[4,5,6],[7,8,9],]
print(matrix[0], matrix[2], sorted(matrix[1], reverse = True))
Мог бы и вот так сделать, результат один и тот же, только он неправильный.
Нужно чтобы так было: 1, 2, 3, 8, 9, 4, 7, 6, 5.
>Нужно чтобы так было: 1, 2, 3, 8, 9, 4, 7, 6, 5.
По-моему ты задачу не понял, надо чтобы по спирали шло как на пике.
И да я проебался. В одном месте то ли мкба зажевала то ли я криво скопировал, но нет и ещё в одном месте "rev" с "res" перепутал.
Вот так всё работает и на больших массивах состоящих .
https://www.online-python.com/rGbRuYq9tl
Ещё упростил, теперь масив не крутится а все манипуляции только с указателем. работает вроде на матрицах любого размера.
Готов принять ваши оферты на работу от 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
Нет спасибо, вакансия модератора на дваче меня не привлекает.
Так малята, ну что, просили ванлайнер, решающий эту задачу?
Вот вам: https://pastebin.com/esw6V43r
На этот раз даже без импорта сторонних модулей. Кушайте, не подавитесь.
ванкилобайтер
Не, ну тут всё-таки есть сайд эффекты, увы. Питон всё-таки по чистое ФП не очень заточен. Ну либо у меня просто руки из жопы.
Сорян, думал это какая-то злая, подлая шутка, а это и правда километровый вайнлайнер.
Да не, какие шутки. Я тот же самый ананас, который писал прошлый ванлайнер. Мне просто делать нехуй...
Похоже как будто через какой-то обфускатор нормальный код пропустили. Искать такой обфускатор я конечно не буду.
Нет, просто я отдельно писал несколько разных лямбд, чтоб отлаживать было удобнее. А в конце уже их все вместе склеил. Поэтому получился кусок говна. Ну от ванлайнера ничего другого и не стоило ожидать.
Если раскрутить, то можно разобраться, но нахуя?
Скажи мне, где ты работаешь, чтоб я там никогда не появлялся...
>((st[1] + 3) % 4) // 2
>comparators[p]
>lambda x, y: x <= y,
Похоже как будто анон забыл пару лямбд из прошлого ванлайнера удалить. Или просто на клаву лицом упал случайно.
Слишком сложно.
Пиздос. Объявляется конкурс на лучшую оптимизацию ванлайнера.
Я тоже любитель вайнлайнеров. Как merge sort так написал, а в этом треде тоже говорили, что это всё обфускатор
https://ideone.com/ueZUFE
Не, ну это хотя бы прочитать можно. А тот пиздец что выше... его какой-то психически нездоровый человек писал по-моему.
Побороть лень, очевидно.
У Саньки Рыжего и Чпока Дадона. Ещё пятый кабинет весь.
в дурке
Возьму тебя бесплатно, будешь функции для селери писать проекту и метрики слушать прометеусом.
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
Тут будет ошибка, потому что значения в списке натурализуются и только потом обрабатываются. Таким образом мне это не подходит.
Как быть? Как красиво записать длинное условие чтобы оно было ленивым?
Лямбды чтобы не инициализировать список до проверки
a = [lambda: True, lambda: int('x')]
b = [lambda: False, lambda: int('x')]
print(any(map(lambda f: f(), a)))
print(all(map(lambda f: f(), b)))
https://ideone.com/SgkuOh
Никак. Проблема не в коде, а в самом условии. Могу разве что посоветовать обернуть в скобки и избавиться от \.
Как они предполагают это решать, регулярками дрочить штоле? Это явно не про парсеры реальные.
Я думаю, подразумевается итерация или регулярки. Хотя итерироваться по тем же форам или вайлам будет весьма ебано, регулярки в этом плане проще. Может скомбинировать, хз.
>регулярки
Следует избегать максимально. И вообще, они для пидоров, разговаривающих со всеми через губу.
Неосилятор, спок
Не очень понятно, что тебе надо, что ты подразумеваешь под транспиляцией скриптов
Тебе надо команды вроде cp/mv/rm/ls/cat портировать? Или что?
ТЗ не ясно.
парсеры и синтаксический разбор про другое
Нахуй он кому нужен, если выше уже ванлайнер давно висит?
> обфускатора
Нет там никакой обфускации. Ванлайнеры для тех двух задач ты нормальнее никак не запишешь.
Это не мне надо. Есть такая задачка, предлагают решить за деньги, я вот думаю.
Портировать ничего не надо. Базовую хуйню вроде echo for while, присваивание-интерполяция переменных, а всякие ls/cat через subprocess.
>Литература
Что из этого можно почитать, чтоб подготовиться к стажировке (или на начальный уровень)?
В условиях не было писать 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)))))
Сколько времени потребуется, чтобы разобраться, что за код?
Наверное поболее, чем минута.
Хуя подрыв)
Нет и не будет. Гуи сдохли, потому что не смогли изобрести гуй одинаково работающий под 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'])
Но выглядит это как-то громоздко, сожет есть более короткие варианты для парсинга "глубоких" джейсонин, без двойных и более циклов и кучи ключей в квадратных скобках?
Я ебошу все на tkinter. Он был первоначально сделан для очень странного ебанутого языка Tcl. Там была (еще когда Tcl'ем кто-то хоть немного пользовался) концепция мегавиджетов. Эта концепция намного лучше реализуется как раз на питоне. Вообще tkinter единственное, что без бубна работает на разных платформах. Странно, что его под браузер только не сделали, хотя гуи вероятно действительно пожраны залупой WebView, которая кстати многим не нравится.
Рекурсией или циклами с несколькими вложенностями как у тебя.
Если хочешь нейросетку в свой микросервис, то с голанг сразу учи кресты, чтобы ее через них затаскивать. То есть, например, обучаешь во фреймвокре TensorFlow, используя питон, потом в прямом направлении она у тебя работает через C++, а коннектишь в программу на Go с помощью CGO через точку входа на plain C. Вот только кресты кстати надо нормально знать, потому что документация нейросетевых либ для крестов отстает или ее местами вообще нет, потому что подразумевается, что крестовики-то сами во всем разберутся.
Необходимо два поля в таблице оба обычные целые. А и Б. Первое может принимать любое значение, второе должно быть "автоинкрементом" но связанным с первым. То есть у каждого значения А должен быть собственный next_id для Б.
Скорее всего придется делать всё руками.
>мидл реакт разработчиком +4 года
Без пезды чел, если ты за 4 года не можешь найти работу, то ты точно не мидл. Ты знаешь, что такое абстрактные структуры и модели, как работает нода с прототипами, чем движок V8 отличается от V7, какие его преимущества и недостатки?
Это не говно о теории, это бейсед.
Я три месяца кручусь в джаваскрипт и два года в пайтоне, собесы на джуна прохожу, но офферы не принимаю, потому джиэс - это помойка.
Мне го не нравится тем, что там на бэке надо raw SQL прописывать.
>ты за 4 года не можешь найти работу
У меня чистый опыт работы 6 лет, на тот момент в 2021 году было +4 года опыта уже начались проблемы с поиском работы, слишком много вкатунов, слишком большая конкуренция, нужно пройти сотни собеседований что бы найти работу.
>Ты знаешь, что такое абстрактные структуры и модели, как работает нода с прототипами, чем движок V8 отличается от V7, какие его преимущества и недостатки?
Знание этой хуиты никак не помогает в работе. То что ты описал нужно узкоспециализированым инженерам которые работают на крупные ИТ корпорации.
Скажи как отличается код на реакте без знания и знанием этой хуйни?
>Это не говно о теории, это бейсед.
Потому что ты так скозал?
>собесы на джуна прохожу
Я в начале 2017 года нашел свою первую работу за две недели пройдя только не более 5 собеседований, без знания редукса, мне на тот момент был не понятен. Но мне кажется что ты пиздабол, на данный момент никто не берт джуна во фронтенд слишком дохуя кандидатов и не нужно здесь пиздеть маняхуйню что все они тупые а ты один умный, фронтенд не настолько сложный, через полгода работы из джуна можно спокойно вырастить в мидла который спокойно может с нуля сделать проект любой сложности.
На ангуляре еще меньше вакансий, мне сам по себе этот фреймворк не нравится.
Я сейчас говорю про удаленку, возможно в офис легче вкотится джуну.
Обычный тултип, произошло действие он маякнул.
есть таск: напечатать кучу хуйни всякой в ворде. 300 единиц.
с одним подводным: надо менять в документе серийный номер.
на каком языке ( и можно ли ) написать скрипт, который поставить на печать ряд документов, и при этом пропишет в определенной графе серийный номер. например 10 .docx файлов, и в каждом номер - 001, следующий 002 и т.п.
Статус бар это если какой интерфейс есть. У меня всё в сонсоли, но например копируешь ссылки на ютаб и чтоб точно знать что она скопирована желательно какую-то всплывающую подсказку сделать, но нормальный тултип не могу найти.
Мне кажется, это макросами прямо в ворде можно сделать
docx это зип архив со всякой требухой и хмл самого документа. Открываешь его и меняешь, даже модули сторонние не нужны.
аноны вы можете мне подсказать в таком случае как будет выглядеть код и как его запустить? ну или хотя бы кинуть линк где инструкция.
я полез в эти макросы, ну нихуя непонятно
мне нужно чтобы в 3 полях на разных страницах в word документе просто менялся автоматически номер при печати. типа 12345-001, 12345-002 и тп.
я попробовал сделать в тех местах закладки, и через них задат нумерацию, но нихуя не работает
памагите ятупой
ты ебанутый наглухо? Хорошие знания джанго и ООП + хтмл и уже можно спокойно работу искать. Чисто приложухи на джанго писать.
Ну если это дело потом как то скомпилировать, то да, будет бомба.
Имеется телеграм канал и туда уже загруженные какие-то аудио файлы
Пытаюсь сделать бота который будет по названию аудиофайлов находить его выгружать его с телеграм канала и отправлять на фронтэнд.
Как это сделать?
Бля(
А еще DRF, Docker, SQL, базовый JS, профильная вышка и год коммерческой разработки - тогда может быть рассмотрят на должность стажера и младшего помощника джуниора на зарплату 20к рублей.
да нихуя. достаточно выбрать одно направление и достичь там нормальных результатов (можно самостоятельно) ты столько всего перечислил что это уже на мидла тянет, но уж точно не на стажера/джуна
Чел, я просто перечислил стандартные требования для вакансий junior python developer в 2к23 году.
Будем честны, для джуновских задач докер учится за пару часов, делается рабочий манифест и потом переходит из проекта в проект, sql учится ну за пару недель с учетом простых джоинов, базовый js вообще опционален. Ну а насчет дрф - как правило человеки-фреймворки сейчас учат что-то сразу. Про год коммерческой разработки - ерунда.
База - 7.2Гб
Индексы по всем полям есть. Ну вот как ускорить писю?
бумп
Антонио Меле - Django в примерах
в смысле, у постгреса.
Вот ты какой умный, твою мать.
Давай тогда расшифруй эту ебень:
[(0, 'Init', 0, 13, 0, None, 0, None), (1, 'Null', 0, 1, 2, None, 0, None), (2, 'OpenRead', 0, 2, 0, '5', 0, None), (3, 'Rewind', 0, 9, 0, None, 0, None), (4, 'Column',
, 4, 3, None, 0, None), (5, 'Ne', 4, 8, 3, 'BINARY-8', 84, None), (6, 'Rowid', 0, 3, 0, None, 0, None), (7, 'AggStep', 0, 3, 1, 'count(1)', 1, None), (8, 'Next', 0, 4, 0
None, 1, None), (9, 'AggFinal', 1, 1, 0, 'count(1)', 0, None), (10, 'Copy', 1, 5, 0, None, 0, None), (11, 'ResultRow', 5, 1, 0, None, 0, None), (12, 'Halt', 0, 0, 0, No
e, 0, None), (13, 'Transaction', 0, 0, 106, '0', 1, None), (14, 'Integer', 2, 4, 0, None, 0, None), (15, 'Goto', 0, 1, 0, None, 0, None)]
запрос был:
cur_.execute("EXPLAIN SELECT count(oid) from _clients WHERE kind=2;")
print (cur_fns.fetchall())
очепятка, курсор одинаковый
Передавай картинки в base64, можешь вообще все угодно передавать и на фронте парсить
мимо король говна
Питухон изучаю уже ~полгода, хапнул всю базовую базу до основ ООП (а также основы БД и гит), запилил пару первых петов - бота для мморпг на OpenCV и телеграм бот-магазин, параллельно курю Чистый Код Мартина. Щас по идее как пора углубляться в непосредственное направление, решил не метаться и идти именно в веб разработку как изначально и хотел, т.к. это мне наиболее интересно а вкатиться в тестировщики/аналитики как я понял нихуя не проще, везде свои подводные.
Так вот сейчас по моей логике мне надо браться за Django, и отсюда возникает первый вопрос, правильно ли я понимаю что в принципе уже в ходе изучения джанги можно будет подтянуть свое понимание ООП? Т.к. я чувствую прям недостаток знаний и опыта в этой теме, то есть теорию понимаю но практкики было мало. Или нужно как-то отдельно подкачать ООП и дальше уже браться за джанго?
Далее, я себе отдаю отчет что я в принципе склонный к демотивации и забиванию хуя чел, поэтому для обучения мне больше подходит курс/ментор, где меня будут подпинывать и помогать на моих затупах, тем самым сглаживая углы на которых будет возникать желание все дропнуть. Ментора в принципе могу себе позволить, хотя и дороха, но имхо это избыточно на начальном этапе, поэтому я пытаюсь найти какой-то курс который подходит мне по лвлу, но чет на какой не посмотрю они либо начинаются с полного нуля, либо там полно какого-то говняка который явно напихан тупо для объема. Короче кто знает пиздатый курс (можно на ангельском, но лучше на ру) где именно нужные вещи для веба, джанга там, всякие эти редисы, брокеры сообщений и тд без говняка - посоветуйте плиз. Желательно чтобы по ходу обучения это все закреплялось на проекте.
Воот епты бля, ну собственно и все, подскажите кто шарит как и по каким материалам дальше развиваться чтобы быстрее достичь состояния личинки разработчика.
Возьми лучше фласк или фастапи, будешь энкодить изображения в base64, как я.
1 год стажа опыта
Условие такое, что на пути к ключу предыдущий ключ может просто отсутствовать и соответственно выполнять условие дальше, не вызывая эксепшн, не имеет смысла.
Попробовал моржа, но выглядит всрато.
Как правило самое лучшее решение простое, спасибо, кот.
Есть вложенная функция, которая в упрощенном виде выглядит как:
def func1():
__def func2():
____do something
____if condition:
______return True
____return False
__return func2()
Проблема в том, что эта херота не возвращает ни True, ни False, хотя condition точно случается.
Что за херня?
Дебажь инструментом или принтами, например запомним что-нибудь после условия, твоя структура работает. Ты лучше свой код закинь.
Дебажу, но не понял, что за херня.
Код
https://ideone.com/6Yi4Li
Да, литкод
Вот тут условие выполняется, но возвращает False, а не True:
h
next_letter
3
len(word)-1
3
position
(1, 0)
next_letter
2
False
И, вообще, по идее, вот эта часть:
position
(1, 0)
next_letter
2
Не должна быть.
Да, чел, ну ты хуйнёй озадачил.
Вот тут ты зачем-то просто вызываешь рекурсивную функцию, но не записываешь результат и не выполняешь никаких действий, код работает без пользы.
Так исправь и пробуй.
>рекурсивную функцию, но не записываешь результат
Там увеличивается счетчик next_letter, до тех пор, пока он встретит или не встретит условие.
Ну так блят логику включи, это значит что ошибка не в той конструкции вложенности, а где-то в другом месте. Ты видимо вообще слабо представляешь как твой код работает и просишь других его распутать всё понять что куда передается и починить. Неплохо ты придумал.
Чел это с какой-то галеры или ты что-то для себя делаешь? Хочу просто понять за ТАКОЕ платят?
>>796018
У скулайта нет сервера, норкоманы, это просто бинарная либа с питоньими биндингами. Там нечему тормозить, если у тебя не десятки миллионов записей. Скачай соснольный шелл и там пробуй свои запросы.
https://www.sqlite.org/download.html
Последняя опция под шиндовс.
пися девчачья. Я же выше писал, размер дб в 7,2Гб примерно. Как тебе такое, илон маск? сикулайт сможет перебрать все записи, и посчитать коунт(*)?
Вкатываюсь в ит не ради работы, но ради интереса.
Сейчас учу питон, уже прочел половину укуса питона и параллельно посмотрел +- треть видеокурса, утащенного с торрентов.
(Не просто смотрю/читаю, повторяю сам, пытаюсь копаться)
По окончании хочу попробовать освоить машинное обучение. С математикой на Вы, но попробую все равно.
Как дочитаю укус, хочу прочесть ещё что-то подобное, но уже на инглише, чтобы привыкнуть к кошерной терминологии и закрепить материал.
Все правильно делаю ?
>хочу попробовать освоить машинное обучение
Автомехаником решил стать после освоения питона? Похвально.
дальше ничего
>укус
То что ты пробежался глазами по укусу и максимум перепечатал себе примеры кода в IDEшку, позапускал и сказал "ага это я понял" дает тебе весьма печальное понимание питухона, надо все теоретические знания закреплять на практике решая какие-то задачки.
А чег оне на плюсы сразу пересадить или на го с растом? там вроде больше медианные зп
Потому что поменять фреймворк это не так то сложно.
Go проще питона, он более узконаправленный.
>Как апнуться до мидл+
Просто стань опытным и компетентынм
>какой проект нужно запилить
Никакой
>осмелиться претендовать на это повышение?
>повышение
Проще при переходе на другую работу. В текущей компании у всех вогруг уже сформировался образ тебя как джуна (если ты сейчас джун, как я понял), а для нового работодателя ты - чистый лист
Надо самому, а не через подбенжерложенного Гвидо.
Вот есть таблица 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) Если структура модели отличается от структуры дто или запроса-ответа, под каджый случай пилить свой маппер?
Мне не нужно работать, я посмотрел видео как стать миллионером за пять сек.
Рабочее место требует только проверки на харизму.
4млн. записей. Может ноут так себе. Но для бд - это позор вообще-то так считать. Только если он сначала грузит дб в память, а потом имеет её. Но это позор, видимо даже хэша нет полноценного.
На этот вопрос нет простого ответа. Это не станок с ЧПУ освоить на заводе. Ты например можешь выучить синтаксис языка и встроенные функции за пару недель, и что? После этого сядешь на стул и скажешь "всё, теперь я у мамы погромист". Нет, этого не достаточно. Надо типы данных учить, алгоритмы, ооп, стандарты написания кода. Достаточно этого? Опять нет, надо дальше учить - подкапот языка, что куда перекатывается, разные обязательные либы, тысячи их. Хватает? Опять нет, нужна практика - пишешь петпроект, смотришь как дургие пишут, пишешь, пишешь, пишешь. Всё свободное время туда. Хватает? Опять нет, да что ты будешь делать - кабан кабаныч, куда ты пойти хотел, требует от тебя другие знания - идешь. учишь, ковыряешься разбираешься.
Суть в том, что надо непрерывно учиться и нет такой точки куда ты доучился и остановился, потому тебе и сроки никто не скажет.
Ну а синтаксис питона и его встроенные функции + некоторые обязательные либы за пару недель можно выучить.
Я хапнул именно базу самого питухона (начиная от переменных и заканчивая основами ООП) за 3 месяца, занимался в среднем часов 10-15 в неделю, при этом все закрепляя на практике. А так вот эти вопросы "сколько времени надо чтобы X" вообще неуместны, ты можешь быть нереально увлеченным и замотивированным чуваком который будет по 15 часов в день дрочить и соответственно через пару месяцев уже будет что-то там шарить, а можешь быть ленивым хуем которому это айти нахуй не всралось и он каждый вечер чисто заставляет себя на полчаса открыть купленный курс и через год даже ничего не вдуплить.
Потому что 90% вакух для джунов на джанге.
Шапку прочитал, но не увидел ничего.
Суть: нужно какое-то чтиво (желательно с обилием практики), для сисадминчика, чтобы быстренько вкатиться в питон. Знаю баш, немного кодил на руби. Питон нужен чисто для сисадминских/девопсовских нужд. Перебрал несколько учебников, там все разнится: от введения в питон для детей (чисто БАЗА на 500+ страниц), до обзорных гайдов по возможностям питона без погружения (python и девопс Гифта, например).
Лучи добра тебе, няша
Как решать подобные уравнения? есть идеи?
>производительность как у си
Уже Cython
>джаву када заменит?
Никогда
>GIL када уберут?
Уже (cython.nogil) в 3.13 зкспериментально возможно, лет через 5 в стабильном билде
Всего этого тебе не надо, ты будешь писать на питоне, и будешь счастлив
Мировая закулиса генетически выводит служебных питонистов!
А потом у ребенка-трансформатора вместо родителей будет Питонист 1 и Питонист 2.
Верно подмечено, каллега. Не зря ведь такой резкий хайп и агрессивный всплеск курсов по питону, чтобы люди не могли пейсать на нормальных язычках, таких как хуйскелл, раст итд. В итоге мы получаем дешевую рабочую силу в лице шаолиньков питонистов, которые будут готовы выжигать глаза смотря на код в мониторе в белом режиме JupyterLab ради смуси и сушеных кузнечиков. И они будут счастливы
Анонче, подскажи, как запаковать программку в exe из ипитона, чтобы она работала на винде где среды нет? Какие инструменты лучшие, программка для баловства, окошко и пара кнопок.
база. я пишу основной код на С, компилирую в динамические библиотеки и подключаю к питону через ctypes
есть всякая хуета для преобразования. я использую тяжелый вариант, который ты не поймешь. погугли про embedded python, а еще важно понять, что ты можешь дописать любой текст в конец exe файла. я делаю так: пишу прогу на С++, используя библиотеку питона, которая позволяет исполнять код, копирую код на питоне в конец скомпилированного файла. важно, чтобы между кодом программы и вставленным скриптом была какая-нибудь строка, которая будет использоваться как разделитель, программа на Си должна прочитать содержимое самой себя, найти строку-разделитель, считывать код после этой строки-разделителя, и затем при помощи "встроенного питона" исполняет этот код.
этот вариант ебанутый, тут нужны нетривиальные знания
Это копия, сохраненная 29 сентября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.