LINUX.ORG.RU
ФорумTalks

Как научиться программировать?

 , , , ,


3

5

Как научиться прогать? Как учились вы? Как учились раньше олды я уже нашел тему и прочитал.

Господа, у меня такая проблема, что в общем и целом подступиться пытаюсь к теме уже 2 года. Начинал я еще в 2009, купили книгу по питону и я ее не осилил. Вот так. Там начались логарифмы(или я их где-то усмотрел, потому что сейчас перечитываю и не могу найти их), а с матаном тогда было совсем туго. Ну я и подумал, что матан == программировать = не мое. На следующий год склепал для игры на ucoz сайтец, немного размял html, потом был следующий сайт уже на гугл конструкторе. В итоге тоже похоронил это дело, т.к. пошел учиться на истфак и информации было очень много. Где-то в 2018 году решил вернуться к вопросу.

Начал с objective-C, начал с основ, буквально неделю подолбился и понял, что дела иметь с аппл и прочим я не хочу, тогда еще свифт начал набирать популярность так что я и вовсе забил. Далее был php. В пхп вникнуть не смог - не знаю кто там говорит за легкость, но мне мешанина из html кода и пхп буквально взрывает мозг. На пхп максимум правил какие-то штуки в шаблонах всяких CMS и забил на это дело. Потом начал javascript, потом забил. Начал изучать Java - было интересно поднять свой сервер для ММОРПГ. Но в итоге как-то забил. Да, здесь вы можете сказать что моя проблема в том, что я забиваю, но читайте пожалуйста дальше эту простыню :)

Решил закрыть гештальт и вернуться к питону. Написал на питоне бота, который нужен был другу….ну как написал.. В этом то и вся проблема! Что написать я ничего не написал. Я просто перерывал кучи исходников, статей, из говна и палок собирая бота, плюясь и кряхтя, проклиная все на свете. Потом начал учить синтаксис питона, забил.

Когда забивал - в основном работал, естественно, не по специальности. Пердолил бубунту, потому что в моем манямирке прогать не на линухе не тру. Да и вообще неудобно. Опять же, вернулся к основам. Читал Лутца, читал A Byte of Python 2 раза, читал Грокаем Алгоритмы Бхаргава. Потом высрал еще пару ботов на питоне, почти схожим с предыдущим примером образом. Я не умею взять и сесть начать писать программу, я буквально не знаю с чего мне начать.

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

Недавно начал С++. Смотрю лекции по алгоритмам и структурам данных, читаю Страуструпа. Страуструп конечно молодец, под видом простого упражнения заставляет писать алгоритм бинарного поиска - я такого никогда не осилю. Вернее я могу заучить этот алгоритм и написать по памяти, могу всматриваться в код и понимать, что этот алгоритм бинарного поиска делает построчно и пошагово. Вникал так же в С, возвращался снова к Java. Попутно реализуя всякие проекты на питон.

Но проблема в том, что я абсолютный 0. Нет, не так. Дырка от 0. Вот установил wm awesome ради Lua. И то снес, хоть и жалко, не успел я напердолиться. Непонятно как именно строить программу на моем этапе.

Я могу взять чей то код, могу даже починить его и заставить работать - НО НА ЭТОМ ВСЕ.

Сначала, когда писал первого бота на питоне я проклинал все, эти ошибки, трейсбеки, все это уже давно поборол, отношусь нормально и к ошибкам времени компиляции на С.

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

У меня цель простая, хочу писать ПО для микроконтроллеров и вебом как-то на хлеб зарабатывать. А еще надо семью каким-то образом кормить. Просто жесть, неужели я должен столько пролитой крови на этом программировании спустить в унитаз и заняться чем-то другим? Ведь мозг можно обучить буквально всему. Но у меня не идет. Сейчас сижу просто над очередным проектом буквально сутки и не сдвинулся ни на шаг. Когда уже оно пойдет, кто знает? Что делать, как практиковаться?

Ответ на: комментарий от futurama

Вначале нужно кодить, потом теория. И под кодить я имею ввиду писать простые но цельные программы, можно мини игры всякие, квесты там, можно даже арканоида запилить (я запилил еще на паскале через 10h в 9м классе, когда ничего ни о чем не знал, потом это был мой проект для поступления в 10й класс – один из вступительных экзаменов).

А когда он начнет более менее свободно излагать кодом свои мысли, то для дальнейшего роста нужно будет уже осваивать теорию. И постепенно процент времени необходимого для практики будет уменьшаться, а процент времени необходимого для теории увеличиваться. Но вначале нужна практика. Много хорошей практики. Не править чужой код, не копипастить 90% кода, а писать самому.

В целом, проблема ТС в том, что он хочет стать хорошим программистом разбирающемся в деталях, как код работает и как проектировать хороший код, подбирая верные решения для отдельных частей, еще и владеть спецификой работы с железом, и знать пару фреймворков веба. Т.е. хочет получить то, чему люди учатся 5 лет в университете, и к чему еще 2+ года готовятся в школе, и все для входа в профессию. Но хочет он это получить за год-два, что-то делая вечерами и без наставников-учителей, которые могли бы протащить его короткой дорогой формирования целостной картины дубася палкой, если он пытается свернуть с дороги, как это делали со студентами в хороших вузах.

soomrack ★★★★★
()

сори , но с таким подходом ничего не получится. вот так взять и начать писать коммерческий код после прочтения нескольких книжек нельзя и даже после вуза. вобще идея лезть в программирование только ради денег очень плохая идея, потому что если ты хочешь профессионально и хорошо делать свое дело, то твоя жизнь должна строится вокруг программирование, а не программирование становиться частичкой твоей жизни. у тебя не получится так, что ты выучил пару алгоритмов и решаешь на них все задачи, а в промежутках отхлебываешь пивка и покуриваешь сиги. это просто несовместимо. наверное многие тут несогласятся , может многие и бухают и курят и им это не мешает типа быть прыграммистами, лично я думаю что это не просто мешает, а убивает в тебе все зачатки любого начала роста хоть в чем. сложность в том что нельзя взять и заставить себя жить правильно только ради того чтобы зарабатывать много. так не получиться... или ты живешь так что тебе интересен рост и этот ИНТЕРЕС НЕ ВЫЗВАН только деньгами, то есть ты растешь не для того чтобы потом много зарабатывать ты растешь потому что хочешь расти и вот когда твоя жизнь в виде постоянного роста и программирования как хобби совпадают то ты становишься программистом, настоящим, хорошим программистом способным решать поставленные задачи , а не находить их в книжечке с алгоритмами, и когда это не ради денег, вот тогда да..... или ты просто тратишь время. это просто должно все совпасть, кто бы тут что щас не говорил. эти все типа гениальные самоучки которые где-то там расли как сорняки или не понимают или немного лгут! у меня как и у всех есть и было желание научиться программировать, но я осознал что умом недотягиваю. постоянно расти может только здоровый человек, как психически так и физически. у всех остальных есть потолок. я в свой давно уперся и просто написал тебе чтобы ты понимал и не слушал тут доморощенных говнокодеров которые вороют чужой код с гита, а после стучат себя в грудь что они хгении... лично мне просто нравиться писать хелло волд просто так потому что нравится, нет уже никаких иллюзий осталось только хобби. вобщем пиво, сиги и жажда наживы не совместимы с ростом, а значит и спрограммированием.

Assembler
()
Ответ на: комментарий от soomrack

за универы не надо ля-ля, как говаривала одна прекрасная девица.... в универах сразу тушат ту искорку в тебе , если она была. в универах дают не знания а диплом.


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

Assembler
()
Последнее исправление: Assembler (всего исправлений: 1)

Я конечно не программист, но ты явно чего-то не договариваешь.

Скорее всего ты банально обманываешь себя. Ты говоришь «долблю стену», но это лишь в твоём мире это «долбление». На самом деле это «поглаживание» стены по праздникам.

Вот установил wm awesome ради Lua.

Я установил awesome потому что это DE, примитивного понимания переменных, функций, массивов хватило что бы править и добавлять функции в популярных темах. Примерно так же с nix.

Читал Лутца, читал A Byte of Python 2 раза, читал Грокаем Алгоритмы Бхаргава.

Я тебе не верю. Что значит «читал» ? Вот я ноль тоже, 12+ лет я работаю в сфере не связанной с программированием. Си кернигана и ритчи «прочитать» можно за день-два, а действительно ПРОЧИТАТЬ это пол года, усердного чтения, а по-хорошему больше. Я это понимаю, по этому я ещё не прочитал.

shpinog ★★★★
()
Ответ на: комментарий от vasya_pupkin

хороший вопрос. всякой системе нужны только рычаги управления. самый длинный и главный -это стандарты. тут все просто, если что-то неугодно надо убрать. а чтобы потом такими действиями не вызвать возмущение или ропот масс, то надо просто сказать им что это не вписывается в стандарты ,которые призваны уберечь от хаоса. но искусство управления оттачивается и полируется, и поэтому стали не просто запрещать какие-то вещи посредством стандартов, а делать этими стандартами так, что к примеру язык программирования просто становится полным нелогичным и непонятным дерьмом на котором нельзя кодить в здравом уме совсем. то есть и запрещать то нe надо, а надо сделать так чтобы язык просто стал непригодным и тогда его сами бросят без всяких запретов. вот с помощью стандартов медленно но верно плюсы превращаются полную срань. а ведь это была платформа чуть ли не для самого мощьного языка этого столетия. собственно поэтому так и произходит.

начни они действовать иначе, более грубо, то массы могли бы пойти в обход запретам или заточили бы так все под эти стандарты но без потери в функционале. а так пропадает все желание что-то делать. вроде как оно вылилось в то во что вылелось, ну значит так том у быть. их ложь ужастна и методы коварны.

Assembler
()
Последнее исправление: Assembler (всего исправлений: 2)
Ответ на: комментарий от Assembler

Да. Автору забыли сказать ещё, что в IT многое недокументировано. Инорфмации по некоторым вопросом днём с огнём не сыскать. И делиться тонкостями технологий многие не спешат. Языки и стандарты переписывают и т.д.

Иногда программирование напоминает сказку: «пойди туда - не знаю куда. Принеси то, - не знаю что.»

AnonymUser
()
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

Автору забыли сказать ещё, что в IT многое недокументировано

Давай, примеры уже, и желательно не единичные, раз многое.

Иногда программирование напоминает сказку

И вот, что точно не нужно делать, так это демонизировать то, что не понимаешь.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

А никто не демонизирует. Автору напели о прекрасных аспектах IT, расскажите уж и об отрицательных.

Может так получиться, что программирование для неофита вне стен универа, компании, НИИ будет похоже на издевательство над самим собой. В том смысле, что без конкретного проекта и среды, он так и будет ходить по кругу: от чтения Кнута, до попыток писать на PHP.

AnonymUser
()
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от futurama

Ты бредишь.

Ты доктор? :)

Понятно что одной теории мало, но она обязательна до перехода к практике.

Ты кэп? :)

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

Наблюдательный кэп, но это было не мое утверждение.

А как кодить когда человек не понимает ни алгоритмы, ни структуры данных?

А предлагается понять и не задавать снова глупых вопросов :)

З.Ы. Ты выучил слово «дихотомия» и решил эффектно его ввернуть при случае. Неудачно вышло

Ты уныло зеркалишь. Сказать тебе очевидно нечего :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

И делиться тонкостями технологий многие не спешат

да бог с ними, нарыли инфы, ну это их инфа никто не требует. но вот когда ты заходишь и спрашиваешь как было тут с микрокотроллерами, то есть с проблемой чем шить из под линукс дистрибутива новые модели, и залетает куча прикормленных псов и подымают такой лай с требованием бана ТС что даже нехотя этого ты понимаешь в чем проблема нашей страны и народа. что так не только на форуме но и везде. а после когда все кто что-то хотел опускают руки и разбегаются они начинают задаваться вопросом, А ПОЧЕМУ ЭТО НАШИ БАНКОМАТЫ принмимают резанную бумагу вместо денег? а я скажу им так: это потому что нам прогрЫммисты не нужны.

Assembler
()
Ответ на: комментарий от vvn_black

Давай, примеры уже, и желательно не единичные, раз многое.

А чего далеко ходить, дай мне ссылку на документацию, где четко написано, как работает for для списков в питоне, чтобы я по документации видел как будет отрабатывать цикл for item in my_list, если my_list будет меняться. И как вообще можно бежать по списку в питоне, модифицируя его на каждой итерации.

И так в питоне по всему, почти нет документации по build-in, чтобы понимать как они работают. Только примеры, т.е. какие-то заклинания без четкого свода правил.

А ко всяким фреймворкам документация часто выглядит: делай так, будет это. И все. Хочешь понимать как сделать так же но с перламутровыми пуговицами – копай исходники.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от soomrack

И как вообще можно бежать по списку в питоне, модифицируя его на каждой итерации.

Лучше, конечно, так вообще не делать.

А так вот https://docs.python.org/3/library/functions.html?highlight=enumerate#enumerate

И так в питоне по всему, почти нет документации по build-in

https://docs.python.org/3/library/functions.html

Т.е. этого недостаточно? Тогда, вы уже требуете best practics, а не документацию.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Т.е. этого недостаточно?

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

И как вообще можно бежать по списку в питоне, модифицируя его на каждой итерации.

Лучше, конечно, так вообще не делать.

Вот ты, по-видимому, разбираешься в питоне, скажи, как в питоне бежать по списку, и удалять обработанные элементы из него? Так, чтобы это не выглядело как говнокод. Это вполне рядовая ситуация.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

скажи, как в питоне бежать по списку, и удалять обработанные элементы из него

Я это делаю через map-filter-reduce.

так, чтобы это не выглядело как говнокод

Тогда, list comprehension, но это уже вкусовщина.

vvn_black ★★★★★
()
Ответ на: комментарий от soomrack

В PHP похожая ситуация. Только там многие вещи сообщество разрулило, выкатили за 10 лет статей по каждой проблеме с разъяснениями. В этом смысле в PHP все грабли в основном описаны, но в целом - это работа сообщества, а не первичных разработчиков документации. Но даже это сводится на нет из-за частых нововведений. Я в итоге, фактически бросил PHP, из-за постоянного навязывания новых методов и особенно рекламы фреймворков. Уж лучше базовый простой С для тренировки и простых задач или вообще ничего (лучший код, которого не было). Слава богу, что я не попытался пойти в коммерческую разработку, когда почувствовал, что дорос до определённого уровня.

AnonymUser
()

Как стать футболистом? У них там контракты на миллионы долларов, мне тоже хочется. Я тоже иногда попадаю ногами по мячу, а дальше что?

thesis ★★★★★
()
Ответ на: комментарий от AnonymUser

Ну да. Окрыли двери для кучи идей и навалили кучу. В итоге непонятно что и как работает. Вот смотрю на все это (периодически нужно что-то писать на питоне) и думаю, что надо бы на перл возвращаться, или на JS переходить, он хоть стандартизован, хотя то еще гавно с его 1+2=12, но там хоть разобраться в этом можно, благодаря стандарту.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 2)
Ответ на: комментарий от NorthernBlow

Живя в 2$22 веке ты всё равно много чего делаешь с использованием компьютера. Попутно возникает куча моментов, которые стоило бы автоматизировать, а готового ПО нет. Вот и пиши что тебе лично нужно: телеграм-бот для оповещений об звонке домофона, прогноз погоды из любимого сервиса, конвертер файлов из формата какой-нить электронной энциклопедии, и тому подобные.

Та же теплица на абдурине - сама по себе обучит многому, микроконтроллер лучше всего даст понять, какие решения неоптимальны алгоритмически, или по использованию памяти, или же по таймингам. Если только не докидывать мегагерцов и рамы, как это делают мейкеры® с атмегой2560 8-)

Бери чужие программы и готовые библиотеки, используй для своих задач, дорабатывай, если чего-то не хватает - после 100500 переделки придёт понимание, чем тебя в данном случае ограничивала чья-то программа, как это починить, и как можно было бы её сделать изначально, чтоб была пригодной для твоего юзкейса.

мимо гуманитарий

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 2)
Ответ на: комментарий от soomrack

бежать по списку, и удалять обработанные элементы из него

Код, покажи код

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Точнее формулировку. А то странно получается, если обрабатывать список, то зачем удалять из него элементы? Или обработка по условию? Или вообще лучше очередь применить? Или что?

Да, пусть будет так:

Есть список заданий, который может обновляться, tasks, нужно последовательно его обрабатывать от начала к концу и удалять задания, которые удалось обработать, при этом, при обработке задания может так получиться, что создастся новое, которое будет помещено в конец списка или непосредственно после текущего. Вопрос, как это сделать на питоне без говнокода?

Скажем, фактически нужно:

for(auto task = tasks.begin(); task != tasks.end();) {
   Task new_task = proceed(task);
   if(new_task.type == NONE) {
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == REPLACE)
       tasks.insert(task, new_task);
       task = tasks.erase(task);
       continue;
   }
   if(new_task.type == PUSH_AFTER)
       tasks.insert(task, new_task);
       task++;
       continue;
   }   
   if(new_task.type == PUSH_BACK)
       tasks.push_back(new_task);
       task++;
       continue;
   }   
}

PS: совсем отвык без IDE набирать программы.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 6)

твоя проблема, судя по всему в том, что ты распыляешься. Тебя бросает от C++ до питона, Java и проч. (php, кстати, еще не пробовал?). А тебе надо двигаться от цели. Цель какая? Найти работу программистом, так? Если Питон выбрал - это, с одной стороны, правильно, а с другой - ты будешь конкурировать с сотнями миллионов таких же людишек, которым промыли мозги с «супер востребованная профессия, налетай, подходи! Пайтон раз-два-три». Ну да хрен с ним.

Алгоритм действий у тебя должен начинаться не с чтения алгоритмов и матана, а с чтения вакансий и баззвордов, которые в них находятся.

И дальше ты обкладываешься литературой и курсами именно по этим ЯП и фреймворкам, и (!) не пытаешься сделать что-то полезное сразу. Это самая твоя большая ошибка - ты хочешь показать какой-то рабочий проект работодателю? Все эти ненужные поделки он уже видел, и они его не впечатлили. Тебе архитект и синьер будет рассказывать, за что платят деньги у них. А твоя задача сделать так, что твое резюме было привлекательным, чтобы ты не завалил собеседование, и чтобы тебя взяли на самую первую работу.

Алгоритмы почитывай, конечно. Но учти, что карьера большей части программистов такая: неопытный кодер -> опытный кодер -> синьер -> тимлид/ПМ.

Про матан и задачки про гномиков тебе будут задавать престарелые синьеры, которые хотят показаться умнее, чем они есть на самом деле, с какими-то невсратыми аналитическими скиллами, которых у них, опять таки, никогда не было. Просто выучи базу: как переводить числа из одной двоичной системы в другую, что такое О-нотация, выучи вывод сложности quicksort.

seiken ★★★★★
()
Ответ на: комментарий от seiken

Про матан и задачки про гномиков тебе будут задавать престарелые синьеры, которые хотят показаться умнее, чем они есть на самом деле, с какими-то невсратыми аналитическими скиллами, которых у них, опять таки, никогда не было

Не советую настраивать человека на мышление в подобном ключе (да и самому так думать).

Exmor_RS ★★★
()

Я могу взять чей то код, могу даже починить его и заставить работать - НО НА ЭТОМ ВСЕ.

Это уже очень много для джуна, поверь. Ты что, хотел сразу в архитекты и синьеры попасть? Жрать стейки в ресторане с клиентом, рисовать диаграммы и раздавать таски падаванам? Так оно не работает. Начинают люди всегда с окопных позиций.

seiken ★★★★★
()
Ответ на: комментарий от Exmor_RS

пожалуй, ты прав. Могут быть и молодые синьеры с комплексами «почему я не PhD», не только престарелые. На самом деле, я и сам почитываю иногда что-то по истории или ту же википедию, чтобы узнать что-то новенькое, не имеющее никакого отношения к зарплате.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)

прогать не на линухе не тру

От этого определённо надо отвыкать, если ты хочешь зарабатывать программированием (и не только), а не заниматься ментальной мастурбацией на свой «прекрасный» образ.

У меня цель простая, хочу писать ПО для микроконтроллеров и вебом как-то на хлеб зарабатывать.

Объективно думаю шансов мало.
Посмотри вакансии и зарплаты для начинающих и посмотри сможешь ли ты обеспечить семье прежний уровень жизни?

Awesome и конфиг на луа не сделают из тебя программиста, это опять же акт ментальной мастурбации (удобный самим программистам).

Но как научиться строить программы?

Тут помогут только сложные задачи: скрипты/gui/игры с множеством функций. Только со сложностью приходит необходимость думать об архитектуре.

Ну и повторение других проектов (гора убийц grep'а не даст соврать).

Программист, это тот кто программирует и решает проблему пользователя, а не тот кто использует очень мега-крутую-кулхацкерскую-ос.

Exmor_RS ★★★
()
Последнее исправление: Exmor_RS (всего исправлений: 1)
Ответ на: комментарий от seiken

Ах да, на счет готового проекта - надо иметь просто под рукой условный «хелловорлд» велосипед, по которому работодатель мог бы оценить, на сколько хорошо он структурирован по директориям, выдержал ли стиль программирования, принятый в используемом ЯП, на сколько читаем сам исходник, есть ли так доксиджен (или что там в питоне модно?). Являются ли коммиты системы контроля версий атомарными, и на сколько полно объясняют все изменения. Есть ли автоматизированные тесты (хотя бы юнит-тесты). И если нет полного покрытия тестами, то почему, и как бы ты обеспечивал контроль качества написанного ПО (на это надо иметь какой-то готовый ответ, пусть даже вплоть до пошлого «сдадим в конце очередного спринта продукт клиенту, и он сам протестирует», но тогда надо понимать, почему может быть сложно сделать что-то другое в плане контроля качества).

Т.е., по качеству самого кода, и самое главное, подходу к разработке, смогут ли с тобой работать люди или тебя придется сначала учить и отправлять в «детский садик» на испытательном сроке.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от thesis

Как стать футболистом?
Я тоже иногда попадаю ногами по мячу, а дальше что?

ТРЕНИРОВАТЬСЯ.

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

Assembler
()
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от Roy-Batty

И не говори.

Я вот до сих пор не понимаю, как организован for … in list в питоне. Он вызывает iterator для list, т.е. создается структура-массив [(0, item1), (1, item2), ...], но сама она не генерируется, это вроде как отложенное создание. Потом цикл for заводит индекс, которым начинает пробегать по этому массиву, эта переменная-индекс-для-for хранится. Но внезапно мы взяли и изменили список внутри цикла, скажем резанули голову, что произошло дальше? Iterator будет повторно вызван, или он как-то сам пересчитает, без повторной пробежки по списку? КМК, он тупо будет вызван повторно, НО (!) при этом переменная-индекс-для-for не будет пересчитана (!) и цикл продолжится, т.е. если мы срезали голову, то тем самым неявно мы пропустили один элемент в списке, т.к. индекс текущего реально стал на 1 меньше, а это нигде не учлось. Но это все мои догадки, по тем заметкам, которые питон называет документацией и по фактическому исполнению кода питона. Как там на самом деле – для меня тайна, да и даже то, что я обрисовал тут оставляет кучу вопросов о том какие данные дергаются в процессе всего этого, и сколько раз.

soomrack ★★★★★
()

Сейчас сижу просто над очередным проектом буквально сутки и не сдвинулся ни на шаг. Когда уже оно пойдет, кто знает? Что делать, как практиковаться?

а зачем тебе «очередной проект»? ты уже хочешь что-то сам продавать или тебе для собеседования нужно портфолио? Пилить можно один и тот же проект (причем, он может быть бесполезным от слова полностью), усложняя его (или упрощая)

seiken ★★★★★
()
Ответ на: комментарий от Assembler

если уж заговорили про футбол то надо постояно давать пас кому-то чтобы они не смогли отобрать

тут опять важное замечание, что с пасами нужно быть осторожнее потому что многие в вашей команде играют совсем не за вас!
Assembler
()
Ответ на: комментарий от seiken

вот я тебе могу, например, еще один подкинуть проект, который можно пилить до пенсии, и так и не выпилить.

Юз-кейс, как говорится, такой. У тебя дома компы, их много, и надо их включать/выключать удаленно, и иметь возможность из любой точки интернет проверить, включен тот или иной комп или нет. Причем, просто слать WoL сигнал не достаточно (хотя и это может быть фичей). Надо уметь удаленно обрубать отдельные компы по питанию.

И так, чтобы никто не смог кроме тебя ни мониторить, ни рулить компами. И даже понимать, что за трафик идет из точки А в инете до твоего дома и обратно.

seiken ★★★★★
()
Ответ на: комментарий от soomrack

Как-то так:

tasks = [...]
while tasks:
    task = tasks.pop(0)
    res = proceed(task)
    
    if res is Result.complete:
        continue

    if res is Result.replace:
        tasks.insert(0, task)
        
    if res is Result.after:
        tasks.insert(1, task)
    
    if res == Result.back:
        tasks.append(task)

Upd. Но мне не нравится сама задача, я за то, чтобы переделать на какую-то очередь. И уж точно против изменения коллекции при её итерации.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

tasks.insert(0, task) и в аналогичных местах – погодь, тут не обязательно в начало добавлять, ведь уже могли быть задания, которые неудачно обработались, и они уже позади текущего.

Сама задача это, например, просто webcrawler с приоритетом обхода текущего сайта, перед переходом к следующему, т.е. есть список урлов и вполне возможно, что некоторые урлы скачать неудалось, а потом удастся.

Переделать на очередь? Ну [linked] list как раз предоставляет инфраструктуру очереди, соотв. вполне естественно использовать для этого list. Если коллекция изменяема, то почему бы ее и не менять?

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

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

и теперь

погодь, тут не обязательно в начало добавлять, ведь уже могли быть задания, которые неудачно обработались, и они уже позади текущего

ну, какое было задание такой и вариант решения.

Есть пул урлов, он должен уметь принять урл для обработки и уметь отдать урл. И есть обработчик - ему фиолетово на логику, он получил урл - вернул результат. Соответственно, пул должен уметь приоритезировать урлы.

Если пул сложнее списка, то и не надо обычный список использовать, пусть будет структура сложнее.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

ну, какое было задание такой и вариант решения.

Не-не-не, в задании это было оговорено, что «удалять задания, которые удалось обработать», т.е. может быть и не удалось обработать, и пример моего кода на С++ это демонстрировал.

Если пул сложнее списка, то и не надо список использовать, пусть будет структура сложнее.

Ну т.е. в питоне для этого базовых типов нет, нужно создавать свой? Получается, что в С++ это сделать тупо быстрее, а код будет понятней.

Просто возникает некоторое непонимание что есть что в питоне. Список есть, а получение следующего элемента по предыдущему – нету, только через индексацию, которую нужно будет обновлять при изменении списка, т.е. это не список, а по сути, массив. А если это массив, то какого черта он заводит для него итератор при цикле for и делает еще кучу ненужных вещей, когда надо просто пройтись по индексу….

Вот и получается, что вместо короткого кода, мы начинаем создавать свои структуры, все распухает и начинает выглядеть как говнокод. Бесит.

PS: в данном примере, я бы на питоне сделал бы как ты while, но завел бы еще один список, куда скидывал бы зафейленные задания, после цикла соотв, этот список бы перекинул на место опустошенного текущего. Тогда действительно, все время работаешь только с головой списка. Но это такое решение, немножно костыльное, и при небольшом усложнении задания нужны будут другие костыли, если воообще их удастся придумать. Но правильней будет написать свою структуру, что некоторый overhead разработки для такого простого задания.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 4)
Ответ на: комментарий от soomrack

как организован for … in list в питоне

FOR_ITER(delta)

    TOS is an iterator. Call its __next__() method. If this yields a new value, push it on the stack (leaving the iterator below it). If the iterator indicates it is exhausted, TOS is popped, and the byte code counter is incremented by delta.

TOS - top-of-stack

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от soomrack

А если это массив, то какого черта он заводит для него итератор при цикле for и делает еще кучу ненужных вещей, когда надо просто пройтись по индексу….

Всегда в таких случаях вспоминаю видюшку WAT.

Exmor_RS ★★★
()
Ответ на: комментарий от vvn_black

И? Что происходит с iterator, когда структура обновляется?

soomrack ★★★★★
()
Ответ на: комментарий от vvn_black

И объясни мне, только согласно документации, пожалуйста, почему

    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    sum = 0
    for item in my_list:
        my_list.pop(0)
        sum = sum + item
        
    print(f"sum = {sum}")

выводит:

len(my_list) = 100000
sum = 50000

исполняется, секунды, а если степень поменять на **6, что будет выполняться оооочень долго.

Но при этом, если закомментить строчку my_list.pop(0) ты вывод будет 10000 и 10000, а исполняться будет мгновенно, в т.ч. и для **6.

Что там по факту происходит «под капотом» этих выражений?

PS: в питоне в цикле for менять коллекцию не стоит, по-хорошему, ее бы стоило делать immutable на уровне языка.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 2)
Ответ на: комментарий от Exmor_RS

а зачем там pop делать? не проще потом весь лист удалить? (очевидно извлечение из листа дорогая операция)

Это суть примера, про который я спрашивал выше, когда удаляем задания. Вообще-то удалить из списка это очень простая операция, обычно считается, что O(1), а вот из массива – да, дорогая O(n), собственно, этот пример косвенно свидетельствует, что тут не список, а массив…

А так то я привел пример говнокода для питона, который говнокодом во многих других языках не является, т.е. сделать такую вот запись дрянью это изобретение питона.

Причем цикл while не позволяет перебирать элементы, т.е. для перебора нужно его самостоятельно индексировать, в итоге если кто-то хочет бежать по списку и его модифицировать, то он естественно попробует for item in и получит вот такое вот, но не поймет почему (и результат в два раза меньше ожиданий и скорость убийственно медленная)!

В целом этот пример питоно-говнокода дан исключительно, как пример простого кода, который я бы хотел понять как работает в деталях, какова сложность его вычислений и т.п.

PS: а если сделать for k, item in enumerate(my_list), то ничего не изменится, ни по выводу, ни по скорости. Потому что цикл for сам делает этот enumerate указано это или нет, кмк.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 2)

Ещё есть такая важная вещь, очень простая, но её трудно усвоить и легко забыть. Когда что-то делаешь (не только программирования касается), очень важно понять, чего не хватает для выполнения той или иной задачи, то есть всегда в момент ступора имеет смысл останавливаться и спрашивать себя, чего не знаешь.

Без конкретных целей и методов обучения (как минимум чтения классических учебников) программирование может превратиться в разгадывание головоломки, вроде кроссворда, бесконечное рытьё в поисковиках и просто трату времени.

О психологии добавлю. Имея постоянно дело с дискретными структурами, программисту приходится перестраивать своё мышление таким же образом и даже в некоторых аспектах сам образ жизни (от чего, кстати, могут начать страдать окружающие, например, ближайшие родственники и т.д.).

AnonymUser
()
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от soomrack

my_list.pop(0)

Если не ошибаюсь, то этот вызов добавляет в каждую итерацию:

  • запихнуть в стек ссылку на my_lyst
  • получить метод pop, при этом my_lyst из стека убирается
  • запихнуть в стек индекс
  • дёрнуть CALL
  • получить из стека результат
vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

А как бы это прочитать в документации? И я еще не понял из этого объяснения, почему результат в два раза меньше стал? Я не издеваюсь, мне действительно интересно понять, как оно там работает. Потому что это важно с т.з. написания кода, нужно понимать какие операции чего стоят по времени, какие данные они затрагивают, и что из себя в действительности представляют базовые структуры данных.

soomrack ★★★★★
()
Ответ на: комментарий от vvn_black

А глубже? Чтобы увидеть байт код для инкрементации переменной цикла, для того как происходит iterator() и пр.? Этот код мне ничего не говорит о механизмах исполнения цикла for, он говорит только то, что я сам написал в теле цикла.

PS: это, конечно, не документация, но если это позволит докопаться до истины, то хоть что-то.

soomrack ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)