Вы видите копию треда, сохраненную 13 сентября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ЧАВО: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat - с этого начинать, перед тем как задавать вопросы Анон, ты конечно сразу станешь спрашивать, но для приличия хоть открой ссылку какую-нибудь
Книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Ещё книжек? https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек Богу книжек! https://yadi.sk/d/H-00n-UG3RSQem
Предыдущий: >>1430914 (OP)
Короче, есть такой URLRouter
URLRouter([
path('device/<device_name>',IndicatorConsumer),
path('add',IndicatorConsumer),
path('', IndicatorConsumer)
])
И такая функция в консьюмерах:
async def websocket_connect(self,event):
print('connection succefull ', event)
await self.send({
'type': 'websocket.accept'
})
self.device_id = self.get_device_id(self.scope['url_route']['kwargs']['device_name'])
Суть в том, что scope['url_route']['kwargs']['device_name']) должна получать имя девайса, только на страницах device/device_name. Но эта хуйня ищет device_name на любой из страниц, которая есть в URLRouter, и если не находит, то закрывает сокет. А она не находит.
В документации вроде четко написано что делается так, но у меня не выходит
Суп питонач. Вкатываюсь в Django Channels и Celery. Сколько времени понадобится на освоение этих вещей?
Влез в Channels, и блядь статьи даже на русском хуй понятны. Новая терминология. Я до этого ни с асинхронщиной, ни с сокетами не работал. Ну хуй с ним накатил на проект, сделал уведомления через сокеты, но то что я использовал это 2% от всех возможностей Channels'ов.
Полез дальше в Celery, пока только накатил на проект ещё не разбирался, но ебать их страничка настроек в доках занимает наверное листов 20 А4 формата.
В общем посоветуйте статей\книжек на русском и английском языках чтобы прям по пальцам и терминология и основные концепции. Буду премного благодарен.
scikit learn
tensorflow
keras?
Помогите разобраться. Только начал изучать python 2.7, изучаю классы и хочу сделать связный список. На первом пике образец с сайта, на втором то что у меня. В чём проблема?
Тензерфлоу и прочие керасы - это уже прошлый век. Сейчас в основном используют градиентный бустинг или опорные вектора для распознавания изображений.
1. Учи пистон 3
2, Покажи/дай полную ссылку на пример.
>>43392
Скит-лерн это больше для обучения и вката, серьёзную нейронку не построишь на ней(на сколько я знаю).
Остальные два пункта подходят для твоих целей.
>>43318
По каналам ничего не подскажу. Так их и не начал учить, хах.
По Celery обычно хватает доков. Я начинал с простого запуска тасок и мониторинга их. И только после этого привязку к джанге делал. И тебе советую, абстрагироваться от джанги и тыкать просто в Celery.
Все работает. Но меня смущает эта ошибка. Нагуглить что-то внятное не могу.
Кто знает, что это такое?
Я начал учить питон году в 2009-10, сразу с третьего. Потом правда пришлось перекатываться на второй, такой на работе был, но там питон не основной был, и вообще очень долго сообщество перекатывалось.
Это было 10 лет назад. Но в 2019 писать на втором питоне? Ну как бы очень плохая идея. Учи третий и забудь второй как страшный сон. В третьем масса технологий, которые принципиально отсутствуют. Перекат на 3 питон уже окончательно произошёл.
1) не используй next для имён самостоятельных переменных. Это зарезервированное слово, встроенная функция питона.
2) не очень понятно, что ты пытаешься сделать. Когда ты пишешь list(node1), ты пытаешься создать список, но для этого объект должен быть итерируемым. Ты можешь реализовать свой итератор, но несколько сложнее, надо реализовывать методы __iter__, __next__. Отложи это пока.
В примере слева не делают итератор с точки зрения питона, там демонстрация именно связанного списка как алгоритмической структуры. Ты должен передать свой node1 в эту функцию print_list, и по идее, она напечатает то, что ты хочешь.
Про Channels не скажу, не осваивал, по описанию в документации и по тому, как комментируют, не нравятся. Нет ощущения полноценной интеграции с джанго.
>>43318
>Я до этого ни с асинхронщиной, ни с сокетами не работал.
Вот лучше с этими технологиями разобраться независимо, понять, как это работает. Они просты и очевидны, когда их нормально поймёшь, но сложны, пока начинаешь. Асинхронность заметно сложнее, особенно если раньше с подобными технологиями не работал. Но реально лучше с простейших консольных программ начать.
Ничего не понимаю в channels, но поведение примерно ожидаемое. У тебя ведь один общий обработчик для трёх видов путей. Если в пути не было device_name, то и в обработчике его не будет, может где-нибудь возникнуть ошибка обработки и исключение из-за обращения к неопределённому элементу словаря и т.п.
Может я не прав, так как не изучал channels и не понимаю, как они работают.
Сижу над задачей час, посмотрел решение, оно там в одну строчку.
Как? Можно ли как то повысить уровень знания построения алгоритмов?
У тебя функция печатает сам объект, это некоторая структура. Ты должен печатать не print(node), a print(node.login)
Сложилось ощущение, что это все не про программирование вообще, а про программировании на джаве какой-то. Думаю теперь, надо ли мне для профессионального роста в это погружаться или лучше про кубернетисы почитать.
Точно. Спасибо большое
Более чем достаточно. Я б даже посоветовал Atom или VSCode, они легче и лучше подходят для простых вещей
Здесь и алгоритма как такового серьёзного нет - просто выводится зависимость искомой длины шнурка от a, b, l и N согласно условию задачи.
Зеленому и бесплатная оверхед
Нахуя тебе пичарм, если ты вкатывальщик зеленый? Просто нахуя, vscode подойдет, да даже блокнот обычный да даже вим, но для тебя ето геморрой будет.
Аноны, такая проблема, может кто сталкивался: поставил линукс, пайчарм, сначала вроде норм работало, но после перезапуска открываю её, открывается автоматом проект, делает update skeletons /usr/bin/python3. 7 или как-то так, и где-то на пятой части этого апдейта система зависает намертво.
Причём это точно не память кончается, я отслеживаю её.
Я понял, что как только что-то взаимодействует напрямую с системным интерпретатором то всё сразу же ложится нахуй. С интерпретатором venv всё работает хорошо(вроде). Как это пофиксить? На винде делал всё через системный
Задача кропать изображение по границе объекта.
Объект не явный, классифицировать сложно, но размер его +- один и тот же поэтому по сути нужна только левая верхняя точка. Какие есть способы его определить?
Завтра ищешь в интернете книжку Dive into python. Похуй если ничего не поймешь. Затем идешь на python.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию питоньего кода - PEP8, чтобы от зубов отскакивало. Когда напишешь свою первую имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой питоний асинхронный вебсервер, рекомендую Tornado или Gevent. Как переделаешь имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь идти дальше - тебя ждет увлекательный мир хайлоада. Apache Hadoop, сверхбыстрые асинхронные key-value хранилища, MapReduce. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь получать такие суммы, что любая баба будет течь при одном упоминании твоей зарплаты.
2011 или старше
На связи инженер-программист с опытом в ~5 лет.
Был и есть макакой на JS, PHP, NodeJS. Хочу стать настоящим макакой на python.
Как считаете, сложно будет перейти? Может кто-то испытывал такой опыт? Концепции-то похожи будут? В какую сторону копать и что изучать лучше?
Ищу кого-нибудь для общения вокруг программирования и матана, обмена ссылками и книгами, а так же для парного программирования.
Мои языки C, Python. Считаю что программист из меня так себе.
Сферы интересов: Теория игр, теория принятия решений, Управление и оптимизация, многокритериальное принятие решений, Марковские модели, конечные автоматы, теория графов, теория вероятностей, статистические методы, имитационное моделирование, ии и коллективное поведение и проч.
Аноны, подскажите раку. Вроде как смог создать связный список из объектов класса с одним аргументом, но как сделать 2 и более аргументов? На первых двух пиках для одного аргумента. На третьем попытка сделать для двух.
Почитай ОП пост, а вообще я б советовал пройти базовый курс на Курсере или Питонтьюторе и дальше решать задачки
У тебя ошибки в 16 и 19 строках.
Что там запятая значит? Ты явно хотел что-то другое, но для питона запятая это способ записи типа данных tuple.
Вообще, вывод лучше иначе форматировать, специальными средствами.
Или как
out = "[%s, %s " % (current.login, current.password)
или
out = "[{}{} ".format(current.login, current.password),
или
f"[{current.login}, {current.password}"
последний только для питона 3.6 и новее.
Можешь передавать словарь из аргументов в конструктор списка, или через args. В операторе __str__, можно сделать вывод через генератор. хз не стал доделывать
Не, формат не подойдет, а если он захочет добавить поле для вывода ? Придется менять формат.
Точно. Дело в запятой было, спасибо
Хорошо, попробую и так сделать. Спасибо
Я бы вообще строки 14-19 переписал иначе. Тут дублирование сплошное, можно всё тоже самое проще записать
out = []
current = self.first
while current != None:
out.append("{}{}".format(current.login, current.password))
current = current.next
return "[{}]".format(" ".join(out))
p = 'Protos'
t = 'Terrain'
x = True
while x:
selected_character = input()
if selected_character == p:
print('prosdoasodosaod')
x = False
elif selected_character == z:
print('asdasdasdasd')
x = False
elif selected_character == t:
print('sadsdasdasd')
x = False
else:
print('trya gagimn')
print(selected_character)
Я УЧУ ПИТОН УЖЕ 2 ЧАСА! ДА Я ДУРАЧОК!. ВООТ ВОПРОСИК!
Я ХОЧУ ЧТОБЫ ЕСЛИ ОТВЕТ НЕ БУДЕТ ТАКОЙ КАК В ЭТИХ ПЕРЕМЕНЫХ МЕНЯ ЦИКЛ ВОЗРАЩАЛ К ИНПУТУ! КАК В ИГРЕ УГАДАЙ ЧИСЛО !
https://repl.it/repls/RuralPoshLava
ВОТ ФОРМАТИРОВАНЫЙ КОД ЧТОБЫ ВАМ ЛОХАМ БЫЛО УДОБНО ЧИТАТЬ!
СПАСИБО ЗАРАНИЕ !! ВЫ НЕ ЛОХИ Я ЛОХ!
Как влияет на скорость рост размера?
Есть база, общая для всех. Есть конкретные направления, они часто про технологии в целом, чем про питон. Уже зависит от того, что конкретно тебе надо.
multipleList = [value*3 for value in range(3,31,3)]
print(multipleList)
Да мне бы прочитать примитивным языком про разные модулю и про правильность организации программы. Вообще конечно все в доках можно прочиттать
base.html
url второй скрин
Помогите... уже менял абсолютный url в href, все равно вместо url на основе slug - выбивает эту ошибку
код из учебника
Вроде нужны кратные трём в промежутке от 3 до 30. Убери множитель у value.
Есть ещё книга Fuent Python (наши дубляторы-надмозги перевели как "Python. К вершинам мастерства"), она покрывает язык практически полностью, но для начинающего не подойдет. Единственное, насколько я помню, там используется старый синтаксис для корутин, поэтому глава про асинхронность немного устарела. По этой теме можешь посмотреть https://www.youtube.com/playlist?list=PLlWXhlUMyooawilqK4lPXRvxtbYiw34S8 и доклады David Beazly.
Пасибо =). Вообще пошел бы лучше на курсы какие нить чтобы на вопросы с которыми сталкиваюсь мог бы ответить кто-то... но это все херня нет доверия курсам
Вообще да, обратная связь - самая важная вещь в обучении, поэтому самоучкам очень сложно добиться хорошого результата. Ну а большниство очных курсов - наебалово, как ты правильно заметил, ну либо они стоят слишком дорого для вкатывальщика. Чтобы компенсировать этот недостаток, можно гуглить любую фигню которая тебе кажется странной (желательно на английском), даже если у тебя всё работает, то посмотри, как это сделано у других, можно просто искать в гитхабе по ключевым словам и смотреть исходники.
Там всё написано в сообщение об ошибке.
У тебя шаблон url требует поле slug, которое не пустое. А ты, судя по ошибке, пытаешься построить этот url с пустым параметром, который обязательный.
Всё зависит исключительно от тебя. Кто так вопросы задаёт? Несколько месяцев надо.
Начни просто с питона, поймёшь, насколько интересный для тебя язык и как заходит.
Джанго больше для CRUD. Неприятный момент в том, что он синхронный, некоторые тривиальные для ноды вещи сделать на джанго будет или сложно, или почти невозможно, это может быть неприятно. Правда есть другие фреймворки.
Короче, начни просто с питона. Если зайдёт, то и остальное освоишь. А пока питон не освоишь, во фреймворки лучше не лезть.
+ за Dive into python
channels
Сначала проходишь Django Polls - Пример из официальной документации.
Потом качаешь книжку Leightweight Django, читаешь только Главы 1-4. Делаешь все задания. Параллельно учишься работать с гитом (скачай сазу GitKraken и не ебись с консолью как вонючий бумер) Пример из книги разрастается от простого к сложному, по сути, в конце параграфа у тебя получается рабочий проект но с некоторыми фичами.
Тут ты должен понять что 1) Фуллстек это путь в никуда 2) Можно учить сразу Рест АПИ фреймворк.
Потом Идешь на в документацию джанги, читаешь про
Модели
Кверисеты
Потом на всякий случай проходишь туториал рест фреймворка https://www.django-rest-framework.org/
Теперь можешь начинать писать свою имиджборду. Да, она будет без фронтенда ну и хуй с ним.
Параллельно прочитай про pytest и сделай интеграционные тесты для своей борды (запостить сообщение/попытаться открыть удаленный тред/проверь что тред не апается когда он в бамплимите и т.д.).
> (скачай сазу GitKraken и не ебись с консолью как вонючий бумер)
А чего там ебаться? git pull git commit git push
> Фуллстек это путь в никуда
Почему?
>А чего там ебаться? git pull git commit git push
Только если ты будешь комитить всё и сразу в одном комите.
К гит-клиентах с GUi есть удобная функция для того что бы комитить конкретные строки, откатывать изменения наглядно и т.д.
Но консольные команды знать надо, офк, иначе есть возможно обосраться на собесе и на сервере.
Ты недооцениваешь мою ебанутость, и нелепость составления формулировок ^)
>>44130
Не понимаю как это на гите искать, ну а если есть что-то похожее готовое то смысл разбираться отпадает, ведь можно копипастить
Сталкиваюсь с проблемами типа не понимания как работает модуль schedule, или же thread. Потом оказалось что ониработают как надо но программа просто не работает дальше hendler от telegram-bot-api.
Хотя знаете, это на самом деле лень, просто человеческая лень. Когда у тебя есть документация и ты можешь все прочитать и понять, но предпочитаешь ныть, что вот если бы был наставник было бы так здорово. Хотя лопатить всю доку это же пиздец
Я понимаю, что словарь - неупорядоченная структура, но почему, к примеру, в {i: i for i in range(5)} элементы выстроены нужным образом, то есть в соответствии со значениями i?
мимонуб
Можно, но очень коряво, неочевидно и ограничено. Это решения (как channels) для историй, когда у тебя уже есть проект на джанго, и тебе надо что-то асинхронное вдруг прикрутить, но не для того, чтобы строить на этом асинхронный проект.
После ноды это будет смотреться уныло и убого. Есть другие фреймворки, но в них меньше плюшек, которые есть в джанго.
Этап 1:
Из официальной документации по джанго, очень желательно на английском, смотришь главу "Writing your first Django app"
https://docs.djangoproject.com/en/2.2/intro/
Там разбирается пример учебного приложения, шаг за шагом, и на этом примере весь ключевой функционал джанго демонстрируется, ты сам потрогаешь.
Потом можно разбирать более детально отдельные части. Я бы рекомендовал сначала разобраться с обработкой url, как они вызываются (это просто, но тут надо смотреть на вторую версию джанго, а не на 1.9), потом со View и немного с шаблонами (шаблоны крайне желательно подключить jinja2 и с ними работать), потом с моделями, как делать разные запросы. Про всё есть как обзорная документация, так и детализированная.
Порядок ключей гарантированно соответствует порядку добавления только в питоне начиная с 3,6 (мб 3,7 точно не помню), во втором этого вообще нет.
>Когда у тебя есть документация и ты можешь все прочитать и понять, но предпочитаешь ныть, что вот если бы был наставник было бы так здорово.
Грамотный наставник очень нужен и полезен, но где его взять? Как важны хорошие выстроенные систематизированные курсы, это не документация, но где их найти? Большинство коммерческих курсов про то, чтобы состричь денег со случайных вкатывальщиков. Нормальный будет стоить дорого и слушателей для него не найдёшь. Но зато если продерёшься через всё это, то будешь среди немногих, кто смог.
> только в питоне начиная с 3,6 (мб 3,7 точно не помню)
Вроде как с 3,8? По крайней мере читал недавно особенности 3,8 и там это было в списке.
Мимодругойанон
Ну ты накодил своё решение, тебе кажется, что оно косячное, ищешь , как данную проблему решили другие люди и заимствуешь лучшие приемы. Да на самом деле иногда лучше скопипастить удачное решение, чем городить свой велосипед, главное разобраться в этом решении и вынести из него что-нибудь для себя.
Если не понимаешь как работают треды и подобные вещи, то тебе нужно почитать что-нибудь по операционным системам, например таненбаума.
Сомневаюсь, что наставник знает документацию любой либы наизусть. Наставник может проводить код-ревью, указывать на косяки связанный с чистым питоном ну или с очень популярными либами типа Django, Flask и т.д., его главная задача - это прояснение каких-то относительно общих вопросов и указывание на твои слабые места
https://mail.python.org/pipermail/python-dev/2016-September/146327.html
С 3.6 в CPython словарь упорядочен в порядке добавления, в других реализациях Python это не гарантируется. С версии 3.7 это уже фича языка, то есть все реализации языка должны гарантировать упорядочность словаря.
>А ты, судя по ошибке, пытаешься построить этот url с пустым параметром, который обязательный.
Так в том и дело, я нехрена не понимаю как оно может быть пустым, если оно НЕПУСТОЕ, а конфигурируется исходя из читаемого url-slug при создании поста.
А тут эта хня еще вызывает ошибку даже без перехода к посту, а при переходе к самому приложению "blog", а точнее при вызове базового хтмл
я не понимат
>Сомневаюсь, что наставник знает документацию любой либы наизусть.
А зачем знать наизусть? Если ты понимаешь, как устроено и как работает, то или сразу сможешь объяснить, что не так, или быстро сможешь ответ найти в документации.
Тяжело осваивать что-то самому, вот у тебя возникает вопрос, ты не понимаешь, зачем что-то нужно и как работает, а спросить не у кого. Ты можешь делать тупую ошибку, сам того не понимая, а указать тебе её некому. Идеи и принципы объяснить некому.
Но правда на работе редко кто-то готов быть наставником. Чаще все сами по себе. В универах в этом плане проще.
Видимо ты вызываешь неправильно, не передаёшь нужный параметр, как надо. При создании поста, когда ты тэг url вызываешь, ты явно должен указывать и параметры, чуть по-разному в стандартном джанго и jinja2. Значит, ты как-то намудрил с этим параметром, только и всего.
Попробуй вместо '' в первом url поставить '/'
или другой вариант, вызвать в браузере не
localhost:8000/blog/
а
localhost:8000/blog
то есть без закрывающего слеша
ладно, спасибо.
Буду искать.
второй день мучаюсь, если возникает нетривиальная ошибка, просто выпадаю в прострацию и уныние, сложно бороться
мне книга нравится. она очень хорошая. но спасибо, после неё попробую обязательно
Что лучше подойдет для вката?
Какое мнение в целом по курсу Python for Everybody Specialization? Стоит ли платить за него чтобы проверки работ были?
>>44563
ситуация становится охуительной
Я уже нашел на гитхабе код автора
Весь перебрал
В итоге на мозг капнуло "а вдруг эта херня как то не так обрабатывает теги"
Зашел в админ панель и удалил последние 2 поста помеченные тегами
И ОН БЛЯТЬ ЗАРАБОТАЛ
И Я В УПОР НЕ ПОНИМАЮ ПОЧЕМУ И ПРИЧЕМ ТУТ base.html, и как эти посты в detail.html влияют на основную страницу
Короче все решилось. но НИПАНЯТНА почему
Сижу посмеиваюсь... 2 дня... тонны гугла и всё коту под хвост. Походу фреймворк пользовательские теги шаблонов неправильно рендерит по какой то причине
"Я решил проблему, но как и почему я не знаю, но я её решил, потому что она не вылезает" потрясающе.
Ты про Financial aid? Я, кстати, так и не понял до конца, что это за хуитка такая. Чем отличается от обычной оплаты курса?
А про сам курс (специализацию в целом, там вроде сразу пять курсов идёт) что думаешь? Стоит того или лучше по книжкам учить?
Насколько корректно использование eval и exec в коде? Заметил, что это "не по понятиям", хоть кто-то из разрабов со стажем их юзает? И при каких обстоятельствах?
Если git add . то конечно можешь все сразу. Команд там 20 или около того. Да и это куда быстрее и привычнее, когда все в одном окне делаешь(в терминале офк). Раньше я тоже гуями пользовался. Да и сейчас иногда, если это удобнее быстрее. Но обычно консоль выигрывает. Не слишком красиво, зато быстро и удобно.
Забыл добавить, что фин. помощь на всю специализацию сразу оформить нельзя, нужно оформлять на каждый курс.
Бегло посмотрел программу курсов, если честно, то не очень. На мой взгляд слишком долго, по программе курса ты к ООП перейдешь только на 4 курсе, т.е. на 21 неделе, т.е. через 5 месяцев. Конечно, ты скорее всего будешь проходить эту специализацию быстрее, но всё равно. К тому же язык в данной специализации разбирается довольно поверхностно, если судить по программе, то даже если ты пройдешь всю специализацию полностью, то твоих знаний будет недостаточно, чтобы претендовать на вакансию джуна (при этом я беру в расчёт только знание языка, джуну ещё фреймворки нужно знать). Задания не смотрел, судя по названиям довольно прикладные, что хорошо, но не уверен.
С другой стороны пролистал Learning Python Лутца и тоже немного удивился. По содержанию претензий нет, если изучишь данную книгу, то будешь довольно уверено себя чуствовать с питоном, знаний языка будет достаточно для джуна, единственное в книге не затрагивается асинхронность (хотя от джунов редко требуют) и стандартные библиотеки Python. К тому же в конце каждой главы есть набор вопросов и упражнений с решениями, что тоже положительно скажется на качестве твоего обучения, только задания не очень прикладные, поэтому если будешь изучать Python по книге, то советую иногда делать какие-нибудь мини-проекты. Но в книге 1200 страниц, что на мой взгляд довольно много, видимо автор достаточно водянисто пишет, но с другой стороны для новичка это может быть даже полезно. Советую заранее расчитать скорость изучения языка по этой книге и сколько это у тебя займет времени в итоге.
В общем, если выбирать из этих двух вариантов, то я бы посоветовал Лутца, но ты не рассказал о своих текущих навыках и целях и к какой цели ты стремишься
Спасибо огромное за ответ!
Питон для прикладных задач нужен. На голого прогера-джуна не претендую староват уже для такого
Я инженер-конструктор, и есть желание покопаться в сторону машинного обучения, датамайнинга и нейронок. Плюс, скрипты для автоматизации работы в CAD'ах, инженерные расчёты и так в целом для комфортной жизни.
В своё время учил Delphi и немного C++, ооп, даже немного до ассемблера добрался, но все это было в далекие студенческие беззаботные годы.
Если с нуля, то надо просто нарабатывать себе умение программировать, это времени требует, и прилично. Я не видел ещё ни разу, чтобы совсем с нуля за несколько месяцев научились писать какие-то мало-мальски содержательные задачи.
Питон очень хороший язык для вката, на нём быстрее можно научиться и понять, что такое программирование. Но всё равно времени требует.
Если с нуля, то надо прочитать просто самые основы языка, и начать решать разные задачи, примерно как на литкоде простые.
Много решать. Самому думать, как эти задачи модифицировать и решить. Когда станет более-менее легко, тогда значит, что ты уже готов к программированию и можно осваивать платформу более-менее серьёзно. Нельзя пропустить этот базовый этап.
Вот если уже практика программирования есть, то другое дело. Но это надо смотреть на то, какой опыт и что умеешь.
>В своё время учил Delphi и немного C++, ооп, даже немного до ассемблера добрался
Это совсем не начальный уровень и тут уже будет сильно проще.
Ну, да. Какие-то знания есть, даже Кнута в своё время читал.
Но после студенческих увлечений ушел сильно в инженерную работу, и совсем программирование на десять лет забросил, а это считай вечность.
Так что я тут как полуновичок наверное.
Тогда даже не знаю, возможно специализация для тебя более предпочтительна будет. Для решения прикладных задач и ML тех знаний будет более чем достаточно, плюс там задания и проекты относятся к этой теме.
Книга Лутца больше подходит для серьёзного изучения, а если не планируешь вкатываться в программирование, то лучше пожалей время, дата саентистам нужно больше делать упор на сторонние библиотеки, чем на чистый язык. Поэтому Лутц для тебя будет оверхед.
Ещё по теме автоматизации слышал хорошие отзывы о книге Automate the boring with python, возможно тоже будет неплохим вариантом для тебя.
О, коллега, тоже работал конструктором на заводе, сейчас тружусь технологом на станке с ЧПУ в мелкой конторе. На досуге и в свободное рабочее время стараюсь всякие расчеты автоматизировать сначала в Экселе для понимания логики, а потом в пайтоне. Сложно, конечно, все осмыслить, но стараюсь.
Как не странно тебе нужно научится, учится. Как анон уже писал выше, приготовь свое рабочее место, убери со стола и поставь таймер. Например, поставил таймер и блять не перестаешь учить, пока время не пройдет. ТЫ НЕ ДОЛЖЕН чувствовать себя как дома, будто ты на паре или на работе. НЕ ОТКЛИКАЙСЯ на всякие там вкшечки и инстаграмы.
Я тоже не могу заставить себя читать больше 20 страниц в день "Изучаем Python" Лутца. Одна первая глава чего стоит: автор 20 страниц повторяет несколько идей. Начиная с 3-ей главы не так абсурдно, но читать все равно сложно.
Есть ли чтиво, которое читается легче/увлекательнее?
ну я литературу на английском всю читаю. на русском может быть тоже 20 страниц в день бы было.
>>44809
да это хуйня всё, я не отвлекаюсь. могу спокойно сидеть больше часа без перерыва читать книгу. меня просто плющить начинает если я ИЗУЧИЛ сегодня более 4-х страниц в день. мозг болит что ли, хуй знает как это объяснить. тяжело в себя новой информации много запихивать, во истину самый тяжкий труд это учение!
261
262
...
269
270
....
300
Как сделать дополнительную функцию для замены этих результатов в упрощенный вид, 260-269 - представлять как 1, 270-270 - 2 итд.
def normalise(number):
____if number == 260:
________return 1
____if number == 261:
________return 1
____if number == 262:
________return 1
____if number == 263:
________return 1
____if number == 264:
________return 1
____if number == 265:
________return 1
____if number == 266:
________return 1
____if number == 267:
________return 1
____if number == 268:
________return 1
____if number == 269:
________return 1
____if number == 270:
________return 2
____if number == 271:
________return 1
____if number == 272:
________return 1
____if number == 273:
________return 1
____if number == 274:
________return 1
____if number == 275:
________return 1
____if number == 276:
________return 1
____if number == 277:
________return 1
____if number == 278:
________return 1
____if number == 279:
________return 1
____if number == 280:
________return 1
____if number == 281:
________return 1
____if number == 282:
________return 1
____if number == 283:
________return 1
____if number == 284:
________return 1
____if number == 285:
________return 1
____if number == 286:
________return 1
____if number == 287:
________return 1
____if number == 288:
________return 1
____if number == 289:
________return 1
____if number == 290:
________return 1
____if number == 291:
________return 1
____if number == 292:
________return 1
____if number == 293:
________return 1
____if number == 294:
________return 1
____if number == 295:
________return 1
____if number == 296:
________return 1
____if number == 297:
________return 1
____if number == 298:
________return 1
____if number == 299:
________return 1
____if number == 300:
________return 1
____if number == 301:
________return 1
____if number == 302:
________return 1
____if number == 303:
________return 1
____if number == 304:
________return 1
____if number == 305:
________return 1
____if number == 306:
________return 1
____if number == 307:
________return 1
____if number == 308:
________return 1
____if number == 309:
________return 1
____if number == 310:
________return 1
____if number == 311:
________return 1
____if number == 312:
________return 1
____if number == 313:
________return 1
____if number == 314:
________return 1
____if number == 315:
________return 1
____if number == 316:
________return 1
____if number == 317:
________return 1
____if number == 318:
________return 1
____if number == 319:
________return 1
____if number == 320:
________return 1
____if number == 321:
________return 1
____if number == 322:
________return 1
____if number == 323:
________return 1
____if number == 324:
________return 1
____if number == 325:
________return 1
____if number == 326:
________return 1
____if number == 327:
________return 1
____if number == 328:
________return 1
____if number == 329:
________return 1
____if number == 330:
________return 1
____if number == 331:
________return 1
____if number == 332:
________return 1
____if number == 333:
________return 1
____if number == 334:
________return 1
____if number == 335:
________return 1
____if number == 336:
________return 1
____if number == 337:
________return 1
____if number == 338:
________return 1
____if number == 339:
________return 1
____if number == 340:
________return 1
____if number == 341:
________return 1
____if number == 342:
________return 1
____if number == 343:
________return 1
____if number == 344:
________return 1
____if number == 345:
________return 1
____if number == 346:
________return 1
____if number == 347:
________return 1
____if number == 348:
________return 1
____if number == 349:
________return 1
____if number == 350:
________return 1
____if number == 351:
________return 1
____if number == 352:
________return 1
____if number == 353:
________return 1
____if number == 354:
________return 1
____if number == 355:
________return 1
____if number == 356:
________return 1
____if number == 357:
________return 1
____if number == 358:
________return 1
____if number == 359:
________return 1
____if number == 360:
________return 1
____if number == 361:
________return 1
____if number == 362:
________return 1
____if number == 363:
________return 1
____if number == 364:
________return 1
____if number == 365:
________return 1
____if number == 366:
________return 1
____if number == 367:
________return 1
____if number == 368:
________return 1
____if number == 369:
________return 1
____if number == 370:
________return 1
def normalise(number):
____if number == 260:
________return 1
____if number == 261:
________return 1
____if number == 262:
________return 1
____if number == 263:
________return 1
____if number == 264:
________return 1
____if number == 265:
________return 1
____if number == 266:
________return 1
____if number == 267:
________return 1
____if number == 268:
________return 1
____if number == 269:
________return 1
____if number == 270:
________return 2
____if number == 271:
________return 1
____if number == 272:
________return 1
____if number == 273:
________return 1
____if number == 274:
________return 1
____if number == 275:
________return 1
____if number == 276:
________return 1
____if number == 277:
________return 1
____if number == 278:
________return 1
____if number == 279:
________return 1
____if number == 280:
________return 1
____if number == 281:
________return 1
____if number == 282:
________return 1
____if number == 283:
________return 1
____if number == 284:
________return 1
____if number == 285:
________return 1
____if number == 286:
________return 1
____if number == 287:
________return 1
____if number == 288:
________return 1
____if number == 289:
________return 1
____if number == 290:
________return 1
____if number == 291:
________return 1
____if number == 292:
________return 1
____if number == 293:
________return 1
____if number == 294:
________return 1
____if number == 295:
________return 1
____if number == 296:
________return 1
____if number == 297:
________return 1
____if number == 298:
________return 1
____if number == 299:
________return 1
____if number == 300:
________return 1
____if number == 301:
________return 1
____if number == 302:
________return 1
____if number == 303:
________return 1
____if number == 304:
________return 1
____if number == 305:
________return 1
____if number == 306:
________return 1
____if number == 307:
________return 1
____if number == 308:
________return 1
____if number == 309:
________return 1
____if number == 310:
________return 1
____if number == 311:
________return 1
____if number == 312:
________return 1
____if number == 313:
________return 1
____if number == 314:
________return 1
____if number == 315:
________return 1
____if number == 316:
________return 1
____if number == 317:
________return 1
____if number == 318:
________return 1
____if number == 319:
________return 1
____if number == 320:
________return 1
____if number == 321:
________return 1
____if number == 322:
________return 1
____if number == 323:
________return 1
____if number == 324:
________return 1
____if number == 325:
________return 1
____if number == 326:
________return 1
____if number == 327:
________return 1
____if number == 328:
________return 1
____if number == 329:
________return 1
____if number == 330:
________return 1
____if number == 331:
________return 1
____if number == 332:
________return 1
____if number == 333:
________return 1
____if number == 334:
________return 1
____if number == 335:
________return 1
____if number == 336:
________return 1
____if number == 337:
________return 1
____if number == 338:
________return 1
____if number == 339:
________return 1
____if number == 340:
________return 1
____if number == 341:
________return 1
____if number == 342:
________return 1
____if number == 343:
________return 1
____if number == 344:
________return 1
____if number == 345:
________return 1
____if number == 346:
________return 1
____if number == 347:
________return 1
____if number == 348:
________return 1
____if number == 349:
________return 1
____if number == 350:
________return 1
____if number == 351:
________return 1
____if number == 352:
________return 1
____if number == 353:
________return 1
____if number == 354:
________return 1
____if number == 355:
________return 1
____if number == 356:
________return 1
____if number == 357:
________return 1
____if number == 358:
________return 1
____if number == 359:
________return 1
____if number == 360:
________return 1
____if number == 361:
________return 1
____if number == 362:
________return 1
____if number == 363:
________return 1
____if number == 364:
________return 1
____if number == 365:
________return 1
____if number == 366:
________return 1
____if number == 367:
________return 1
____if number == 368:
________return 1
____if number == 369:
________return 1
____if number == 370:
________return 1
Спасибо, но нет ли способа покороче? А то у меня же не только эти значения, а значительно больше.
Как-то массивы наверное можно сделать без перечесления, а с указанием диапазона и проверять есть ли число в массиве если есть присваивать новое значение.
Это троллинг такой? Твоя функция даже не работает нужным образом, а просто возвращает единицу при 260 <= number <= 370.
Или это норм для фри хостинга и лучше вариантов нет?
Да не он прав, в оппосте опечатка очевидно же 270-279 должно быть
Я не только в глаза не долблюсь, но и в лобные доли, потому и понимаю, что он просто опечатался и имел в виду 270-279.
Ну руками поменял бы, когда вставлял. Нет проблем
Тебе тоже спасибо огромное. Я запомню что можно и так делать, но тот вариант мне подходит больше т.к. я не упомянул в тз, что диапазоны не всегда из 10 чисел и могут быть с пропусками.
А есть какие-нибудь сайты с такими простыми задачками, желательно с возможностью посмотреть ответы и варианты решений?
checkio.org
А, ну да, я опечатался
Это язык шаблонов, в разных веб-фреймворках они разные, у джанго свой, у фласка например jinja2.
Да кажется сложным, на деле учится за вечер.
https://docs.djangoproject.com/en/2.2/ref/templates/language/
https://djbook.ru/rel1.4/topics/templates.html
сука ты тупая :3
Да вы троллите по-моему просто, тут у вас какое-то соревнование было по самому ебанутому решению простейшей задачи. Странно только, что его ещё первый челик с ифами выиграл, обогнать его было невозможно
Технически выиграл его ты, ибо даже его код иногда выдаёт нужные значения, в отличие от твоего с опечаткой.
Да только опечатка исправляется в один символ после получения неожиданного ответа(отрицательных чисел быть не должно было по постановке задачи), а у вас нужно переписывать полностью, потому что вместо выражения на два действия у вас алгоритм перебора с циклом на n//10 - 25 итераций
Алсо, если серьёзно, то я советую порисовать черепашкой несколько заданий из http://judge.mipt.ru/mipt_cs_on_python3/labs/lab1.html
Задание на спираль Архимеда, на вложенные многоугольники, и на н-конечную звезду. Они и интересные и не очень долгие и там нужно собирать математические выражения.
А то! Можно ещё модуль graphics скачать, там про это есть тоже следующих главах курса. Но для геометрических фигур хватает черепашки. Там потом ещё тема будет про рисование фракталов, на рекурсивные алгоритмы.
Не трогай что работает, лол.
Джанго шаблоны не сильно отличаются от других стандартных. Научишься на них - считай знаешь остальные.
Выучи базовые вещи: получение ссылки на статичные данные (картинки, скрипты), работа с переданными аргументами, циклы и условия, наследование шаблонов (самая ахуенная вещь).
Они похожие, но лучше jinja2, штатные немного корявые. У jinja2 больше возможностей и удобства при обращении к словарям и т.п. Jinja2 более универсальные, и на других фрейворках работают, и даже в другие языки портированы довольно близко. В целом для начала можно не заморачиваться, ключевые принципы одни, смотри просто, чьи доки тебе удобнее читать и понимать.
Самое крутое в шаблонах, это возможность наследования и макросы, вот там они по-настоящему разворачиваются.
Если не понимаешь, то начни с основ матана, иначе это бессмысленно. Например, на сайте для заочников и не только mathprofi или в школе/универе
Я уже разобрался, спасибо не надо. Просто не понимал что такое "приближение"
>>Теория игр, теория принятия решений, Управление и оптимизация, многокритериальное принятие решений, Марковские модели, конечные автоматы, теория графов, теория вероятностей, статистические методы, имитационное моделирование, ии и коллективное поведение и проч.
иными словами - мозг пытается составить обобщенную модель мозга с целью надежного и длительного выставления произвольных функций оптимизации. и чтоб внимание получше работало. в РЦП такими вещами очень интересуются вроде бы.
Привет брату инженеру! Расскажи что получилось автоматизировать на питоне? Удобно ли пользоваться? Заморачивался ли с интерфейсом?
Спасибо.
Буду глядеть специализацию тогда. Мне питон больше в прикладных задачах нужен, да.
> Automate the boring with python
Есть такая, да. Уже скачал, буду изучать. Спасибо еще раз.
Никакого. Это не программирование. Программирование это когда ты в доту играешь. Или в инсте фотки лайкаешь. А какие-то там вычисления, это не программирование.
Это основа.
Допустим, тебе надо будет нарисовать график по точкам, но не от руки, как в школе, а с интерполяцией сплайнами. Вот тут ты берешь матлаб питон и пишешь себе на будущее функцию, которая за пару минут тебе красиво все покажет и нарисует.
ЯП - исполнитель, а тебе нужно знать, что исполнять и как это написать
Спасибо, я ничего не понял. Но всё равно спасибо, пойду дальше тогда книжку читать
Потому что это вычматы, а не питон. Для глобального понимания, как решать задачу, и существуют алгоритмы, которые изучаются в отрыве от языка.
ну так там книга и есть эта. типа обучения основам погромирования общим на примере питона.
Вычмат о том, чтобы доказать сходимость решения, скорость сходимости и т.п. А программирование о том, чтобы реализовать это на практике.
Задача программиста в том, чтобы разобраться в проблеме и реализовать решение в виде программы. Всё сугубо утилитарно.
Вот разберись и реализуй.
Антоши, вот я тупой дебил и нихуя не умею. Хочу научится погромированмю. Решил выбрать пока питон, он вроде как самый лёгкий и неплохой такой. Вот скажите, не зашквар ли читать книгу "питон для детей" если я уже не дитё?
Спасибо тебе анон, сейчас пойду спать и завтра постараюсь начать читать эту книгу.
Братцы, на работе (режимное говнопредприятие) нет инета, а мне очень бы помогли пакеты Питона для работы с Excel и PDF форматами. Как их сцуко установить, если pip install не пашет? Я раздобыл исходники с Гитхаба, но как эти модули дальше установить, чтоб они работали?
Можно сделать через virtualenv, портируемый режим. Дома создаёшь всё, что тебе надо, ставишь все пакеты, которые нужны, приносишь куда надо, копируешь и запускаешь.
Съебусь только к октябрю. Сначала надо премию получить, сходить в отпуск и получить новые отпускные за полгода
>>45704
Наверно так и надо пробовать. Но я виртуалку еще не настраивал, тем более портируемую и для сторонней машины, годную инструкцию подкинуть не сможешь?
>>45706
? качаю куда? и можно ли указать этому менеджеру откуда устанавливать пакет? везде по pip лишь базовые сведения аля "щелкни сюда чтоб установить 5 разных фреймворков", но нигде толком не объясняют на низком уровне как собственно этот менеджер пакетов работает
Берешь флешку, на ней создаешь виртуалку, в которую уже ставишь все, что нужно.
На работе собсна кидаешь на эту флешку нужные файлы и работаешь с ними из под виртуалки.
Для настройки просто загугли virtualenv
Чому оно не работает? Вроде всё делал по тутору с сайта DRF, но выдаёт такую хуйню. УРЛ проёбан по полной.
Гугл выдаёт гайды от обоссаных индусов с кривым кодом.
resized_image = cv.resize(img_rgb , (0, 0), fx=5, fy=5)
cv.imwrite('xxx.png', resized_image)
im = cv.imread('xxx.png')
im[np.where((im == [0, 0, 0]).all(axis=2))] = [255, 255, 255]
Как работать с изображением без сохранения/чтения напрямую? Если resized_image добавить в последнюю строку будет ошибка AttributeError: 'bool' object has no attribute 'all'. Какой тип нужен? Я же вроде в сам начале в numpy.array перевел.
array = ["Bob", "Alex", "Bob", "John", "Bob", "Alex", "Bob"]
как вывести не повторяющиеся элементы и их количество, т.е.
bob - 4
alex - 2
john - 1
Есть заготовка проекта. В нём channels, celery, redis ещё и фронт на ноде с server side rendering. Вот хочу всё это ебануть в nginx + docker, но ума не приложу с чего начать.
Предполагаю, для начала надо запустить хотя бы сам проект через nginx без всяких докеров, а после успешной отладки уже пытаться всё упаковывать в контейнеры. Надеюсь на ваши советы.
лучше спроси как научиться задавать вопросы гуглу?
https://stackoverflow.com/questions/28663856/how-to-count-the-occurrence-of-certain-item-in-an-ndarray-in-python
ну а тривиальный способ это сделать лист с уникальными элементами и для каждого элемента листа получить count в исходном листе
С чего ты взял?
В питоне есть стандартный модуль collections, а в нем есть класс Counter, он делает сразу то, что тебе нужно
Не понятно, что тебе нужно конкретно. Но, наверно, тебе полезно будет почитать про генераторы в питоне, ну, там, yield, next, и все дела
pip умеет скачивать пакеты со всеми завизимостями, но не устанавливать их, а сохранить в указанной директории, которую ты можешь спокойно скопировать на флешку и перенести куда угодно, а еще pip умеет устанавливать пакеты не из интернета, а из локальных файлов и папок. Так что, можешь дома выкачать нужные пакеты вместе с их зависимостями, а потом принести их на работу и установить, и все с помощью pip. Вообще pip до хрена всего умеет, не поленись изучить его документацию, хотя бы ту, что он сам про себя в консоли показывает.
бамп
я ща проверил dtype, там до сохранения uint8 и после чтения uint8, но напрямую не рабоатет.
Анон, у тебя всё правильно, просто не стоит вводить p,z,t , а нужно вводить то, что записано в переменной, тобишь Zerg , Protos, Terrain.
>>45770
Дружище, кури регулярки и https://docs.djangoproject.com/en/2.2/topics/http/urls/
Я просто в ахуе, что ты такое еще спрашивать сдесь удумал.
Причём тут регулярки?
Если пикрил предлагается в офф доках ДРФа.
У меня подобная херня, только вместо "" мой роут начинается с "api/".
Или я чего-то не понимаю?
А, не так понял задачу.
Что нужно знать, чтобы етл на вашем яп писать?
Если вообще не знаешь язык, то можешь либо пройти курс Питонтьютора, либо прочитать "Укус питона", это основа(документация еще, конечно же)
Потом смотришь нужные тебе библиотеки и начинаешь что-то делать с их использованием.
Можно просто решать задачи на chekio/codingame/pythonchallenge
Можешь и его, для вкатывания нет разницы особой, так как это все же книга для +- углубленного изучения, а пятое издание еще не переведено, насколько я знаю
Хорошо, спасибо за ответ
>такое же реально сделать?
Реально. Недавно только щупал я бы сказал, касался даже апи ВК и там есть всё, что тебе надо. Дело 2-3 функций. Вот только нахуя оно? Сейчас каждый 2-ой, если не 1,5-ый, паблик имеет свой ТГ канал для сруба бабок с рекламы вдвое чаще обычного, так что какого-то большого импакта не вижу, разве что брать посты с групп непопулярных на 10-20к тел.
>>46628
Нахуя парсить страницы при живом апи? Всё равно, что тебе дадут мотоцикл, чтобы ты до дома доехал, а ты рот ебал чо-то с ним разбираться, ключ зажигания там какой-то ещё вставлять, и поедешь на своём раздолбанном велосипеде.
Как сказано выше, можно и парсить, но это себя не уважать. Апи дает как минимум опыт и удобство
благодарю. Да вот по наблюдениям не у каждой группы есть тг канал. А у меня то задумка в том, что можно будет совершенно любую группу сделать
Так вот, что мне нужно собственно. Есть ли какой-то сборник задач, вопросов и прочего, которые составлены по собеседованиям? Чтобы вот со всеми этими ебанутыми ситуациями в коде, со всеми доёбами до каждого атрибута в каком-то доисторическом классе и всё в этом духе. Очень прошу поделиться подобным, потому что заебало уже всё максимально. Или просто хоть напишите, как сами к собеседованию готовились, если вы работаете питон девом.
В МВП не отправляйте. Там никто не сидит и не шарит, к тому же вопрос именно касается сабжа, а не других ЯП.
Нахуй.
В функции:
https://pastebin.com/x0bdh59k
мне возвращает старое значение list_of_text, хотя в той же функции текст добавляется к списку, и list_of_text должен возвращаться уже с новой инфой.
ЧЯДНТ????
>Как вкатиться в работу?
Заходишь на hhru. Ищешь вакансии в своем городе. Если видишь что многим нужны технологии которых вообще не знаешь - учишь их. Жмешь ОТКЛИКНУТЬСЯ. Ждешь. Проходишь собес. Работаешь. Вопросы?
Как нуб могу предположить, что где-то по ходу кода возбуждается IndexError.
Так же, как нуб, я не очень понимаю, что делает указанная на скрине часть кода. Не нужен ли здесь return?
Или вообще можно ли сразу работать с текстом в буфере обмена? Мне нужно будет находить в нем знак и копировать несколько символов после этого знака.
Я не погромист, но раньше делал в офисе для теток и не только всякие утилитки для облегчения жизни на delphi.
Сейчас немного начал питон изучать. Думаю для набора опыта переписать некоторые из них.
>возбуждается IndexError
Да, так и есть. Но даже если тут и возникает какая-то ошибка, то должен возвращаться list_of_text, который выше был дополнен.
>Не нужен ли здесь return?
Нет. Потому что скрипт вызывает себя еще раз, что бы проделать еще одну операцию, пока определенные условия не будут соблюдены, либо пока не вызовется ошибка.
Норм всё, пили
Почему? Я сам внутренне это чувствую, но как ты это объясняешь?
понял. спс
А есть тут успешные джанго-разработчики? Как по вашему, что должен уметь/знать джун на эту позицию?
Я вроде как подтянул базовые знания, попробовал в редис, селери. Даже жс на уровне ajax запросов выучил.
Но на работу идти стремно, потому что кажется что я просто не смогу в энтерпрайз, я хуй знает какие там общепринятые практики и вот это вот всё.
Я в основном для работы проекты пилил, на своих костылях. Работало, да и хуй с ним. Но работу сейчас хочется поменять.
Нашел уже сам проблему, но появился другой вопрос: "Как остановить цикл, который СУКА НЕ ХОЧЕТ ОСТАНАВЛИВАТЬСЯ?"
Дело в том, что в функции я запускал саму же функцию, но, если так можно выразиться, 1 поток функции не хочет оканчиваться даже если поставить после вызова функции break
вопрос снят, я открыл доки api и понял, лол
Вопрос снят, просто сделал еще одну (другую) функцию
Си, кресты. Никто не пишет такое на жабе, тебе пиздят. Внутри твоей видеокамеры вообще ртос на сишке крутится почти наверняка.
я думал что на си ++ . на джаве наверное для современных больше пишут.
интересно на каком языке написано по на котором пикрил работает. пикрил 2000-го года выпуска.
крч мой план такой: Если будет много людей, то надо будет делать сортировку, типа 2-3 чела подписаны на "двач" и, чтобы бот понимал это и делал вызов только один раз, а отсылал троим. Это нужно, чтобы, если 1к пользователей на двач подпишутся, то бот каждый вызов не херачил для этой тысячи людей.
ну и снова возвращаясь к api vk или парсу. Парс все же надежнее, кто меня там заблочил, запросы бесконечные. А так это же пиздец, либо 100акков создавать, чтобы когда один терял доступ к апи система заходила под другим акком и обращалась к апи до тех пор, пока снова не блочнит, либо делать одного бота под конкретную группу, но это не устраивает меня. Я хочу, чтобы человек писал какие группы ему нужны, а бот сам все отправлял в виде новостей, вк тогда нахой не нужен будет.
Вот же блядь, я теперь через приложение вк не могу получить посты со стены групп, тк превысил число запросов, лол
В данный момент где-то на середине укуса питона. За что взяться после него?
Тут еще такое дело, я не могу понять кто я по складу ума - гуманитарь или техноблядок, с голой математикой у меня всегда был пиздец, зато хоть сколько-то имеющие прикладной аспект (химия, физика) понимались нормально. Ну и есесно всякая гуманитарная хуита с легкостью заходила. Прошу учесть это при совете.
Гуманитарий-хуянитарий. Тебе 14 лет, что ты такие вопросы задаешь? По твоему тут у каждого премия Тьюринга или что?
Как завещали старейшины сначала ты должен запилить свою борду. Можешь начать "Python. к вершинам мастерства". Она углубляется в разные аспекты питона и вполне актуальна, кроме разделов с asyncio
https://pastebin.com/UF6hPZVZ
Дело в том, что мне надо, что бы код просто вызвал другую функцию (ge2) в функции (ge), и ничего не возвращал. Как мне это сделать?
Вот тебе две ссылки - должно помочь в понимании асинхронки. Вторая это часть цикла.
http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html#fnref2
https://ruslanspivak.com/lsbaws-part1/
>return list
Убери ретурн тогда. Строго говоря в питоне функции всегда возвращают что-то. Если явно не указан ретурн, тогда возвращается None
Все сильно поменялось с тех времен. Концепция та же, но инструменты изменились
kite?
Спасибо, буду думать
https://pastebin.com/kmTCkz2X
Хочу понять принцип, а именно почему после итерации в подцикле с 9 по 11ую строчки интерпретатор улетает в самое начало цикла на первую строку, а не продолжает бегать по подциклу, а потом спускаться ниже и ниже. ЧТО НЕ ТАК С ОТСТУПАМИ БЛЯТЬ? простите
Что на вход подаешь и что пишет?
Что эта хуита вообще делает?
Если при входе в цикл x не a, b или c, то он так и будет бегать, потому что ты i не меняешь.
Если ты хочешь посчитать все вхождения каждого элемента из трех, сделай нормальный проход по коллекции:
for element in x:
...
а не байтоебский.
Что такое bot.polling и почему бы подставляешь вызов функции, а не саму функцию? Если ты вызываешь функцию, то в target будет записан результат вызова (предполагаяется что ещё какая-то функция, которую можно вызвать), и только потом стартует процесс
Вторая вообще не про асинхронку, там про низкоуровниевую работу с сокетами, что-то про HTTP, а потом они не к селектам идут, а к форкам.
Первая тяжеловеская и с устаревшим синтаксисом, там asyncio.coroutine / yield from. Ну может если через генераторы разбирать внутреннее устройство асинхронной работы и нормально, глубже понимание будет, но это тяжёлый путь и опыт хороший нужен в питоне. В том числе с теми же генераторами, с работой с select, и т.п., а это серьёзный уровень.
Обе ссылки объясняют простую вещь - высокопроизводительный веб-сервер реализуется на основе событий операционной системы. А первая объясняет что корутины в контексте asyncio это синтаксический сахар над callback-ами которые задаются таким событиям в качестве обработчиков.
Это функция, которая слушает команды юзера, которые он боту в чат кидает
> почему бы подставляешь вызов функции, а не саму функцию?
Блять, спасибо, что навёл меня на решение. Ты лучший
Какой у тебя там подцикл с 9 по 11 строчку? Если условие после if имеет значение True, то он просто выполнит две следующие строчки кода, а код, следующий после else, выполняться по очевидным мне причинам уже не будет.
Это тяжеловесно, ненаглядно, через это трудно продраться. И насколько я понимаю, в будущем от этого уйдут, внутренняя реализация может быть другой. Уже сейчас yield from и async не очень совместимы в одной функции.
Вообще, это сложная вещь, чтобы с этого начинать.
https://www.youtube.com/watch?v=MCs5OvhV9S4
Вот тут лекция на ютубе, на английском, где поясняется на примере вся история с асинхронности, причём и на примере потоков, и на примере генераторов. Намного более наглядная, чем этот текст.
Но генераторы-корутины ещё очень небольшая часть от asyncio. Там больше магии с разными сущностями (корутины, Future, Task, scheduler (планировщик), event loop, event loop policy), идеи плохо расписаны, что ключевое, что нет.
Я бы вообще советовал тем, кто на JS немного пишет, разобраться с асинхронностью там для начала. И с коллбэками, и с промисами, и с async/await. После этого понять питон будет проще. В питоне модель асинхронности сложнее, хотя сейчас её упрощают специально. В 3.7 уже можно просто писать, не погружаясь в технические детали. А в 3.5-3.6 уже сложнее, в 3.4 какой-то полный ад.
У меня есть 2 списка: files, language
Мне нужно внутри цикла (for element in files:) перебирать еще и список language
Как правильно написать это?
directory = '/Users/Desktop/pythom/upload/'
files = os.listdir(directory)
language = ['english', 'russian', 'spanish']
for element in files:
print(directory+element)
Ну внутри цикла и перебирай, сделай внутри цикла ещё один цикл но уже по второму списку.
Каким образом тебе его нужно перебирать? Что нужно делать с элементами списка language?
Первое, что приходит на ум с таким количеством данных:
for element in files:
____for lang in language:
________<какая-то операция>
____<какая-то операция>
Это хорошая база чтобы начать.
И да, это видео я в свое время тоже видел и оно мне ответов на мои вопросы не дало. Поэтому я скинул эти ссылки, а не это видео.
Ну и тогда уж можно было бы скинуть версию с переводом
https://www.youtube.com/watch?v=ys8lW8eQaJQ
Всё братишка, я тупанул, спасибо!
Да, спасибо, так и сделал. От души!
асемблер
Человек явно недавно вкатываться начал, а ты ему уже про PEP 8.
Код, если я не ошибаюсь, всего-навсего считает количество 'a', 'b' и 'c' в строке x.
Я получаю все docx файлы из директории:
files=glob.glob("/Users/gobsek/Desktop/pythom/bookstoupload/.docx")
Абсолютный путь пытаюсь заменить на относительный
print (os.path.dirname(os.path.abspath(__file__)))
Получаю /Users/gobsek/Desktop/pythom
Как мне совместить:
os.path.dirname(os.path.abspath(__file__)) + /bookstoupload/.docx
Чтобы на выходе получить, что glob ищет все файлы docx в папке bookstoupload по адресу os.path.dirname(os.path.abspath(__file__))
Вот так работает, но это костыль же, верно?
И я не понимаю каких-то совсем основ
path = os.path.dirname(os.path.abspath(__file__))
files=glob.glob(path+"/bookstoupload/*.docx")
А что тебе надо?
Это задача на нахождение символов a, b, c в строке. Строка вида "aaaabbbbcba"
Объясните пожалуйста неофиту, что есть
>нормальный проход по коллекции
и
байтоебский [проход по коллекции(?)]
>>47706
ДА! Моя хуйня оказывается читабильна. вкатываюсь чуть больше месяца хз где менторов искать, вот пришёл на двощ, ведь здесь все мои друзья
>>>1447613
Моя теория была такова:
- Сначала цикл бегает 2 и 4;
- Потом выполняется условие else, и начинается подцикл между 9 и 11;
- Потом работаетусловие else на строке 12, и идёт следущий подцикл
Но после выполнения первой итерации на подцикле 9 - 11 строки у меня интерпретатор уходит на первую строку. Не могу понять почему.
Вот в консоле мне пишет ошибку, всё заебись. Как это всё в файл направить?
Пока придумал только py мойскрипт.py > log.txt
Но это же костыль. Смотрю на модуль logging и нихуя не пойму, честно говоря.
Там написано сделать вот так и будет заебись
logging.basicConfig(
level=logging.INFO,
filename='app.log', filemode='a')
но нихуя не заебись, пустой файл имею
class Stand:
def __init__(self, name):
self.name=name
stand1=Stand('stand1')
stand2=Stand('stand2')
stand3=Stand('stand3')
stand4=Stand('stand4')
class File:
def __init__(self, name, stand):
self.name=name
self.stand=stand
file1=File('file1', stand1)
file2=File('file2', stand2)
file3=File('file3', stand3)
file4=File('file4', stand4)
class Request:
def __init__(self, name, file):
self.name=name
self.file=file
send = Request('send', [file1, file3])
resend = Request('resend', [file1, file2, file3, file4])
delete = Request('delete', [file4, file3])
На вход получаем атрибут name класса Stand и атрибут name класса Request. В результате я должен получить объект класса File, который соответствует заданным значениям. Как это правильно реализовать?
class Stand:
def __init__(self, name):
self.name=name
stand1=Stand('stand1')
stand2=Stand('stand2')
stand3=Stand('stand3')
stand4=Stand('stand4')
class File:
def __init__(self, name, stand):
self.name=name
self.stand=stand
file1=File('file1', stand1)
file2=File('file2', stand2)
file3=File('file3', stand3)
file4=File('file4', stand4)
class Request:
def __init__(self, name, file):
self.name=name
self.file=file
send = Request('send', [file1, file3])
resend = Request('resend', [file1, file2, file3, file4])
delete = Request('delete', [file4, file3])
На вход получаем атрибут name класса Stand и атрибут name класса Request. В результате я должен получить объект класса File, который соответствует заданным значениям. Как это правильно реализовать?
import os
import glob
import logging
path = os.path.dirname(os.path.abspath(__file__))
logging.basicConfig(
level=logging.DEBUG,
filename=path+'/app.log', filemode='a')
def main():
files=glob.glob(path+"/bookstoupload/*.docx")
language = ['english', 'russian', 'spanish']
print (files)
for element in files:
for lang in language:
print(element)
print(lang)
f = open(path+'/books.txt', 'a')
f.write(os.path.basename(element) + " " + lang + " "+ "DONE"'\n')
f.close()
os.remove(element)
f = open(path + '/books.txt', 'a')
f.write(os.path.basename(element) + " " + "REMOVED"'\n')
f.close()
main()
import os
import glob
import logging
path = os.path.dirname(os.path.abspath(__file__))
logging.basicConfig(
level=logging.DEBUG,
filename=path+'/app.log', filemode='a')
def main():
files=glob.glob(path+"/bookstoupload/*.docx")
language = ['english', 'russian', 'spanish']
print (files)
for element in files:
for lang in language:
print(element)
print(lang)
f = open(path+'/books.txt', 'a')
f.write(os.path.basename(element) + " " + lang + " "+ "DONE"'\n')
f.close()
os.remove(element)
f = open(path + '/books.txt', 'a')
f.write(os.path.basename(element) + " " + "REMOVED"'\n')
f.close()
main()
Ну вот смотри, у тебя в условии не сказано, что могут быть только символы a, b, c, сказано что надо учитывать регистр, то есть могут быть варианты AaaRtQppQbccccCcr и т.п.
Поэтому ты не может так явно сравнивать. Идея решения такая:
1) ты заводишь переменную "последний символ" и счётчик. Если текущий символ в последовательности такой же, как последний, увеличиваешь счётчик. Если же другой, выводишь "последний символ"+"счётчик", обновляешь переменную "последний символ", присваиваешь значение счётчику = 1.
2) тут тонкости с тем, как стартовать цикл и с тем, как его завершить, чтобы не потерять последнюю группу символов. Несложно, но надо сделать. Разные способы есть.
С регистром вроде вопросов нет.
1) Погоди, "последний символ" это литера, которую в данный момент проверяет программа? Кстати, поясни почему счетчику нужно присвоить значение 1, помню, что я до этого как-то дошёл сам, но потом забыл. Почему не 0?
2) В моём полном коде есть len(s), я ее как раз таки сделал, чтобы на последнем символе цикл прекратить.
>В моём полном коде есть len(s), я ее как раз таки сделал, чтобы на последнем символе цикл прекратить.
Это тоже один из вариантов. Ещё вариант есть добавить в конец символ не из списка, который встречаться не может, тогда он будет просто утерян, а все целевые останутся.
Мне просто в принципе не нравятся лишние проверки в цикле, не очень нужные и разовые. Слёту, можно такой вариант сделать:
seq = "aabbDDcdadfddsssasdfa" # мы закладываемся, что длина ненулевая
count = 0 # перед стартом 0, чтобы корректно начать цикл
prev = seq[0]
for symbol in seq:
if symbol != prev:
print("{}{}".format(symbol, count))
prev = symbol
count = 1 # У нас уже есть один новый символ
else:
count += 1
else: # это условие будет выполнено по окончании цикла, особенность питона
print("{}{}".format(symbol, count))
Не запускал, прямо здесь набил, но по идее должно работать.
Я что при использовании import logging должен сам расставлять вот эти хуевины в коде? А если не расставил, то хуй мне, а не логи?
logging.debug("This is a debug message")
logging.info("Informational message")
logging.error("An error has happened!")
Что нет готовой библиотеки/модуля, чтобы все ошибки записывать в файл? Не может же быть такого
>Объясните пожалуйста неофиту, что есть
>>нормальный проход по коллекции
Смотри, пусть у тебя есть список xs, тогда просто пройтись по нему от начала до конца идиоматично можно так
for x in xs:
print(x)
А можно представить, что это массив в языке си и делать так:
for i in range(len(xs)):
print(xs)
i += 1
или даже
i = 0
while i < len(xs):
print(xs)
i += 1
Это правильно, но не так хорошо читается.
По задаче отступы правильно, но ты не во всех ветвления прибавляешь единичку и индексу. Если бы ты сделал плоский свитч (if .. elif .. elif .. else) это было бы проще отловить.
Нормально, но pythonic-way - это использование библиотеки pathlib при работе с путями:
from pathlib import Path
path = Path(__file__) / 'bookstoupload'
files = path.glob('*.docx')
class MyClass:
def __init__(self, my_dict):
self.my_dict = my_dict
def add(self, key, item):
self.my_dict[key] = item
def delete(self, key):
del self.my_dict[key]
def search(self, item):
return self.my_dict.get(item)
def show(self):
for k, v in self.my_dict.items():
print('{}: {}'.format(k, v))
my_dict = {'name0': 'number0', 'name1':'number1', 'name2':'number2'}
m = MyClass(my_dict)
# m.show()
m.add('name99', 'number99')
# m.show()
m.delete('name0')
#m.show()
print(m.search('name99'))
остальное сам сделай
class MyClass:
def __init__(self, my_dict):
self.my_dict = my_dict
def add(self, key, item):
self.my_dict[key] = item
def delete(self, key):
del self.my_dict[key]
def search(self, item):
return self.my_dict.get(item)
def show(self):
for k, v in self.my_dict.items():
print('{}: {}'.format(k, v))
my_dict = {'name0': 'number0', 'name1':'number1', 'name2':'number2'}
m = MyClass(my_dict)
# m.show()
m.add('name99', 'number99')
# m.show()
m.delete('name0')
#m.show()
print(m.search('name99'))
остальное сам сделай
Какая сейчас примерная зряплата для вкатывальщиков(в ДС)? Насколько трудно найти работку, если в приоритете не веб?
Есть примерно год опыта ковыряния по вечерам своего кривого проекта на джанге и пандасах. Олсо до этого несколько лет кодил на плюсах, но это было давно и неправда.
Как сделать этот уебищный кусок кода c проверкой нескольких условий более красивым и лаконичным?
Использовать обратный слэш в питоне это вроде как зашквар и признак нуба.
>> f = Foo(1, 2, 3)
>> f
<какой-то объект Foo с атрибутами 1, 2, 3>
>> f.method(2, 2, 8)
>> f
<какой-то объект Foo с атрибутами 2, 2, 8>
Первое, что пришло в голову: if last_sym not in (",", ":", "=", "--") and len(line) > min_len.
Да, точно. Я осёл.
Как, блять, вообще один последний символ может быть равен двум '--'. Почему last_sym = line[-1:] А не просто last_sym = line[-1]
Да никак, это я по невнимательности проебался чутка.
Ты хочешь вообще все переинициализировать? Тогда наверное лучше сделать f = Foo(2, 2, 8), так понятнее, что ты пересоздаешь объект. Если хочешь часть атрибутов поменять, то просто в методе это и делай
def method(self, a, b, c):
self.a = a
self.b = b
self.c = c
>Использовать обратный слэш в питоне это вроде как зашквар и признак нуба.
Иногда без него никуда не деться, если надо - используй и никого не слушай потом может быть отрефакторишь
Пожалуй, подобный способ для моих целей подходит даже больше. Спасибо.
Впрочем, и по своему вроде удалось реализовать.
легко
sendmessage есть метод, указываешь юзверя, бот отправляет по @id-шнику ну или по числовому, надо его отдельно узнавать
Надо получать форму с чекбоксами по одной из урлов и после получения запускать скрипт.
Короче нужно типа этого, с минимальным количеством строк и конфига, т.к это одноразовая хуйня для тестирования хуеты на другом ЯП.
def my_hanler(req):
print(req)
server.start()
server.listen(/api/huyapi/, my_handler)
Обнял того, кто наведет на путь истиный.
Ответ формы можно хоть через import http.server сделать.
А так - бери Flask, ещё никто не жаловался на него.
Спасибо, наверное import http.server возьму. Фласк излишен будет, мне там в прямом смысле 10 строк кода нужно - схоронять данные из формы в текстовый файл и больше ничего не делать
Я в программировании вообще абсолютный нюфаг, в свое время баловался на начальном уровне CSS+HTML, шо как бы намекает, что я далеко не программист.
Так вот, возникла внезапная необходимость собрать кое-какую хуевину...
Существует огромный, сцуко, файл *.docx на почти тысячу страниц, состоящий из множества таблиц, в каждой из которых перечисляются люди, учащиеся на одной специальности, но в разных шарагах, и небольшого описания к каждой из них. В каждой таблице пять столбцов (на деле не совсем так, но для простоты представим). Первый столбец - номер строки, второй - id-число, третий - ФИО персонажа, четвертый - численное значение балла на экзе, пятый - трехзначный номер заведения, в котором персонаж состоит.
Так вот, надо каким-то образом научить железный ящик выбирать из этого файла только персонажей из конкретной шараги и сохранять в отдельный файл, желательно - с группировкой по специальностям.
Звучит совершенно не сложно, кажется (кроме этапа с подключением .docx файла), но у меня, как у человека, который в пайтоне только задачки на питонтьюторе решал, попытка представить принцип работы целиком вызывает когнитивный диссонанс.
Так вот, товарищи, поделитесь, пожалуйста, как такую хрень можно вообще реализовать? Каким вы видите подобный скрипт? За любую информацию буду благодарен люто-неистово, только дайте направление, куда копать. Если в чем-то я проебался и это что-то нереализуемо - скажите, пожалуйста, что именно, что теперь делать-то вообще и вообще. И насчет реализуемого тоже что-нибудь скажите, пожалуйста.
Сумбурно, но, как говорится, "часики-то тикают". Заранее спасибо, пацаны.
Вооот, уже ответы пошли. Люблю анона. Попиздил гуглить, что это такое.
Насчет пайтона - хуй знает, нравится он мне почему-то))9
Давно хотел заняться изучением, а тут вот такая необходимость возникла, я и загорелся чет. Но если на нем я слишком заебусь этим заниматься, то ладно, можно отложить, думаю.
А на этой твоей хуйне мою хуйню будет сильно геморно склепать?
Вах, ебац, типа прям с вордом работать умеет. Благодать. Покурю.
А в принципе если отмести тот факт, что мне нужно работать именно с *.docx, на пайтоне это реализуемо?
мне кажется легче в sql все записать, спарсить всё и записать
https://github.com/python-openxml/python-docx/issues/13
там даже какой-то полуготовый ответ лежит, мельком глянул
парсишь таблицы и все запихиваешь в базу sql
Можно и через питон, но нахуя, если микрософт тебя прямо в ворд всё запихали.
благодарю анончек, посмотрю! Счастья и здоровья тебе
Оп, охуенно. Полностью ещё не прочитал, но выглядит полезно. Насчет SQL тоже покурю утром, попытаюсь вникнуть в твою мысль, анонче. Спасибо за годную ссылочку.
class MyClass:
____test = 0
и
class MyClass:
____def __init__(self, test):
________self.test = test
Когда и что юзается и какие есть подводные?
В первом случае у тебя переменная общая на весь класс, то есть глобальная, во втором у каждого объекта своя переменная.
Вся работа тут в подключении docx, парсинге данных, обработке разных исключительных ситуаций и наступании на потенциальные грабли. То есть 90% работы будет в том, чтобы загнать этот docx в какую-нибудь нормальную питон-структуру. А там уже можно легко и быстро данными манипулировать.
Тут реально от питона ничего.
Вот добавил я бота, написал ему, например, что хочу читать такой-то тред и приложил ссылку на него. Бот обработал запросик и начал слать ответь анонов. Эти ответы будут видеть все пользователи бота или именно тот пользователь, что написал ссылку треда? Если все ,то можно сделать работу бота по каждого пользователя, а не под всех?
я не про свой код. Я спрашиваю реально ли сделать то, что я хочу?
Нет, делай через либы, если таковые есть, если нет, то ебаш через реквесты
Выкатывается в тред нуб. Вообще можно через in range это оформить.
Подводных никаких, не поздно.
Ну это почти то же самое, что и a = Foo(5), только неявно, а питонодзен говорит, что явное лучше неявного, так что смотри, не отстрели себе ничего.
Допустим, есть приложение на джанге. В это приложение хуйня на ардруине шлет гет запросы через форму и записывает их в базу. На другой странице они рендерятся в хтмл. Возможно ли с сокетами сделать асинхронное обновление этих записей, на странице которые они рендерятся, чет никак не могу понять? Потыркался в аякс, но там немного не то что мне нужно, там данные обновляются с указанным интервалом. А мне надо как только прилетело новое значение на сервер - оно сразу же отрисовалось у клиента
> А мне надо как только прилетело новое значение на сервер - оно сразу же отрисовалось у клиента
ZMQ/RabbitMQ
Спасибо, буду в этом направлении рыть. Юзать это все равно с каким нибудь асинхронным фреймворком типа Celery, да?
> асинхронным фреймворком типа Celery
> фреймворком
Это не совсем так.
Смотря какая у тебя архитектура там вообще, можешь с Селери, можешь отдельно.
Да у меня там нет ничего толком. Все просто, уровень не выше чем бложек из мануалов.
Ладно, спасибо за наводку. Добра.
В ячейках одного столбца есть ебучие кортежи, причем ключи там примерно одинаковы.
Как вычленить этот сраные кортежи, так чтобы ключи стали новыми столбцами, а значения - значениями столбцов?
Мне нравится писать что-то, что используется повседневно, я был бы счастлив участвовать в разработке ворда, клиента стимача, Файерфокса и тому подобного.
На данный момент я использую питон для разработки игор (но мне просто повезло, что есть финансирование. Не уверен, что если его перекроют я найду аналогичную работу) и для автоматизации задач (что своих, что помогаю девопсам в крупной ИТ компании из спб).
Есть вообще при таких раскладах смысл продолжать задротить питон? Или стоит заняться джавой (которую я тоже люблю)? Или вообще уйти на C# (к языку претензий не имею, кроме того, что методы начинаются с большой буквы, а вот VS я непереношу. Но, наверное, можно привыкнуть)?
Ваше мнение?
Си-сярп хорош для геймдева, бери его !
Можешь попробовать какой нибудь Рygame или Pyglet. Но сишарп пока что кажется более лучшим решением.
def user(nickname, name, last_name):
"""Собирает в словарь информацию о пользователе и выводит её"""
while True:
user_info = []
user_info.append (name)
user_info.append (last_name)
user_info_array = {}
user_info_array [nickname] = user_info
for nname, uinfo in user_info_array.items():
print(nname, uinfo[0], uinfo[1])
quit = input ('do u wona quit? ')
if quit == 'no':
False
nickname = input ('Enter ur nickname ')
name = input ('Enter your name ')
lastname = input ('Enter govnour lastname ')
user(nickname, name, lastname)
Могу предположить, что вместо "False" нужен "break".
В следующий раз выкладывай на pastebin. Облегчишь задачу и себе, и другим.
Не помогает бреак, и вообще там я неправильно в словарь никнеймы складываю
А что ты такое хочешь сделать? По факту у тебя в функции вечный цикл, из которого нет выхода.
Нихуя не вечный, и хуй знает что я делаю. Дошел до функций в учебнике и захотел немножко забежать вперед без подсказок автора
Как же не вечный, если вечный? Твоё
if quit == 'no':
____False
не сделал для его остановки ровным счётом нихуя.
Если написать NO, то один хуй выйдет из цикла, просто проебался со значением. Вон на картинке более менее нормально сделал, например
Ты не понял походу, я хотел анально заставить вернуться питон в начало цикла вхиле, чтоб оно запрашивало ввод с никнейма, нейма и ластнейма по новой.
Для этого у тебя инпуты из промта должны быть внутри цикла, иначе как ты введёшь новую информацию? Один раз ввёл и всё, функция твоя раьотает только с уже введёнными данными
Ааааааа, сука, блядь. Спасибо
Нахуя ты везде пробелы перед скобками ставишь? Тебе даже среда говорит, что ты еблан и что-то делаешь не так.
Загугли как делать reformat code в твоём редакторе и делай регулярно. Таким образом легко изучишь pep 8
Делаю кнопки, и у них коллбек с опциональным аргументом (какие-то кнопки передают его, какие-то нет).
Коллбек типа такого:
def onClick(self, opt_arg=None):
И в общем когда делаю проверку этого optarg внутри функции, то он внезапно возвращает False вместо None, хотя пока никто и не передает туда ничего.
В чем косяк? Нормальных доков по кути на питоне не нашел, поэтому хз какая там сигнатура.
Бля, там в кликед еще передается чекед зачем-то.
https://doc.qt.io/qt-5/qabstractbutton.html#clicked
Хотя во всех примерах пишут button.clicked.connect(partial(calluser,name)) и в коллбеке не смотрят никакой чекед, хуйня какая-то.
Питонач на помощь.
У меня есть функция, которая парсит всякое и отправляет их куда мне надо. Как мне сделать так, чтобы все повторялось? Кстати, все это надо отправлять нескольким людям, повтор отправки для всех разный и что отправляется тоже. Как реализовать отправку по времени, нужно ли использовать классы для этого?
Сделай циклом.
Что-то возможно стоит отдельными тредами сделать.
По времени надо таймеры смотреть или системную дату.
Задача не понятна нихуя.
крч, поступает запрос от пользователя, тип пропарси сайт и таких пользователей много, у каждого свои хотелки. Но смысл один, прога парсит сайт и повторяет это каждый час, например. Вот первый юзер пишет пропарси хх.ру и это в 14:00, получает результаты и через час бот снова их отправляет.
второй пользователь пишет в 16 часов и бот должен в 17 ему снова отправить результат.
Ну хз, храни пул ивентов, которые надо обработать. При запросе добавляй в пул инфу. В каком-то треде крути проверку ивентов.
Или при запросе тупо на таймер вешай событие, а при отправке снова его засекай.
Если это веб-сервис или тг-бот, там мб какие-то свои еще приколы есть.
Если надо долгосрочно, то скорее всего да.
>>49192
Тебе нужны менеджеры задач, типа Celery и проще.
Архитектурно: интерфейсный модуль получает от пользователя задачу и складывает в очередь сообщений, например просто в БД в виде строки или объекта
"parse sweet-wet-pussy-cats.com 01:08:2020 14:00"
одновременно у тебя крутится несколько процессов-воркеров, они сканируют эту очередь задач, забирают, выставляют флаг "выполняю". Как сделают, записывают итоговый результат куда-то, в файл или БД, выставляют флаг "выполнено" и ссылку на результат.
Обмен заданиями/сообщениями можно делать через БД, это самое простое. Или использовать специальные брокеры обмена сообщений и/или менеджеры задач, от простых вариантов до энтерпрайз решений. Я бы рекомендовал начать или с обмена через БД, или с максимально простых брокеров, навроде такого: https://huey.readthedocs.io/en/latest/ потом поймёшь, что тебе надо и на каком уровне, нужен ли серьёзный инструмент и какой.
Почему цифры работают а буквы нет!?!??!?!!?!?
Тебе не нужно заниматься программированием. Пойти в охранники, оставь программирования омежкам-задротам, которые понимают, чем имя переменной отличается от её значения. Например чем имя переменной отличается от строки.
Не останавливай меня на пол пути! Я такой же сыч как вы!!! Я хочу научиться прогромировать! Так почему не работает?
print (pidor % ('pidor', 'huila'))
А вообще советую третий питон: 'you are {0} or {1} ? '.format('pidor', 'huila') или ещё проще f'{переменная со строкой №1} or {переменная со строкой №2}'
Есть пользовательский ввод команды по типу
command [-flag] [-flag ("attribute")]
Как сделать обработку команд красиво? А то единственное что в голову приходит -- разбить в массив строку по пробелам, собрать те части, что с кавычками используя остаток от деления надвое, потом искать все, что начинается с - и проверять на наличие атрибутов (кавычек)
В стандартной библиотеке питона есть модуль argparse
Помогите решить проблему. Изначальная задача заключается в том, что из CSV файла беру данные и создаю массив с помощью numpy.array(на первом пике) и необходимо посчитать скользящую среднюю по последнему столбцу, после чего добавить столбец состоящий из чисел скользящей средней в изначальный массив. В интернетах нашёл следующий способ расчета скользящей средней(на втором пике), однако этот код вообще ничего не выдаёт. И даже если как-то сделать, что этот код заработает, как его адаптировать допустим для массива, который закоментен во второй строке на втором пике, потому что я уже несколько часов пытаюсь как-то манипулировать этим массивом, но все время ошибки связанные с типами данных. Вот код для средней:
import numpy as np
# a=np.array([[1.1], [2.2], [3.3], [4.4], [5.5], [6.6], [7.7]])
def moving_average(a, n=3) :
ret = np.cumsum(a, dtype=float)
ret[n:] = ret[n:] - ret[:-n]
return ret[n - 1:] / n
a = np.arange(20)
moving_average(a)
Разрешаю.
Не углублялся в задание, но твоя программа ничего не выдаёт, потому что ты результат работы функции ни сохраняешь, ни вводишь через print.
Да, я даун, вроде вторую неделю уже учусь и почему-то подумал, что он щас без принта выведет всё.
Вот этот чувак топовый
https://www.youtube.com/playlist?list=PLlWXhlUMyoobAlP3mZ0_uuJagsDSg_5YT>>49433
Сначала попробую на RabbitMQ сделатЬ, вроде полегче. Посмотрим. буду обращаться ,если словлю тупняк
TypeError: put() takes 2 positional arguments but 3 were given
Разве там не 2 аргумента передается?
И алсо как вообще понять, что я должен ждать с помощью await, а что нет?
В документации к aiohttp есть пример:
async with aiohttp.ClientSession() as session:
async with session.get('http://httpbin.org/get') as resp:
print(resp.status)
print(await resp.text())
Например resp.text ожидается с await, а resp.status нет. Где прочитать почему?
Правильное форматирование строк в третьем питоне такое:
https://docs.python.org/3/library/string.html#format-string-syntax
То, как делаешь это ты - легаси и ты рискуешь все сломать в в определенный момент. Ну и вообще, конечно, лучше сразу учиться делать по документации а не по старым туториалам от васяна.
Бля, ну я хз, я вроде качал самую последнюю версию с сайта.
>Ну и вообще, конечно, лучше сразу учиться делать по документации а не по старым туториалам от васяна.
По документации я нихуя не понимаю. И учу по книге "питун для дытей", а это книга 2017 года, вроде не такая и старая.
. Внутри пандас уже np.ndarray, зачем тебе в него явно переводить я не понимаю
. Не надо самому городить математические функции, они есть в scipy или в самом пандас:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rolling.html
. Не итерируйся без необходимости по нампайным структурам - лучше найди функцию которая сделает это за тебя на си, будет драматически быстрее. Когда работаешь с numpy + scipy + pandas, полезно мыслить вообще не циклами, а потоками данных и редьюсами.
Попробуй прототипировать в jupytert notebook, там без принтов выдает.
Дело не в версии интерпретатора, а в версии синтаксиса, которую ты используешь. Актуальный синтаксис - это format strings, например:
print("I have fucked {name}'s mother.".format(name="Vasya"))
Здесь ты в фигурных скобках пишешь имя переменной, которую подставляешь, потом к строке применяешь метод format(), и в него передаешь, что оименно и всесто какого аргумента ты хочешь подставить. Можно вообще так:
substring_from_above = "!"
text = "Here goes some substring: {}".format(substring_from_above)
print(text)
Ну и совсем сахарок:
salary = 30000000
print(f"Я питонист и зарабатываю {salary:#x}кк/нс")
Спасибо, но я к сожалению ничего не понял.
В общем-то та версия интерпретатора на которой я сижу не актуальна? Нужно качать формат стринг?
Нет, просто вместо
outstr = "%s pidor"
name = "Vasya"
print(outstr % name)
писать
outstr = "{} pidor"
name = "Vasya"
print(outstr.format(name))
Ну и все-таки сначала научиться разбираться с проблемами и читать документацию, это самы полезный документ в питоне.
Можешь еще сюда глянуть
https://pythonworld.ru/osnovy/formatirovanie-strok-metod-format.html
Имею в виду, что некоторые вещи из этой книги могли устареть, даже с учетом того, что ее переиздавали.
Теперь захотел для личных нужд написать кой-че, так что посоветуйте, пожалуйста, модуль для того, чтобы лихо написать программу с графикой (ничего особо фэнси, просто кнопочки, ползунки, чеклисты и поля ввода нужны).
В документации всё есть
https://docs.aiohttp.org/en/stable/client_reference.html
coroutine async-with get(url,...
get - это корутина, соответственно её ты или вызываешь с await, ну или оформляешь явно в задачу, но это другая история. Если бы метод был обычным, в asyncio таких много, но в aiohttp.ClientSession вроде таких нет, то их уже надо вызывать обычным способом.
status - это просто свойство.
Благодарю
Хм. А если у меня такого с десяток: скраперы там всякие, утилиты, главное, что с ирл применением, плюс беки для петшопов и имиджборд с хуевым вырвиглазным фронтом, на собеседования есть смысл ходить?
алсо я начал вкат в прогу через кресты, и без задней мысли могу хуячить указатели на указатели на указатели
Да
И это не нужно, что нового ты сделал? Ничего! Это можно найти за 2 мин гугления
Не показывай это работодателю
>И это не нужно, что нового ты сделал? Ничего! Это можно найти за 2 мин гугления
>Не показывай это работодателю
Большую часть говна, которое пишут программистишки можно найти за пару минут гугления. Так что пусть показывает, хоть какой-то код лучше, чем ничего.
>>49928
Pet-project и не обязан являться чем-то новым, с помощью него ты показываешь потенциальному работодателю свои скилли, сама идея не оценивается (по крайней мере в программировании так).
Но показывать данный проект работодателю не стоит, тут я согласен. Во-первых слишком мало кода и проект слишком простой, во-вторых качество кода оставляет желать лучшего, видно что до джуна не дотягиваешь, причём довольно сильно. Есть, конечно, и положительные моменты: наличие readme, requirements и config-файла (правда ini не самый удачный формат), также хорошо, что есть логгирование и комментарии к коду. Судя по гитхабу это твой первый проект, так что вполне нормальный результат.
Ну для первого проекта очень даже хорошо, я сначала так и подумал, что проект учебный. Но косяки и недочёты, конечно, присутствуют
Слишком большая функция main, нужно декомпозиция, я особо не вникал, но сразу заметил, что как чтение и парсинг конфиг файла можно вынести в отдельную функцию, но этого всё равно будет мало.
>total_lines = sum(1 for line in open(txt_file))
Решение элегантное, но файл нужно закрыть, а лучше вообще использовать контекстный менеджер with при открытии файла (загугли как работать с файлами правильно)
Работа с путями (где проверка на os.name) совсем не pythonic-way. Как минимум есть os.path.join (которую ты использовл выше), а вообще самым лучшим вариантом является использование встроенной библиотеки pathlib.
>requests.get('https://myanimelist.net/anime/' + mal_id + '/a/pics')
Для таких случаев вместо обычной конкатенации лучше использовать f-строки (f-strings), если версия питона 3.6+, тогда и mal_id к строке не нужно будет преобразовывать
С форматированием кода всё довольно неплохо, но не идеально, во-первых обрати внимания на то как нужно форматировать импорты согласно PEP8 (можешь просто isort например заюзать), плюс ещё по мелочи есть, прогони через линтер какой-нибудь.
> Решение элегантное
Говно решение. Что так, что эдак, файл все равно прочитается целиком, все строки. Поэтому лучше прочитать строки и явно сделать len(), а не городить неведомо что.
В чем разница между тредингом и мультипроцессингом?
Можно ли импортировать другой файл в основной чтобы все инструкции импортируемого исполнялись фоном, это делать через мультипроц? И как это сделать мхе
Как какие ограничения снимает мультипроц относительно трединга?
Ты тормозишь.
Если сделать
with open('file.ext') as f:
for line in f:
do_something
то ты читаешь файл построчно, он весь в память не загружается. Если файл небольшой, мегабайт, то иногда проще целиком прочитать. Но файл может быть и в сотню мегабайт и больше.
Ты можешь запустить тред, тогда у тебя общий процесс, общая память, общие переменные и т.п. Но есть проблемы с GIL. А можешь запустить отдельный процесс, он не будет связан напрямую с основным. У тебя нет проблемы GIL, у тебя полностью независимое адресное пространство, свои переменные и т.п., но другие способы синхронизации данных, тебе явный обмен надо делать. Плюс перерасход ресурсов, каждый процесс память занимает.
В питоне у тредов очень большие ограничения по производительности по сравнению с тредами. В обычном питоне, не PyPy, распараллеливания в этом случае фактически нет. Только если у тебя какие-то ресурсоёмкие операции во внешних модулях, написанных на C, исполняются, тогда есть смысл, и когда с блокирующими операциями ввода-вывода работаешь.
Короче, читай теорию, это большая и сложная тема.
Проблему я свою решил) В процессе решия оказалось что signal может быть только в мейн треде, если мультипроцессами это делать, то можно?
Понял что нельзя в мультипроце жонглировать данными, гораздо сложнее общение одного с другим и вывод общего. Можно ли там же использовать global или все через сторонние места храниэений, бд или файл?
Да надо будет почитать, но так сложно себя заставить.
Спасибо за ответ.
Это сложная область, лучше потратить время и полноценно с ней разобраться, поработать на тестовых примерах, чтобы треш не лепить.
Есть разные способы взаимодействия между тредами и процессами. Вот есть shared memory между процессами, но лучше этого механизма избегать. Ты можешь потоки данных из одного процесса в другой слать, или через Queue, то есть очереди.
Много разных подходов есть. Нельзя в двух словах объяснить. Это квалифицированная область, требует профессионального подхода. Найди время, чтобы разобраться.
Хорошо, у лутца нормально объяснено это? Гуглинг выдаёт куару, по ней и разрешил свою проблему, но вопросов возникает много мелких. Примеры и задачи на эту тему тоже в шапке есть?
Почитай в какой-нибудь книге по операционным системам (например в Таненбауме) главу про процессы и потоки для начала
Добрый вечер. Как работать с подобным API в Python? Подскажите хотя бы, в сторону чего смотреть, а то я совсем нуб.
Блин. Я был уверен, что метод надо было применить именно к answer. Но спасибо! А вообще, именно к введенной строке его можно применить?
Выглядит круто. Спасибо.
А как? Я не понимаю, как синтаксически составить такую конструкцию.
answer = answer.lower(str(input('Another question? ')))
возвращает ошибку, что answer не определен (кстати почему?)
Потому что ты вызываешь метод .lower() для ещё не определённой строки answer, а не для твоего инпута. Правильным вариантом будет
answer = str(input('Another question? ')).lower()
Обьясните почему в шапке настолько старые ссылки? Хабр 2012 года! Гитхаб 15 года!
>полезные материалы для начального уровня.
2013 год.
За это время питон вообще никак не развивался?
>Вкатываюсь в питон.
А другие вкатывались 5-10 лет назад и просто не следят, что там вышло нового для вкатывальщиков.
Ссылки с книжками актуальные, там и 2017 книжки есть и даже новее думаю. Это надо бы как-то систематизировать, проглядеть материалы и рассортировать по каталогам "для вкатывающихся с нуля", "для вкатывающихся с других языков", для продвинутых, по технологиям и т.п. Но всем лень.
>>50957
>За это время питон вообще никак не развивался?
Сама основа языка почти не изменилась, для начинающих. Да и так почти во всех языках, кроме разных JS и совсем новых, которые только появились. База старая. Из нового только asyncio. Но это сложновато для вкатывальщиков.
В шапке прошлого треда был коммент, что ФАК устарел.
Поэтому питон 3 выкатили уже 10 лет как, а бомбит у всех по сей день.
нуб пытается в ооп
https://pastebin.com/nrgwUu1W
В интерпретаторе всё работает, как ожидается. Но в jupyter-lab выводит какое-то говно:
https://pastebin.com/kMMd0swV
1 строка - создается объект
2 строка - видно, что вызывается метод __del__ - не известно, по какой причине. В коде объект не удалялся.
4 строка - вызывается метод sayHi(), который возвращает поле объекта. Но при этом ранее сработал метод __del__. WTF?
Почитай про сеттеры-геттеры:
https://pythonz.net/references/named/property/
С помощью этих механизмов можно реализовать то, что тебе надо.
У меня есть словарь, который будет изменять сообщение, введенное пользователем:
alphabet = {'one':'1', 'two':'2'}
encoded_message = str(input('Enter an encoded message: '))
for i, k in alphabet.items():
____output = encoded_message.replace(i,k)
____print(output)
Но почему-то при введении инфы (например, one), программа возвращает
1
one
Почему так? Не пойму, откуда берется задвоение.
Мне нужно подключаться из питона к опенвпн - запускать селениум и там работать.
Я опенвпн запускать научился, но вот как дальше быть, если он не завершается же, а работает. Пробую через subprocess.Popen, но всё равно подключается только к впн, а дальше код не выполняется.
import requests, os, sys, subprocess, time
path = '/home/qazw/documents/nordvpn/ovpn_tcp/de507.nordvpn.com.tcp.ovpn'
password = '/root/Downloads/nordvpn/loginpass.txt'
with open("/home/qazw/documents/nordvpn/ovpn_tcp/de507.nordvpn.com.tcp.ovpn", "a") as myfile:
myfile.write('\nscript-security 2\nup /etc/openvpn/update-resolv-conf\ndown /etc/openvpn/update-resolv-conf')
myfile.close()
x = subprocess.Popen(['openvpn', '--auth-nocache','--auth-user-pass', password, '--config', path], shell=True)
try:
while True:
time.sleep(600)
except:
try:
x.kill()
except:
pass
while x.poll() != 0:
time.sleep(1)
Тут код запуска селениума
не ебу про питон, но у процесса там, что ли, нет стандартных потоков ввода/вывода?
Не думал что найду эту вэбм здесь. Большое спасибо, долго искал !
var callback;
function setCallback(func){
__callback = func
}
...
callback("пизда накрылась")
Или как реализовать обратный вызо
В этом вашем питоне нет нормальных анонимных функций.
(мне, как закоренелому анониму, это особенно неприятно, лол)
Поэтому, надо использовать именованные.
Гвидо так захотел.
Вот так это делается, примерно:
https://repl.it/repls/StarkFlatPrinter
Конечно можно, ровно так же, как и у твоём примере.
callback = None
def set_callback(func):
____global callback
____callback = func
или ты что имел в виду?
С первыми тремя пунктами проблем нет, но четвертый немного вводит в ступор.
Окей, сделал я так: https://pastebin.com/J6mvtVnB
Но разве это правильно? Получается я всегда должен буду создавать копию массивов listCopyCopyCopy, это ведь отвратительный код?
Про копирование массивов знаю, что делаем это таким образом:
listCopied = listOriginal[:]. Но нельзя ли здесь где-нибудь поставить .lower()?
Спасибо :3
Попробовал вместо четвертой строки поставить это:
currentUsersCopy = []
for currentUser in currentUsers:currentUsersCopy.append(currentUser.lower())
Получилось, практически, тоже самое, но более ебланово.
Так они сами просят такое кривое решение, что тут сделаешь.
Оно кривое. Я бы проектировал иначе, но это не будет соответствовать ТЗ.
Я бы сделал словарь с записями вида
users = {
'john' : 'JohN',
'pavel' : 'Pavel',
'michael' : 'mICHAel,
}
вот в таком словаре ты хранишь как ключ имя, приведённое к нижнему регистру, а как значение - оригинальное имя, либо более сложную структуру, если потребуется.
Но это не про ТЗ.
Мне кажется, что ты не понял задание. Тут данные юзеры будут вносить, а не я сам заполнять. И их может быть как три, так и тысячи. Хз, мб я не догоняю. До словарей ещё не добрался.
Не надо копировать массив.
Приводить к нижнему регистру надо непосредственно при проверке.
Проходишь по new_users, затем, внутри, с каждым new_user проходишь по current_users и сравниваешь (в этот момент и приводишь оба имени к нижнему регистру).
Всё.
Ещё раз - копировать/преобразовывать массивы не надо.
Рассматривать это как реальную задачу и "оптимизировать" - тоже не надо.
В реале делают примерно как пишет >>51150
У тебя в словаре две пары ключ-значение. Для каждой пары происходит итерация цикла с принтом в конце. Первая итерация меняет твою строку на "1" и выводит, но другая не делает ничего, потому что в твоей строке нет "two", и выводит тот же самый input. Надеюсь, понятно выразился.
Ну так когда я в седьмой строке проверку делаю, как мне currentUsersCopy завернуть в lower? Нельзя ведь метод ко всему массиву применить.
Так господи, пройди ручками по всему массиву и проверь, ты вместо того, чтобы написать функцию на три строчки кода теперь всегда будешь искать вариант с сахаром?
Покажи, пожалуйста, как это сделать. Я сейчас попробовал loop в loop завернуть, но получилось не то, что я ожидал. Спасибо.
Что у тебя не получилось с вложенными циклами?
Знаешь, с твоими проблемами тебе бы какой-нибудь курс по алгоритмам пройти. В котором тебе вообще не будут разрешать пользоваться никаким сахаром, чтобы с массивами работать по индексам и всё такое.
Хм. Выразился-то понятно, но что мне с этим делать? Я думал, что основная фича for loops - это как раз проход по всему массиве информации.
>как мне currentUsersCopy завернуть в lower?
Гугли "python map function".
Это вообще одна из фундаментальных вещей в программировании.
Но, как я уже сказал, именно эту задачу так решать не надо.
Это, как правильно заметил анон выше, скорее алгоритмическая задача, обходные пути тут искать не нужно.
Переменная output не нужна.
Или копируй сразу туда введёную строку, если не хочешь её портить, почему-то.
В цикле надо делать encoded_message = encoded_message.replace(...)
Выводить результат надо после цикла, а не в цикле.
>Или копируй сразу туда введёную строку, если не хочешь её портить, почему-то.
Это я хуйню написал, чисто на автомате.
В питоне строки иммутабельные. Ну, и replace каждый раз возвращает изменённую копию, естественно.
Спасибо за помощь, анон, с этим получилось, но у меня появился какой-то баг в коде, никак не могу понять, в чем дело.
Моя программа сейчас переводит английские слова на фонетический алфавит нато (альфа, браво, чарли и т.д.), код на пикрелейтед, при вводе "test" возвращает вот такое:
>Enter a message: test
>Tango EcHOSierra caRomeo Tango eLiMike a OSierra caRomeo Sierra Tango
Хотя должно возвращать Tango Echo Sierra Tango.
Включи мозг.
В словах, на которые ты меняешь буквы, есть те же самые буквы.
Это надо делать по-другому.
В цикле надо проходить по буквам строки: (for c in my_string): ...
Для каждой буквы находить слово в словаре, и добавлять в список (напр. words).
Потом: result = " ".join(words)
Алсо - более кошерно будет использовать map вместо цикла:
https://repl.it/repls/FriendlyEvergreenFormulas
Вот именно поэтому программирование кажется мне таким трудным. Я еще не вкатывался в функции, поэтому особо их не понимаю. Можешь, пожалуйста, объяснить свой код?
s = 'ololo'
d = {'o': 'Oscar', 'l': 'Lima'}
Тут все понятно - исходная строка и словарь с парами ключей и значений.
def trans(s):
return d
Определяешь функцию (которая зависит от s?), а вот что именно делает вторая строчка, я не совсем понял.
res = ' '.join(list(map(trans, s)))
Объединяешь что-то.
print(res)
И выводишь результат объединения
s - это _параметр_ функции.
Функция должна вернуть значение, используя этот параметр.
Вторая строка (7-я в коде на repl.it) - получить слово из словаря по букве (параметр s) и вернуть его из функции.
Попробуй там сделать print(trans('o')) - всё станет понятно.
Функция map преобразует любой iterable-объект (коллекцию - список, строку и т.п.) в новую коллекцию, преобразуя каждый элемент через функцию (trans в данном случае).
Т.е. коллекция букв превращается в коллекцию слов.
Функция list преобразует результат именно в список (после map - там не список, а специальная коллекция). Она там НЕ нужна, я просто давно не писал на питоне, и добавил для перестраховки.
Т.е. можно просто:
res = ' '.join(map(trans, s))
" ".join(coll) - это метод строки. Он соединяет элементы коллекции в строку результата, используя данную строку (у которой он вызывается) как соединитель. Т.е. соединить элементы коллекции пробелом, в данном случае.
Спасибо большое за подробные ответы, анон, буду изучать. Исходя из нашего диалога, скажи, пожалуйста, в чем у меня основная проблема этого непонимания? Может, порекомендуешь что-нибудь конкретное почитать?
Практиковаться надо.
Причём, на элементарных вещах.
Вещи типа map так сразу не заходят, с нуля.
Т.е., вроде, всё понятно, но нихуя не понятно.
Задрачивай простые примеры - выражения, циклы, функции.
Попробуй преобразовать выражения типа (2 + 3) 4 в вызовы своих функций, чтобы операторов (+, , ...) в нём не осталось вообще, а были только функции.
Выделяй повторяющиеся куски кода в функции и т.п.
Постепенно, придёт понимание, что часто ты тупо делаешь примерно одно и то же в разных задачах, и тогда ты поймёшь, зачем нужен map и т.п. штуки.
Попробуй сделать сортировку списка методом "пузырька" - это как раз и достаточно просто и достаточно сложно. Алгоритм прочти в гугле, а код напиши сам.
Вот сюда зайди (и см. examples):
https://repl.it/languages/python_turtle
И т.д.
Попробуй читни вот этот перевод известного курса:
http://aliev.me/runestone/
https://habr.com/ru/post/241696/
Но, это будет сложно, читай медленно.
Всякий матан про букву O можешь пропускать, поначалу.
Ну и прочее подобное - гугол в помощь.
Если читаешь по-английски:
http://composingprograms.com/
Практиковаться надо.
Причём, на элементарных вещах.
Вещи типа map так сразу не заходят, с нуля.
Т.е., вроде, всё понятно, но нихуя не понятно.
Задрачивай простые примеры - выражения, циклы, функции.
Попробуй преобразовать выражения типа (2 + 3) 4 в вызовы своих функций, чтобы операторов (+, , ...) в нём не осталось вообще, а были только функции.
Выделяй повторяющиеся куски кода в функции и т.п.
Постепенно, придёт понимание, что часто ты тупо делаешь примерно одно и то же в разных задачах, и тогда ты поймёшь, зачем нужен map и т.п. штуки.
Попробуй сделать сортировку списка методом "пузырька" - это как раз и достаточно просто и достаточно сложно. Алгоритм прочти в гугле, а код напиши сам.
Вот сюда зайди (и см. examples):
https://repl.it/languages/python_turtle
И т.д.
Попробуй читни вот этот перевод известного курса:
http://aliev.me/runestone/
https://habr.com/ru/post/241696/
Но, это будет сложно, читай медленно.
Всякий матан про букву O можешь пропускать, поначалу.
Ну и прочее подобное - гугол в помощь.
Если читаешь по-английски:
http://composingprograms.com/
Ну а как здесь иначе? Я без претензии спрашиваю, мне правда интересно. Не создавать же каждый раз новый объект Foo, если хочется изменить нужное мне значение.
Новый объект тут ни при чём.
И, конечно же, такие вещи можно делать, но, надо чётко понимать, зачем.
И стараться избегать этого.
Я имел в виду, что изменение _другого_ аттрибута, в результате изменения первого, должно быть _явным_ и _очевидным_.
Т.е. лучше сделать отдельный метод, с соответствующим названием, типа change_something(...). Или вообще отдельную функцию.
Кроме тех случаев, когда взаимозависимость этих аттрибутов очевидна и естественна - например, изменение полного имени в результате изменения фамилии или отчества. Но, даже это - неоднозначный вопрос.
Также, полезно в принципе делить объекты на "данные" и "сервисы".
И в объектах "данных" такие вещи строго нежелательны.
См. например, книгу "Object Design Style Guide" (она, правда, ещё не вышла, хз есть уже пиратка или нет). Там примеры на псевдокоде.
Ну и гуглить такое можно, например.
Добра тебе.
"Явность" и "очевидность" пока для меня выглядят как какие-то крайне субъективные категории, и я не очень понимаю, почему тот способ с сеттерами-геттерами в них не вписывается.
Сделать отдельный метод - не проблема, да и вообще первое, что приходит на ум. Было интересно, можно ли обойти необходимость вызывать этот метод "вручную" и вместо этого "автоматически" изменять значение одного атрибута вместе со значением другого. Ну, на "нежелательно" и суда нет.
Так или иначе, спасибо. Буду думать и изучать дальше.
Ну, тут ты флаг используешь. А я до этого не додумался, хоть и по книге я этого не проходил. Спасибо, интересное решение.
А почему у тебя флаг равен флаг ор тру?
Ой, действительно. Спасибки, анончик
Ну смотри, на самом деле элегантное решение с флагом это как на пике(1). Я тебе написал с ветвлением, чтобы было нагляднее, но по сути это одно и то же. Что мы тут делаем? мы делаем проверку для каждой пары элементов из двух списков и логически прибавляем к boolean переменной. Таблицу истинности дизъюнкции помнишь? В нашем случае, если хоть один раз условие равно единице, то флаг тоже становится 1. Иначе флаг остается 0.
Полезность такого флага в том, что мы можем его влепить в любой уже написанный алгоритм, работающий с какими-то данными и проверить, есть ли в этих данных элемент, удовлетворяющий нашему условию.
Вообще, следующим шагом оптимизации будет прекратить проверять условия, если одно уже истинно, в этом нет смысла, потому что так и так нужно выводить, что имя занято.
Вот тебе пик2 с применением break(ты же его прошёл?). Как ты можешь видеть, тут мы используем то, что у цикла for есть else-block, он сработает, если цикл прошёл все итерации. Если мы закончили цикл досрочно оператором break, то else не сработает.
Дальше мы видим, что флаг, ищущий определённый элемент в списке нам уже не нужен, если мы этот список полностью не проходим, поэтому мы лишнее убираем. Вот тебе пик 3.
Хз зачем я это всё расписал так, ну надеюсь, что тебе немного поможет.
>>51529
Хз, насколько это правильный выбор, но я после укуса питона начал вот этот курс http://judge.mipt.ru/mipt_cs_on_python3/
Там и лекции и практики интересные, вообще годнота, короче. Но я его ещё не закончил, и вообще новичок сам.
Кстати, где-то в нюфаг треде есть ещё один анон, который этот курс проходит.
В камелкейзе у него было изначально.
Код на три строчки нужно заливать на пастебин каждый раз?
Если ты только изучаешь всё это - то не обращай внимания.
Для поиграться - это нормально.
Хороший дизайн - это уже следующий этап.
сейчас будет
Спасибо, до брейк ещё не дошел, но там нет ничего сложного. Объяснение твое помогло. Ещё раз спасибо, успехов и тебе в обучении :3.
A byte of pyrhon - Укус питона, 130 стр.
Вы видите копию треда, сохраненную 13 сентября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.