Как стать автором
Обновить

Комментарии 168

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

Если в статье написано как есть на самом деле, то это достаточно неплохой успех. Осталось только найти дельное применение.

P.S.: Tkinter -- это не python-way на мой взгляд. Так просто сложилось, что он больше привязан (шутка для тех, кто в теме) к Tcl/Tk, чем к идеям питона.

Автор Tkinter — Гвидо ван Россум, куда уж более python-way

Там дело в том, что это простой binding на библиотеку Tk GUI. То есть, интерфейс остался как если бы это был C код со всеми вытекающими. Для python-way надо добавлять ещё один слой абстракции, что бы не видеть этого ужаса внутри.

Думается мне, что использовать вместо стандартного tkinter какой-нибудь PyQt во-первых тоже не очень Python way, а во-вторых заметно сложнее, учитывая что автор новичок. Ну и собсна это та ситуация, когда имеет смысл предлагать альтернативы, которых вы так и не назвали.

С PyQt не работал, но не удивлюсь, что там тоже тонкий слой связки с C библиотекой и потому это идейно больше C, а не Python.

Я как раз для новичков советую брать не GUI (разве что если не надо GUI для какого-то реального проекта вот прямо сейчас), а что-то типа Web разработки или такого плана.

К сожалению, для GUI я не знаю альтернатив. Но альтернативы для обучения предложил выше.

что там тоже тонкий слой связки с C библиотекой

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

С одной стороны браузер неплохой вариант, но тогда проще выкинуть питон и сразу за JS сесть. Зависимость от браузера не сказать, что сильно лучше, плюс ограничения в браузере определённые имеются. Написать какой-нибудь калькулятор, который держит коннект с сервером кажется не очень хорошей идеей.

Если цель -- просто научится кодить, то можно и JS. Но если целью является освоение питона, то вариант с JS для новичка будет сомнителен.

А так на том же питоне можно сделать много интересных Web проектов без использования JS.

НЛО прилетело и опубликовало эту надпись здесь

У меня нигде не написано про фронт на питоне. Речь про обучение. Конечно, питон на серверной стороне. Откуда вдруг информация, что речь про питон на фронте?

Сегодня сложно представить мало-мальски сложный сайт, для которого понадобился бэк на питоне, без фронта с использованием JS и CSS.

Для целей обучения питоном? Примеров миллион. Да что там примеров, есть куча таких сайтов в проде даже сегодня. Это обычные нетребовательные сайты с минимальным динамическим контентом. Если там и есть JS, то там даже не используется ajax, а совсем базовая функциональность.

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

Я не утверждаю, что это нельзя. Речь была о серверной стороне для обучения. Всякие экзотические применения питона для этого малоэффективны.

НЛО прилетело и опубликовало эту надпись здесь

Да, я надеюсь, в будущем возникнет какая-нибудь прикладная задача, чтобы освежать знания. Спасибо за похвалу! :)

Учить что-то ради того, что бы это выучить -- то ещё неблагодарное занятие. 

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

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

Для фитнеса можно задачки по математике решать. Там можно найти этого "фитнеса" на любой уровень подготовки и потом уровень поднимать если есть желание.

"Только познакомившись с программированием, я действительно понял, как люблю свою основную работу." - читается в последних двух абзацах.)

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

Повезло, у меня полно примеров обратного.

Хотел написать, что похоже на рекламу учебного курса и ИДЕ от ДЖетбрэйнз.

Я бы тогда ссылку на курс с ютм-ками повесил :)

Насчет ИДЕ Джетбрейнз — что дали на курсе, в том и разбирался.

А лучше варианты есть?

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

Отладчик, консоль python.. Удобно же. Не вижу повода себя ограничивать.

НЛО прилетело и опубликовало эту надпись здесь

Ну PyCharm уж точно в рекламе не нуждается, тем более, что из альтернатив остается только VS Code, обвешанный плагинами для достижения сопоставимого функционала.

Я еще на Visual Studio на питоне себя неплохо чувствую, пусть это, наверное, и извращение

Да, не моё точно

Я долгое время пользовался Eclipse с питоновским плагином. Но потом как-то переполз на VS Code и понял, что и тут все вполне неплохо и юзабельно.

Когда мы утверждаем, что нечто равно чему-то, нужно ставить “=”. Когда мы проверяем, что нечто равно чему-то, нужно ставить “==” [...] А PyCharm не писал, что это ошибка

Не, это не реклама, а клевета. По крайней мере в условных конструкциях с if/while pycharm точно ругался бы на одинарное равно.
А вот при создании булевых переменных, там да, может быть неоднозначно. Хотя наверняка задетектится ошибка неиспользуемой переменной.


Да, проверил, и правда подчеркивает. Видимо, я просто долго забивал разбираться :(

Согласен, только второе не нуждается в рекламе, поэтому остаётся только первое. И, на мой взгляд, не просто "похоже".

Это нормально если Вы еще учитесь. Вот сейчас все педагоги страны страдают на "Коде будущего" обучая школьников программированию по похожей схеме (она действительно универсальна). Сложность итогового проекта, конечно, попроще, но в целом так же. 10 класс такой проект вполне тянет.

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

Согласен насчет опасной иллюзии. Увы, "инфобизнесмены" усиленно ее поддерживают.

Насчет цели — тоже верно, без конкретного проекта на финише мотивация совсем не та.

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

Интересно, а как примерно выглядит путь до этой формошлепской работы? Какие минимальные знания требует работодатель от такого ремесленника?

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

Вы ещё скажите, что ВУЗы не нужны.

Это лучше вы за меня еще что-нибудь скажите - у вас хорошо получается!

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

Но в 1984(?) году я писал программы на Фортране, и мама относила на ЕС ЭВМ пробивать на перфокартах. Я учился в 8 классе, но мне было очевидно, что такое переменная в цикле и даже что делать с рекурсией (в Фортране тогда были только статические переменные, надо было все переменные превращать в массивы со счётчиком уровней)

Вопрос: в чем разница в голове? Возможно автор гуманитарий? Интересно узнать его жизненный путь ДО изучения Питона

О, вы крутой!)

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

Мне кажется изучение языков как раз ваше если вы переводчик. У языка для компьютера все то же самое что и в человеческих языках, синтаксис, грамматика, семантика.

У языка для компьютера все то же самое что и в человеческих языках, синтаксис, грамматика, семантика.

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

Я думаю учебник по геометрии переводить то же не возметесь не изучив предметную область.

Согласен, в программировании язык сам по себе — это самая верхушечка айсберга, в отличие от человеческих языков.

В отличие? В человеческих тоже надо ой как много знать помимо грамматики, чтобы написать приличный роман или монографию.

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

Ой ли?

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

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

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

Все правила максимально формализованы, исключений и разночтений нет. В чем по вашему разница. Перевести с C++ на Lisp то же та еще задача. Как переводчик, человек професионально занимающейся языкознанием, какие проблемы у вас были при изучении компьютерных языков ?

Например произношение в английском, насколько оно формализовано? Почем по этим строгим правилам гласные в read читаются как в слове lead, a в read как в слове lead?

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

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

"Гуманитарий" вообще не показатель, так как всё очень сильно будет зависеть от предметной области. Недавно читал тут статью от человека который на rust писал плагины для музыкального софта. При этом он себя программистом или технарем — не ощущал, если память не изменяет.

Программирование это еще один инструмент который может помочь решить вашу проблему если она решаема через программирование. Инструменты надо по месту выбирать)

Но в 1984(?) году я писал программы на Фортране, и мама относила на ЕС ЭВМ...

Сразу представил, как мама несет автора коммента к большим шкафам. Но дальше не срослось)

в любом треде найдет чел, который с детского сада писал программы. И очень удивляется, почему не все так.
У Вас в школе весь класс писал на фортране и на перфах относил мамам? или просто вот совпала, Мама-прогер и сын с теми же увлечениями?
Я в 8-ок классе учился в 90-х. Никакого фортрана не было. Алгебра была, физика была. Информатики не было. В Вузе был у нас кусочек бейсика. В бейсике циклы пишутся вообще не так как в питоне (от слова "совсем"), поэтому мои умения писать "go to" вообще не пригодны для питона

Закончил школу в 1990, информатика была, писали на псевдоязыке,


начало
 нц
  пока x<3
   y=y+1
  x=x-1
  кц
конец

Помню делал 4 варианта на контрольных и пол класса списывало, а училка ставила 3 за неакуратность(яж писал, ошибался и исправлял). А потом решила выслужится и послать на олимпиаду по информатике, а ей по бороде, отценки, дескать, не подходящие для олимпийца).

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

Кстати, примерно так и сейчас пишу, потом перевожу на bash, python или JS, такой я переводчик, не думаю на пайтоне, а перевожу на него)

Пысы, я не программист.

Угу, на бейсике пишется иначе

Кстати, примерно так и сейчас пишу, потом перевожу на bash, python или JS, такой я переводчик, не думаю на пайтоне, а перевожу на него)
Да вы, батенька, компилятор из промежуточного языка! Почти как CLR/LLVM/etc.
Вчерашним «выпускникам филфака», к которым с натяжкой отношу себя и я
Но ведь всё, описанное в статье, входит в школьную программу. Неужто за 15 лет забылось за ненадобностью?

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

Неужто за 15 лет забылось за ненадобностью?

Честно говоря мне кажется что многое забывается через пару лет, если не используется в жизни, да если повторить, то вспомнить будет быстрее чем изучать с нуля, не знаю как у вас было, но если вспоминать школу, то после лета 90% людей на условной математике/информатике ничего не могли вспомнить и им нужно было 3-4 урока, чтобы снова вкатиться в это, а тут 15 лет прошло, почти любой человек забудет.

Забывается многое, но не то, что стабильно повторяли раз в неделю на протяжении нескольких лет. Сужу по себе – из нелюбимой химии помню мало, но постоянно используемые валентности, популярные кислоты и прочее такое – зачем-то занимают место в голове уже двадцать лет ) Если сравнить с информатикой – то это, кмк, те же основы, что и цикл, функции и т.д.
Но если у автора на информатике был только HTML – трудно, конечно, помнить, что такое рекурсия.

Но ведь всё, описанное в статье, входит в школьную программу.

Школа школе рознь, мы в 11 классе делали презентацию в PowerPoint на тему "как я провёл лето", обязательно с музыкой.

О, знакомые методички -)

"первый элемент списка — он для питона не первый" - так во всех языках программирования, это не прихоть именно python)

В своё время проходил бесплатный курс от stepic, "программирование на python", не имея никаких познаний в языке, и это было для меня отличным стартом, рекомендую кто думает с чего начать. А дальше уже книги, практика...

Спасибо за рекомендацию, может, продолжу степиком.

"первый элемент списка — он для питона не первый" - так во всех языках программирования, это не прихоть именно python)

В некоторых языках принято с нуля, в некоторых с единицы - нет тут консенсуса.
С нуля исторически в языках, которые ближе к железу. Ну, питон просто из С взял, насколько понимаю.
С единицы чаще для языков, приоритет в которых на математическую/научную работу, типа Fortran, Julia, Mathematica, Matlab, R. Ещё популярный Lua туда же.

Не во всех. К примеру, в lua первый элемент имеет индекс 1. Насколько я понимаю, причина в том, что большинство массивов — это некоторая область памяти, в которой по порядку располагаются элементы. Если первый элемент имеет индекс 0, то он расположен по адресу (начало массива + 0 ∙ размер элемента). Если 1 — то по адресу (начало массива + (1 − 1) ∙ размер элемента). Т.е. на вычисление адреса элемента нужно потратить на одну инструкцию больше.


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


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

Я помню, как паскаль взрывал мне мозг, т.к. массивы там нумеруются с нуля, а строки с единицы. Из-за этого постоянно путался.

Гнусная клевета на Паскаль: там обе границы массива задаются явно, хоть [-10..10], хоть ['a'..'z']

Массивы да, но строковый тип string нумеруется с единицы. Если не верите, можете сами попробовать обратиться к нулевому элементу string[0].

Потому что в нулевом элементе хранится длина строки.

Это в старых паскалевских строках. В 21 веке использовать, пожалуй, моветон.

Почему? Delphi весьма не плох для своих задач.

В Delphi вроде как завезли zero-terminated strings.

Паскалевские строки - они не только короткие, но ещё и 8-битные, с unicode может получиться неудобненько.

Возможно вы имеете в виду PChar. Но, весь строковый функционал получил string, в котором так же первый символ по прежнему начинается с единицы.

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

На самом деле нет: в качестве базового адреса используется адрес на одну ячейку перед первым.

Или что для проверки корректности индекса, начинающегося с нуля, нужно просто сравнить его один раз с длиной массива. Для проверки корректности индекса, начинающегося с единицы, нужно ещё сравнить его с нулём.

Если мы про Python, Java и т.п. языки, отказавшиеся от поддержки беззнаковых целых, то сравнения с нулём всё равно не избежать.

В общем, для компьютера разницы нет никакой, разница есть только для людей.

А можно пример про сравнение корректности индекса? Сначала не понял, и потом каак не понял :(

Если массивы с 0, то отрицательные индексы некорректны

На самом деле нет: в качестве базового адреса используется адрес на одну ячейку перед первым.

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


Если мы про Python, Java и т.п. языки, отказавшиеся от поддержки беззнаковых целых, то сравнения с нулём всё равно не избежать.

В общем, для компьютера разницы нет никакой, разница есть только для людей.

У Python есть отдельная семантика для отрицательных индексов. Конкретно для него был бы другой вопрос, если бы он начинал индексы с единицы: почему в нуле дырка (или что‐то ещё более неожиданное).
У Java: нет, сравнение с нулём все ещё не нужно на большинстве машин, если вспомнить, как представляются знаковые целые в памяти.


Для компьютера разница была пока улучшения в процессоре и оптимизирующих компиляторах её не убрали.

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

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

У Python есть отдельная семантика для отрицательных индексов. Конкретно для него был бы другой вопрос, если бы он начинал индексы с единицы: почему в нуле дырка (или что‐то ещё более неожиданное).

Конкретно про него -- у людей, не травмированных Си -- возникает вопрос, почему элементы нумеруются то с нуля (в начале списка), то с единицы (в конце). Намного менее неожиданной для них была бы нумерация 1, 2, 3... с начала, -1, -2, -3... с конца, и IndexError в нуле.

У Java: нет, сравнение с нулём все ещё не нужно на большинстве машин, если вспомнить, как представляются знаковые целые в памяти.

Я не понимаю, о чём вы.

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

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


Я не понимаю, о чём вы.

Дополнительный код. Все отрицательные числа в нём больше, чем положительные, если вы сравниваете число, как если бы оно было беззнаковым. Многие современные компиляторы знают, что i32val >= len || i32val < 0 — это то же самое, что и (i32val as u32) >= len (при условии, что известно, что len >= 0). Вот, к примеру, результат компиляции на Rust:


use core::hint::unreachable_unchecked;

pub fn invalid_index(index: usize, len: usize) -> bool {
    index >= len
}

pub unsafe fn invalid_index_i_unsafe(index: isize, len: isize) -> bool {
    if len < 0 { unsafe { unreachable_unchecked() } }
    index >= len || index < 0
}

pub fn invalid_index_i(index: isize, len: isize) -> bool {
    index >= len || index < 0
}

playground::invalid_index:
    cmpq    %rsi, %rdi
    setae   %al
    retq

playground::invalid_index_i_unsafe:
    cmpq    %rsi, %rdi
    setae   %al
    retq

playground::invalid_index_i:
    cmpq    %rsi, %rdi
    setge   %cl
    testq   %rdi, %rdi
    sets    %al
    orb %cl, %al
    retq

Конкретно про него -- у людей, не травмированных Си -- возникает вопрос, почему элементы нумеруются то с нуля (в начале списка), то с единицы (в конце). Намного менее неожиданной для них была бы нумерация 1, 2, 3... с начала, -1, -2, -3... с конца, и IndexError в нуле.

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

Но после последнего всё равно IndexError, а не первый :-/

Тут не только оптимизации, но ещё и уменьшение количества ошибок и повышение читаемости.

Например, если есть массив длинной n * m, то если мы считаем индексы с 1, то обратиться к элементу (i,k) уже становится весьма коряво (i - 1)*n + (k - 1) + 1, что быстро привёдет к оптимизации (i -1) * n + k, а вот эта -1 будет всех путать. Да, для этого есть многомерные массивы, для которых компилятор всё это под капотом сделает, но ситуации бывают разные, это просто пример.

Ээ, а можно пример, когда выписывание вот всей этой арифметики вместо многомерных массивов ведёт к уменьшению количества ошибок и повышению читаемости?

Многомерных массивов может «не быть»: я не говорю о том, что язык их не поддерживает (хотя иногда и такое бывает), а о том, что способ их реализации не подходит для вашей задачи. Из языков, которыми достаточно часто пользуюсь лично я, многомерные массивы вида «один большой кусок памяти плюс набор размеров массива» (один из наиболее производительных вариантов) со всеми размерами определяемыми во время исполнения без библиотек поддерживает только LabVIEW. (Со сторонними библиотеками — все, если не считать различные DSL.)

Ну в качестве простого примера - работа с файлами. Чтение и запись. Т.е. вы можете представить файл как одномерный массив, а можете долго и упорно собирать его в многомерный. И если для простых ситуаций - это ещё не очень страшно, то для более сложных, типа прочитай мне из файла данные по позиции (i, j) уже начнётся такая математика.

Да и в целом, эта единица будет лезть везде. Сколько операции будет при проходе по массиву с индекса 2 по 10? 10 - 2 + 1, а двух массивов одного с 2,10, другого с 3,7? 10-2 + 1 + 7 - 3 + 1. У нас уже Не единица, а двойка вылезла.

А если мы делаем простой кольцевой буфер размера N, то вместо того, чтобы крутить индексы через i % N мы начнём городить извращения вида (i - 1) % N + 1

Сколько операции будет при проходе по массиву с индекса 2 по 10? 10 - 2 + 1, а двух массивов одного с 2,10, другого с 3,7? 10-2 + 1 + 7 - 3 + 1. У нас уже Не единица, а двойка вылезла.

Уж это-то от базы никак не зависит

Оно зависит как раз терминологией. При индексации с нуля есть договорённость, что отрезки определяются как [..) - включение левого и исключение правого. Т.е. склейка объектов не приводит к дублированию индекса, который приходится вырезать этой единичкой. Также универсальнее получаются методы поддиапазонов, т.е. допустимо взять поддиапазон из 0 элементов. substring(5,5), при индексации с единицы, получится substring(5,4) - что совсем уж крипово.

Вы так говорите, как будто при индексации с 1 есть договорённость, что отрезки включают правую границу?

Но ведь нет никакой связи между базой и способом задания правой границы.

А тут нам пригодится теория чисел. Ряд [0,1,2,..n-1] - это система вычетов по модулю n. С такими обьектами можно делать привычные математические операции. Это удобно. А если убрать 0 - начинаются сложности. 2-2=? например. Нужно помнить, что иногда нужно +1, иногда -1, и не перепутать.

PS А если n - степень двойки, то это unsigned int ;)

Ну, чисто справедливости ради - в подавляющем большинстве. В некоторых все-таки с 1, а в особо интересных (как ST) - можно и свои старт/конец задавать (и по желанию нумерация будет идти сразу с 12, к примеру, или любого другого целого числа)

А подскажите, пожалуйста, где вы учились?

Я уже год, как подбираю курсы и не могу найти((

Или вообще нужно в какое-то высшее учебное заведение подаваться?

Заранее спасибо ??

Не ТС, но я бы посоветовал Вам бесплатные курсы со Stepik, там достаточно хороший выбор для старта и понимания, какая область нравится

Вы о профессии переводчика или о программировании? Если первое - учился в МГОУ (который "областной"), не советую повторять мой путь. Если второе - курс на платформе LearnHub размещен.

Спасибо!

Ghostwriter, он же литературный негр. Ничего государственного, чистый бизнес :)

Остербайтер словом)

Это какая-то очень неудачная калька

Да, на русском звучит не лучшим образом, но альтернатив особо и нет, когда говорим о человеке, который пишет вместо другого. Слово у нас понемногу закрепляется, но до словарей не дошло пока. Эквивалент "литературный негр" не выдерживает современных этических норм, ну и как-то архаично звучит уже.

В России слово негр означает того, кто работает. Это оскорбление нынче?

Это жаргонное значение, не норма языка.

В западных странах негр как nigger — это оскорбление, это тоже фактор не в пользу "литературного негра". На каких-нибудь международных переговорах скандалом может обернуться.

Да и слово "литературный" здесь ни к месту, большУю часть того, чем нынче занимаются гострайтеры, литературой в классическом понимании не назовешь. Слишком разнообразен стал текстовый контент с развитием интернета.

а я подумал, писатель гостов или по гостам

Как первый язык Питон плох. Слишком гибкий, слишком много возможностей. Лучше потратить год на Турбо Паскаль и решение задач. Для этого не нужны курсы: полно учебников и сборников задач для школьников и студентов. И с паскалем поможет почти каждый.

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

А то, что он считается уже устаревшим языком?
Просто везде все пишут уже о совершенно других, а о Паскале слышал последний раз в школе)

Ответил чуть ниже.

потратить год

За целый год можно достичь и чего-то более полезного чем выучить Паскаль ;)

После года Паскаля у вас будет понимание структур данных и алгоритмов.

Понимание структур данных и алгоритмов с паскалем никак не связано. Разве что в некоторых учебниках алгоритмы описываются на паскале-подобном псевдоязыке ;)

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

Ну, не учили решать бизнес-задачи - вот и не умеет. Тут надо ещё и в предметной области разбираться.

Я вижу то, что вижу. Ни один вайтишный питонист не знает толком, как устроен список или хеш-таблица. Нужно обойти список словарей и составить словарь со списками -- все, не может. Учиться тяжело, и учеба требует инструментов. Тот же паскаль -- идеальный яп для обучения. Но все хотят скорей окончить курс и получать 100.500 денег в минуту.

Ни один вайтишный питонист не знает толком, как устроен список или хеш-таблица

А должен? Структуры данных и алгоритмы - это совершенно отдельный курс. И автоматически к знанию паскаля не прилагается ;)

Прилагается. Полистайте задачники по Паскалю.

Книжка даже такая была. На Паскале

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

незнание базовых структур типа словарей

Это называется соломенное чучело ака подмена тезиса. Если кто-то, изучая python, прошел мимо встроенных типов данных - тут, наверное, не в python дело?

Как написал igrishaev "обойти список словарей и составить словарь со списками", это что, требует по вашему отдельного алгоритмического курса?

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

Ваш комментарий хорош для обсуждения идеального подхода обучению программированию в вакууме и не применим к реальной жизни.

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

По поводу вайтишников - после года паскаля у вас будет ТОЛЬКО понимание структур данных и никому на одно место не упавшего паскаля и никто вас не наймёт, а того, кто эти полгода учил фронтэнд и реакт и ознакомился с базовыми понятиями информатики и алгоритмами уже работает как полгода и клепает формочки и продолжит активно учиться.

"Но все хотят скорей окончить курс и получать 100.500 денег в минуту."

Представляете? Да, люди хотят работать за хорошую зп, а не за копейки. А вы никогда не думали почему? Меня возмущают подобные комментарии потому, что люди их пищущие пытаются принизить людей которые хотят переучиться из других профессии во взрослом возрасте. Любой взрослый человек понимает, что у него нет 1 года, чтобы учить теорию в вакууме, надо получать навык и идти зарабатывать деньги и идут туда, где хорошо.

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

Вы все неверно пишете. Чтобы учиться чему-то хорошо, нужны учебные пособия. Паскаль, пожалуй, лучшая обучалка для программирования. Позволяет изучить суть программирования, не отвлекаясь на IDE, установку пакетов, утиную типизацию, магические методы и еще 100500 возможностей Питона. Питон вы потом сто раз выучите.

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

Результат для вайтишника - это работа в айти.

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

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

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

Если есть время учите основательно, но паскаль я абсолютно никому не рекомендую - это пустая трата времени, за этот год использования питона или Js, вы уже поймете все глубины глубин этих языков и привыкните к синтаксису очень неслабо. И на JS есть курсы по алгоритмам и на Python. Кстати на питоне есть очень классный курс на ютубе от очень классного профессора(забыл как зовут, его борода звал к себе на интервью ещё), бесплатно!

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

Короче, мне надоело, есть ещё миллион причин почему ваш подход очень плох для вайтишников.

Курс Тимофея Хиртянова от ФПМИ, вместе с его практикой прибавляет несколько баллов iq)

Да, спасибо, его и имел ввиду)

Позволяет изучить суть программирования

Это как?

не отвлекаясь на IDE

IDE здорово помогает. Лучше программировать в блокноте или на бумажке?

установку пакетов

В python задача решается установкой пакета, а в паскале - выпиливанием собственного велосипеда.

утиную типизацию

Венгерскую нотацию практиковали задолго до python, в Delphi :)

магические методы

Например?

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

Я, как и автор из "гуманитариев", но интересуюсь ИТ всю жизнь, хотя и не программирую. Долго меня преследовала повторяющаяся ошибка, которая мешала пониманию. "Бытовой", жизненный опыт — очень плохой помощник в сфере ИТ.


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

Сейчас прохожу питон на курсах. Хотел бы я посмотреть в глаза тому человеку, который питон называет "простым". Может по сравнению с теми языками, которые он знал раньше, питон и простой. А вот когда его учишь регулярно получаешь "взрыв мозга" с последующим PTSR

По сравнению с чем Python сложный?

Со Scratch разве что?

любой естественный язык куда сложнее, просто вы учили естественные языки (минимум один) всю свою жизнь

По сравнению с изучением родного русского языка

С родным языком вряд ли что-то вообще стоит сравнивать — это наше самое долгое обучение (по дефолту, конечно, если всякие эмиграции в расчет не брать).

Да я вообще не сравнивал. я просто написал, что Питон нифига не простой
А чел начал спрашивать "в сравнении с чем"

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

Да я вообще не сравнивал. я просто написал, что Питон нифига не простой
А чел начал спрашивать "в сравнении с чем"
Я не изучал русский 20 лет. Я его по сути знал уже к первому классу. Пусть не все слова, но разговорный (устный и письменный) был нормальный.
Да и проблем в первом классе не было. Жи-Ши пишутся через И. а Жы-Шы черз Ы
У дочки в 8-ом классе с питоном тоже проблем нет. Ток они и время тратят побольше меня на питон, и мозги помоложе, готовы впитывать абстрактную хрень (как-то циклы, инпуты, стринги и инт, делимости и тд и тп), поскольку в школе и без питона хватает всякой ерунды. Как Вам "Си" на основах Микропроцессорной техники? А предмет "основы делимости", нафига это воообще детям? что они с этим делать будут? что, все скопом поступают на мехмат МГУ и за 3 года заканчивают ? не знаю. Но вот такая у них "Матвертикаль". И "Мат" тут возможно не математика :)

Может по сравнению с теми языками, которые он знал раньше, питон и простой. 

Да я вообще не сравнивал. <...> А чел начал спрашивать "в сравнении с чем"

"Может" - относится к тому челу, который говорил что питон простой
Я не сравнивал, потому что у меня нет опыта изучения какого-нить C или Java

Так назовите язык программирования проще чем python.

В каком-то соседнем треде Scratch вспоминали. Но в целом соглашусь. Учитывая то, что я слышал о языках программирования, питон кажется ближе к нижнему порогу простоты.

Я думаю, что python сложный язык, маскирующийся под простой, особенно при обучении.

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

Только при этом python создаёт иллюзию "ты же можешь использовать концепцию ХХХ не зная что это - потом разберёшься".
Проблема с этой иллюзией в том, что очень сложно потом заставить себя выучить концепцию ХХХ, когда ты худо-бедно (но с ошибками и подводными камнями) умеешь её применять.

Когда мы утверждаем, что нечто равно чему-то, нужно ставить “=”. Когда мы проверяем, что нечто равно чему-то, нужно ставить “==”.

С "=" мы не утверждаем, что нечто чему-то равно. Мы присваиваем объекту значение (создаём новый объект или присваиваем значение старому).

"=" как утверждение это в Haskell (там оно так и называется equation - уравнение).

Спасибо за уточнение, не обратил внимание на этот нюанс.

# разницы в определениях нет
(subverse1, subverse2) = "однажды в студёную", "зимнюю пору"

# тут разница в определении видна, verse по-вашему должен кажды раз вычисляться
# в реальности он вычисляется однажды и хранится в памяти
verse = subverse1 + " " + subverse2

Да заметьте вот минимальный пример.

Я думаю, что python очень плохой для обучения программированию язык (для обучения "написанию скрпитов" хороший) - именно потому, что можно что-то писать не понимаю что ты делаешь и заложить мины под дальнейшее обучение.

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

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

Почему вдруг? Программа в python (как и в паскале, ага) выполняется сверху вниз.

вы про "мутабельность" "иммутабельность" или про суть определения?

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

Есть оператор присваивания

Есть оператор сравнения

Есть ещё моржовый оператор

Как они работают - не секрет, просто не нужно их путать ;)

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

К чему вы эти не относящиеся к делу слова написали.
Вопрос: верно ли определение автора.
Утверждение: не верно (более хороший пример c set внизу).

Если всё ещё считаете, что верно - докажите.

Я считаю, что ваш пример с set неверный ;) Я догадываюсь, что вы хотите показать , но программа всё равно выполняется сверху вниз. То, что вычислено создано в 1 строке (множесnво с именем sum) не должно вдруг поменяться. Это не С с его указателями ;)

Хотя да, присваивание, которое как правило создает новый обьект, кроме некоторых случаев, это не для новичков ;)

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

Моя позиция:

  1. В статье есть неверное утверждение как работает equals sign, вот оно: "Когда мы утверждаем, что нечто равно чему-то, нужно ставить “=” (equals sign)"

  2. Я привожу пример с mutable data, когда видно, что утверждение плохое и неверное. Если читать определение буквально и дотошно, что в момент присваивания - в sum должно лежать AST: (|, a b), на самом деле в sum лежит результат вычислений.

  3. Эту разницу между call-by-name \ call-by-value новички ещё не знают и узнают не скоро, но корректные определения надо давать с самого начала.

  4. Правильно определение equals sign "Когда мы вычисляем значение и 'присваиваем его в переменную(*)' " *) правильно наверное передаём его в lvalue - или что там у python в этом месте не нашёл.

Теперь ваша позиция в явном виде и возражения к моей пожалуйста.

Когда мы утверждаем, что нечто равно чему-то, нужно ставить

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

А понятие присваивание - есть. И срабатывает оно в момент выполнения оператора присваивания ;) Но с некоторыми обьектами оно работает несколько необычно ;) Но, курсы ведь затем и нужны, чтобы подобные вещи разьяснять?

э... о чём мы вообще тогда спорим?

ПС
И к стати где прочитать определение понятия присваивания в python? Я беглым поиском по их документации не нашёл.
Нашёл 3.1.1.number (equal sign) и такие же обрывочные определения для других типов.

Тут коллега хороший вопрос задал, обсуждение может быть долгим, но по факту вот этот пример лучше (лучше пример на изменяемых типах данных), чтобы прям видно было, что после "a |= {10}" равенство перестало выполняться.

sum = a | b
print(a, b, sum)
print(id(a), id(b), id(sum))
#вот вывод:
#$ {1, 2} {3, 4} {1, 2, 3, 4}
#$ 1005001 1005002 1005003
#########################
a |= {10}
print(a, b, sum)
print(id(a), id(b), id(sum))
#вот новый вывод, заметьте, a изменилось, sum нет, т.е. "раверство" перестало выполняться
#$ {1, 2, 10} {3, 4} {1, 2, 3, 4}
#$ 1005001 1005002 1005003

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

В каком-нибудь 1985 году начинающий "синклерист" включал компьютер и сразу же попадал в готовую среду программирования, в которой можно прямо сходу набрать текст и запустить командой RUN безо всяких бубнов. Конечно, стандартные упражнения того времени типа "а давайте выведем таблицу квадратов чисел от пяти до двадцати пяти" или "а давайте посчитаем площадь треугольника по формуле Герона" сейчас мало кого удовлетворят, но они обеспечивают гораздо более постепенное и естественное вхождение.

Допустим, я хочу сделать так, чтобы юзер ввёл год с клавиатуры, а я напечатаю следующие 20 лет, выделив звёздочками високосные. Пользователь вводит число, его надо где-то хранить, значит, переменная. Назовём её year. Её можно использовать в формуле. А теперь надо каким-то образом увеличить её значение на единицу двадцать раз подряд. Есть разные способы, но, например, есть конструкция "цикл", которой мы эту переменную даём, и она её увеличивает. То есть цикл можно для начала понять как автоматизацию одних и тех же действий с некоторой переменной, а не некую "магию", которая не запускается, если ей не передашь что-то случайное, пусть даже "_".

Сейчас же надо скачать интерпретатор/компилятор, убедиться, что версия правильная, что настроен тулчейн (редактор + компилятор хотя бы), что в учебнике не используются какие-то устаревшие конструкции, ну и дальше аккуратно идти по струночке от простого к сложному, чтобы не отклониться вбок и не провалиться в какие-нибудь лямбды или операции с Unicode. А это чертовски сложно, потому что даже какой-нибудь Pygame Zero постоянно заставляет лезть куда-то "под капот" или читать довольно фрагментарную документацию, а ещё с ней толком не работает intellisense. В общем, иногда создаётся впечатление, что самое разумное -- это забыть вот это всё, расчехлить какой-нибудь Турбо-Паскаль и учиться "как полагается".

Сейчас же надо скачать интерпретатор/компилятор, убедиться, что версия правильная, что настроен тулчейн (редактор + компилятор хотя бы)

Во-первых, зачем редактор и компилятор? Работа с интерактивным REPL ничем не отличается от работы с синклером в каком-нибудь 1985 году (и intellisense одинаково нет ни там ни там)

Во-вторых, даже качать ничего не надо, онлайн-сред сколько угодно, да хотя бы https://www.online-python.com/ (и intellisense там есть)

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

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

То что вы описади это 3 недели подготовки из полноценных 8-12 месячных курсов.

Что дрлжно было произойти?

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

Да ничего не должно было.

Заголовок — реверанс в сторону историй, как программирование изменило жизнь. В тредах в начале я объясняю это.

Каждая решённая задача в программировании ощущается как победа надо боссом в Дарк Соулсе

Тоже изучаю Python, я ардуинщик, и после урезанного C++ переход был несложным. Пилю проект и учусь параллельно, в основе модуль Paramiko, есть малинка-сервер с игрой и несколько малинок-клиентов с текстовыми экранаии, работающих по типу пейджера. Пришлось купить внешний айпишник для сервера, создать рам-диск для спасения карты памяти сервера от постоянной перезаписи временными файлами, и таких костылей ещё море. Главное что это интересно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории