Языки программирования для линукс
10 лучших сред разработки (IDE) для Linux
Программирование (а точнее кодинг) — это, по сути, постоянный набор текста, поэтому очень важно найти хороший редактор, обеспечивающий комфортные условия для написания кода. Многие начинают с простых текстовых, но потом переходят на IDE (интегрированная среда разработки), поскольку IDE делает создание кода более удобным и быстрым с помощью автоматического дополнения, всплывающих подсказок, информации о возможных ошибках и средств отладки. Сегодня рассмотрим топ-10 сред разработки для Linux.
Для тех, кто не в курсе Linux — это open-source операционная система, которая используется по всему миру на компьютерах, серверах, в игровой сфере и т.д. Ее очень любят за безопасность, стабильность, конфиденциальность, продвинутый контроль + здесь подавляющая часть приложений бесплатны. Она предоставляет программистам некоторые преимущества — тот, кто умеет программировать в Linux, сможет без проблем построить карьеру в области системного администрирования и получить хорошую должность на рынке (такие знания будут отличным плюсом в резюме).
Хотя, если говорить о программировании в целом, то не особо важно какой ОС вы пользуетесь — многие из представленных ниже сред разработки под Linux отлично подходят и для Win/Mac. Сейчас даже можно найти разные компиляторы в сети, например запустить то же python онлайн для решения каких-то задач. Хотя локально работать все же быстрее и удобнее.
Выбор того или иного варианта зависит от ваших предпочтений. В списке находятся не все доступные программные продукты и он не является каким-то рейтингом — воспринимайте статью как перечень одних из лучших IDE для Linux, с которыми следует ознакомиться в первую очередь.
1. Eclipse
Бесплатный редактор с открытым кодом, созданный для тяжелой разработки на Java. Может работать с языками программирования: Ruby, Java, C, Perl, Python, PHP, C++ и другие.
2. Bluefish
3. NetBeans
Бесплатная и открытая IDE от Sun Microsystems. Поддерживает такие ЯП как: Java, Python, C++, C, Ruby, PHP, JavaScript.
4. Zend Studio
PHP программисты используют Zend для быстрого написания кода, легкого решения проблем и свободного интегрирования в облако. Zend Studio, PHP Unit и Composer образуют одно целое и становятся мощным инструментом для мобильных и PHP разработчиков.
Работает с такими языками как: HTML, PHP, JavaScript.:
5. Komodo IDE
Эта IDE под Linux, созданная в Mozilla, заслужила множество наград. Поддерживает языки программирования: Python, PHP, HTML, Perl, RHTML, C, CSS, C++, JS, Ruby, Django. Основные фишки:
Цена: обычная и образовательная лицензии — бесплатны, а персональная и предпринимательская версии — по 89 и 295 долларов соответственно.
6. Anjuta
Универсальная IDE, которая включает в себя ряд расширенных возможностей, таких как мастер приложений, редактор исходного кода, управление проектами и версиями, профилировщик, отладчик, дизайнер графического интерфейса и другие инструменты. Anjuta предоставляет простой графический интерфейс и достаточные мощности для систематической разработки. Поддержка языков: C и C++.
7. MonoDevelop
Может работать с языками: VB, C, C++, Python, C#, Java.
8. CodeLite
Бесплатный проект с открытым исходным кодом для разработки на C++ и C под разные платформы. Полезные фишки:
9. Kdevelop
Полноценная и расширяемая IDE для C, C++, PHP и Ruby. Основные преимущества:
10. Geany
Хотя Geany имеет базовые возможности IDE, он является текстовым редактором, который работает на GTK2 библиотеке. Он был спроектирован так, чтобы стать маленькой и быстрой IDE. Поддерживаемые языки: HTML, PHP, Java, C, Perl, Pascal, Python.
Как уже сказал выше, были рассмотрены далеко не все среды разработки для Linux, есть и другие хорошие решения: IDE от JetBrains, Code::Blocks и Qt Creator. Расскажите в комментариях ниже о тех приложениях, что вы используете у себя.
Популярные языки программирования Linux
Linux быстро развивается и становиться все популярнее, особенно в связи с тем, что сокращается использование Windows, а также множество программистов работают над продвижением Linux, создавая новые программы для настольных компьютеров, которые будут эквивалентны или даже лучше приложений в Windows и Mac OS X.
Для Linux есть множество языков программирования, и более того, каждый год появляются новые. Но не все их используют программисты, ведь для того, чтобы создать надежное, гибкое, эффективное и расширяемое, а главное, безопасное приложение, нужно подобрать правильный язык.
В этой статье мы рассмотрим самые популярные языки программирования для Linux. Рассмотрим те, на которых разработана эта операционная система и те, которые используются для создания приложений. На самом деле список не отсортирован по степени важности, все используемые здесь языки хороши. Все они кроссплатформенные, и вы можете написать на них программу для любой из доступных операционных систем.
Я не преувеличу, если скажу, что этот язык был создан для этой операционной системы. Это уже старый язык. Он создавался в семидесятых годах инженером из Bell Labs Денисом Ритчи специально для написания ядра Unix. Дело в том, что в те времена программы и операционные системы писались на ассемблере и нужно было для каждой архитектуры писать программу отдельно, потому что наборы инструкций отличались. Разработчикам Unix нужен был высокоуровневый язык программирования, на котором они смогли бы написать Unix один раз и собирать его для всех платформ. Таким языком стал Си.
Ядро Linux, основано на Unix, а поэтому тоже написано на Си, также на Си реализованы все модули ядра, драйверы, а также огромное количество системного программного обеспечения. Если вы задавались вопросом, на чем написан Linux то теперь знаете ответ. На Си разработаны множество утилит из набора GNU, X сервер, набор библиотек для работы с графикой GTK и многое другое, некоторые оконные менеджеры. Но для написания новых программ Си используется все реже, ему на замену пришла его объективно ориентированная модификация С++.
Это усовершенствованная версия Cи, появился он ненамного позже си. В 1980 году Бьёрн Страуструп работал над своим исследованием и ему не хватало стандартных возможностей Си, поэтому он придумал к нему пару улучшений. Неожиданно этот язык стал популярен среди его коллег и он уже не мог сам следить за его развитием.
Теперь это один из самых популярных языков программирования. Здесь доступно как объективно ориентированное, так и процедурные стили программирования. Правда, он все же очень сложен для новичков, как и Си. Здесь нужна очень высокая точность при управлении памятью.
Си и С++ наиболее популярные языки программирования для Linux.
3. Python
К тому же на Python написано бесчисленное количество системных скриптов и утилит для управления Linux. Это утилита apt для установки программного обеспечения в Ubuntu, пакетный менеджер Emerge в Gentoo и еще огромное количество небольших скриптов. Причина тому простота языка. Программист тратит на программу несколько часов, а она отлично работает несколько лет.
4. Perl
Много старого кода в Linux написано на Perl, это различные скрипты сборки ядра, часты пакетного менеджера dpkg, скрипты системы инициализации и многое другое. Из современных программ, написанных на Perl можно отметить скрипт просмотра информации о системе inxi. Как правило, всё новое пишется на Python, но переписывать старое особого смысла нет.
5. Язык командой оболочки
Команды терминала Linux позволяют не только выполнять повседневные операции в интерактивном режиме, но это также полноценный язык программирования с поддержкой самых простых управляющих конструкций. Наиболее распространенная оболочка Bash (Bourne Again Shell) Больше всего скриптов написаны именно на ее синтаксисе, но есть и другие, например, тот же fish, sh, zsh, dash и т д.
Синтаксис управляющих конструкций Bash немного сложный для понимания, но на нем написано много системных скриптов, это в первую очередь все скрипты инициализации демонов в SysVinit, скрипты для обслуживания серверов, резервного копирования, запуска программ и т д. У каждого администратора есть несколько скриптов, написанных на Bash.
6. Другие языки
Большинство программ в Linux написано с использованием языков программирования, перечисленных выше. Они самые популярные, однако существуют и другие, менее используемые. Но тем не менее написанные на них программы могут выполнятся в Linux.
Выводы
Это далеко не все языки программирования linux, которые используются для создания программ в Linux, очень часто для создания скриптов в последнее время начали использовать новые языки, такие как Dart,Vala и другие. Для своих нужд я использую Python и PHP, а вы пишите программы для Linux? На каких языках программирования? Напишите в комментариях!
Изучите необходимый минимум Linux, чтобы быть продуктивным
Разные операционные системы длительное время обслуживают различные аудитории: Windows — бизнес-профессионалов, Mac — творческих, а Linux — разработчиков. Разработчикам ОС такой тип рыночного спектра сильно упростил концепцию продукта, технические требования, пользовательский опыт и направление рынка. Однако, он также ужесточил нормы рабочего пространства, что деформировало отдельных пользователей под узкие, непересекающиеся области: у бизнесменов нет возможности заглянуть в творческий процесс, а у разработчиков нет представления о проблемах бизнеса.
В реальности знания и опыт — динамичны, они охватывают несколько дисциплин и сфер деятельности. Представление о том, что «можно иметь способности только к чему-то одному» — это не руководство к овладению мастерством, а попытка справиться с преждевременной оптимизацией. Узнать о том, в чём вы хорошо разбираетесь можно только когда вы попробовали себя в нескольких разных вопросах. И может оказаться, что у вас есть способности ко многим видам деятельности.
Для современных бизнес-аналитиков особенно актуален вопрос ликвидации пробела между бизнесом и разработкой. Бизнес-аналитики должны быть двухплатформенными, способными использовать командную строку, доступную только на Linux (или в macOS), но при этом уметь извлекать широкие возможности из Microsoft Office в Windows. Очевидно, что мир Linux пугает тех, у кого образование в сфере бизнеса. К счастью, как и в большем количестве вопросов, вам необходимо изучить 20% информации, чтобы выполнить 80% работы. Вот мои 20%.
Почему современные бизнес-аналитики должны знать Linux
Благодаря своим open source корням, Linux выиграл от вкладов тысяч разработчиков за всё время его существования. Они построили программы и утилиты, чтобы упростить работу не только себе, но и тем программистам, которые последовали за ними. В результате open source разработка создала эффект сетевой выгоды: чем больше разработчики строили утилиты на оригинальной платформе, тем больше других разработчиков могло влиять на эти утилиты, чтобы писать собственные программы.
В результате получился огромный пакет программ и утилит (то есть софт), который был написан на Linux и под Linux. Большая часть его никогда не портировалась в Windows. Один из примеров — популярная система контроля версий (VCS), которая называется git. Разработчики могли написать софт под Windows, но они этого не сделали. Они написали его для работы в командной строке, для Linux, потому что Linux — экосистема, в которой уже были все необходимые инструменты.
Если вдаваться в подробности, разработка на Windows ведёт к двум основным проблемам:
Если собрать всё вместе, это выльется в трату времени на переписывание базовых инструментов, которые уже доступны в Linux, они позволят избежать ошибок совместимости с ОС. Тут нет никаких сюрпризов — экосистема Windows просто не была задумана и спроектирована под нужды разработки софта.
Теперь давайте рассмотрим базовые идеи Linux.
Фундаментальная единица Linux: «оболочка»
Shell (оболочка, также известная как терминал, консоль или командная строка) — это текстовый интерфейс пользователя, через который команды отправляются машине. На Linux, по-умолчанию, язык оболочки называется bash. В отличие от Windows-пользователей, которые в своём большинстве используют навигацию «навести-кликнуть» по окну, Linux-разработчики привязаны к клавиатуре и пишут команды в оболочке. Хоть этот переход далёк от естественного для тех, у кого нет бэкграунда в программировании, плюсы разработки в Linux сильно перевешивают изначальное вложение в обучение.
Изучаем несколько важных концептов
В сравнении с достаточно зрелым языком программирования, bash имеет всего несколько основных концептов, которые необходимо выучить. Как только вы охватите это, остаток bash — простое запоминание. Я переформулирую понятней: хорошо разбираться в bash значит запомнить 20-30 команд и их часто используемые аргументы.
Linux кажется непроницаемым для тех, кто не касается разработки, из-за способа, которым разработчики (не напрягаясь) извергают эзотерические команды терминала, когда им захочется. Правда в том, что они хорошо знают только несколько десятков команд — за всем более сложным они так же (как и все смертные) обращаются в Google.
Опуская мелкие загвоздки, стоящие на пути, вот главные концепты в bash.
Командный синтаксис
Команды соответствуют синтаксису:
Псевдонимы директорий
Полезная информация
У нас есть курс по операционным системам. Зарегистрированные пользователи могут пройти его бесплатно. Другие бесплатные курсы можно найти по ссылке.
STDIN / STDOUT
Всё, что вы пишите в окне и подтверждаете (с помощью ENTER), называется стандартным вводом (STDIN).
Всё, что программа выводит в ответе в терминал (например текст из файла), называется стандартным выводом (STDOUT)
Конвейер (piping)
Pipe принимает STDOUT от команды слева от pipe и превращает его в STDIN для команды справа от pipe.
Символ «больше» принимает STDOUT от команды слева и записывает/перезаписывает в новый файл справа
пример: ls > tmp.txt
Два символа «больше» принимают STDOUT от команды слева и добавляют к новому или существующему файлу справа.
пример: date >> tmp.txt
Шаблоны поиска (wildcards)
Завершение с помощью tab
Bash часто завершает команды сам, по определённой логике, если вы начинаете вводить команду и нажимаете TAB.
Однако, стоит попробовать что-то вроде zsh или fish для автозаполнения, потому что запоминать команды и все их параметры очень сложно. Более того, эти инструменты применят автозаполнение, основываясь на вашей истории используемых команд.
Выход
Иногда вы застреваете в какой-нибудь программе и не можете оттуда выйти. Это очень часто повторяющееся событие для новичков в Linux, которое невероятно демотивирует. Часто выход происходит с помощью чего-то, содержащего q. Хорошо бы запомнить то, что будет написано ниже и использовать, когда вы в ловушке.
Что я помню из команд bash
Это те команды, которые я использую чаще всего в Linux (начиная от самых часто используемых к самым редко используемым). Как я уже писал раньше, знание всего горстки команд поможет выполнять большой набор необходимых программируемых задач.
ssh
htop (или top ) диспетчер задач
wgetзагрузить веб-страницу или веб-ресурс
find вывести список всего содержимого директории и её дочерних директорий рекурсивно
Читайте также
Продвинутые и не часто используемые команды
Я считаю хорошей практикой хранить список команд, которые полезны в определённых ситуациях, даже если подобные ситуации случаются редко (например, какой процесс блокирует конкретный сетевой порт). Вот несколько нестандартных команд, которые у меня всегда под рукой:
Программирование под Linux
Все действия в операционной системе выполняются с помощью программ, поэтому многим новичкам интересно не только использовать чужие программы, а писать свои. Многие хотят внести свой вклад в кодовую базу OpenSource.
Это обзорная статья про программирование под Linux. Мы рассмотрим какие языки используются чаще всего, рассмотрим основные понятия, а также возможности, разберем как написать простейшую программу на одном из самых популярных языков программирования, как ее вручную собрать и запустить.
1. На чем пишут программы?
Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.
А вообще, писать программы для Linux можно почти на любом языке начиная от Java и Python и заканчивая С# и даже Pascal. Для всех языков есть компиляторы и интерпретаторы. Писать программы на С++ сложно, а Си многими уже считается устаревшим, поэтому множество программистов используют другие языки для написания программ. Например, множество системных инструментов написаны на Python или Perl. Большинство программ от команды Linux Mint, установщик Ubuntu и некоторые скрипты apt написаны на Python. Множество скриптов, в том числе простые скрипты оптимизации написаны на Perl. Иногда для скриптов используется Ruby. Это скрипты OpenShift или, например, фреймворк Metasploit. Некоторые разработчики кроссплатформенных программ используют Java. Но основные компоненты системы написаны все же на Си.
2. Библиотеки
Библиотеки делятся на два типа:
Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же системное программирование linux, в основном, это Си или С++.
3. Процесс сборки программы
Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.
На следующем этапе к работе приступает компилятор, он выполняет все необходимые действия над кодом, разбирает синтаксические конструкции языка, переменные и преобразовывает все это в промежуточный код, а затем в код машинных команд, который мы можем потом посмотреть на языке ассемблера. Программа на этом этапе называется объектный модуль и она еще не готова к выполнению.
Далее к работе приступает компоновщик. Его задача связать объектный модуль со статическими библиотеками и другими объектными модулями. Для каждого исходного файла создается отдельный объектный модуль. Только теперь программа может быть запущена.
А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.
4. Как собрать программу
Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:
sudo apt install gcc
Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:
С помощью опций мы говорим утилите что нужно сделать, какие библиотеки использовать, затем просто указываем исходные файлы программы. Давайте рассмотрим опции, которые будем сегодня использовать:
Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:
int main() <
printf(«losst.ru\n»);
printf(«Корень: %f\n», sqrt(9));
return 0;
>
Я специально добавил функцию корня чтобы показать как работать с библиотеками. Сначала нужно собрать объектный файл. Перейдите в папку с исходниками и выполните:
Это этап компиляции, если в программе нет ошибок, то он пройдет успешно. Если исходных файлов несколько, то такая команда выполняется для каждого из них. Далее выполняем линковку:
Конечно, все эти действия могут быть выполнены и с помощью различных графических сред, но выполняя все вручную, вы можете лучше понять как все работает. С помощью команды ldd вы можете посмотреть какие библиотеки использует наша программа:
Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.
5. Автоматизация сборки
Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:
цель: зависимости
команда
Затем вам достаточно выполнить команду make для запуска компиляции, только не забудьте удалить предыдущие временные файлы и собранную программу:
Программа снова готова и вы можете ее запустить.
Выводы
Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!
Курс программирования на Си под Linux:
Язык программирования Linux
В Бауманке учился на программиста (ИУ-7, если конкретнее)
И лабораторные так же сдавали
— Агаа.. вижу.. сдал. Молодец.
Студенты к ней в целом привыкли и замечания на лекциях делать быстро перестали. Кому нужно было учиться, учились сами, а кто жил от зачёт до зачёта, считал бабушку Ши диким везением.
Как-то в тишине переписывала она лекцию с листочка на доску, а мы копировали это к себе в конспекты.
Скромный стук в дверь, появляется голова какого-то парня:
— Извините, можно я объявление дам?
Та прервалась и говорит:
— Да, конечно! Заходите.
Бабушка Ши посмотрела на написанные контакты, озаглавленные «Linux», повернулась к аудитории и произнесла:
— Очень здорово, я считаю! Приходите к мальчику, будете знать ещё один, новый язык программирования Linux.
В её фразе было потрясающим каждое слово
Гуманитарии могут сказать «Ну мало ли, человек не знал».
Дубликаты не найдены
в Бауманке такой звездец? Карл. Что-то я слабо верю
В комментах кто-то даже её фамилию спалил. Так что. придётся поверить.
Тем временем в МГТУ им. Баумана.
Автор, а как давно это было?
В 2009 году, в октябре или ноябре
Ей в то время было простительно не знать о какой-то там заморской операционной системе.
Учёные тайно внедрили уязвимости в ядро Linux
Учёные из Миннесотского университета решили провести эксперимент. Они начали внедрять в популярные open source проекты уязвимости под видом свежих патчей. Исследователи хотели узнать, насколько вообще велики шансы провернуть подобное.
В том числе их взор упал и на проект ядра Linux. Связано это с его известностью и адаптированностью по всему миру.
Специалистам удалось «внедрить» часть патчей, добавляющих в ядро уязвимости. Но по итогу они были пойманы с поличным мейнтейнерами проекта.
Один из ведущих разработчиков, поддерживающих Linux-ядро, Грег Крох-Хартман даже написал разъярённое письмо исследователям:
Нашему комьюнити не нравится, когда над ним экспериментируют и «тестируют», отправляя известные исправления, которые либо намеренно ничего не делают, либо намеренно вносят ошибки Из-за этого мне теперь придётся забанить все будущие контрибуции из вашего университета и «похоронить» предыдущие, поскольку они явно были поданы недобросовестно с намерением вызвать проблемы.
Отметим, что научная работа, ради которой всё это затевалось, вышла ещё в феврале 2021 года. Согласно ей, количество успешных «инъекций» уязвимостей составляет около 60% от общего числа попыток.
Коротко.
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Научимся работать с ssh, разберём работу ssh клиентов и sshd.
0 решает все проблемы 🙂
Вопросы с собеседований по Linux
Какие вопросы вам задавали на собеседованиях на должность линукс админа, помощника админа и т.п., всё что связано с линуксами?
Собираю базу вопросов с собеседований, думаю, будет полезно новичкам, да и в целом интересно почитать. Вопросы выложу в открытый доступ по ссылке. Просьба также указывать должность, на которую подавали.
Изучаем GNU/Linux часть 43. Работа с сетью
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Разберёмся, как смотреть базовую информацию по сети, делать простую диагностику и менять настройки.
Изучаем GNU/Linux часть 42. Основы сетей
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Для продолжения курса потребуются знания работы сети, а это огромный пласт знаний. По сетям в интернете материала, наверное, больше, чем по линуксам. Но я всё же постараюсь объяснить основы и по мере продвижения курса буду затрагивать различные детали работы сети, связанные с той или иной темой. Сразу предупрежу, что я очень сильно упрощаю, так как это не курс по сетям, я расскажу только то, что считаю необходимым на данном этапе.
И так как это выход на новый уровень и начало для изучения многих новых технологий, это будет началом новой главы для данного курса.
Изучаем GNU/Linux часть 41. Создание systemd юнитов
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Изучаем GNU/Linux часть 40. Дедупликация с VDO
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Поговорим про дедупликацию, thin provisioning и работу с VDO
Изучаем GNU/Linux часть 39. Инкрементальные бэкапы с tar
Продолжаем изучать GNU/Linux и готовиться к сертификации от Red Hat (RHCSA).
Поговорим про полные и инкрементальные бэкапы и рассмотрим их создание с помощью tar.
Изучаем GNU/Linux часть 38. Создание backup скрипта
Рассмотрим утилиты du, find, tar, gzip, touch и используем их для создания backup скрипта.
Бедный Тимми
Откуда текст может возникать? Откуда угодно. Текст может генерироваться при помощи вашего кода налету, приходить извне через input() или откуда-то из интернета. Кроме этого, вы можете (и будете) писать его самостоятельно. Во всех этих случаях вам нужно уметь его обрабатывать либо для дальнейшего использования в коде, либо для вывода на экран, либо для каких-то иных целей.
Все нижеприведённые примеры являются строками в понимании питона:
s = ‘text’ # одинарные апострофы
s = «text» # одинарные двойные кавычки
s = »’text»’ # тройные апострофы
s = «»»text»»» # тройные двойные кавычки
Строкой является любой символ (или последовательность символов), заключённый в литералы строк, в т.ч. пробелы, цифры, знаки препинания.
Обратите внимание на последний пример. Он начинается и заканчивается пробелами. Эти пробелы так и будут выводиться на экран и сами собой никуда не денутся. Это важно, потому что пробел также является символом строки и элементом последовательности. В данном случае при принте первого и/или последнего элемента мы не увидим ничего на экране. Но тем не менее, эти пробелы там будут, потому что они включены в строку и являются её элементами, хоть и не имеют визуального отображения. Что с этим делать и как быть, мы обязательно поговорим во второй части.
В чём разница одинарных и тройных литералов? Стандартно для объявления строк в коде мы используем одинарные кавычки или апострофы. И чаще всего такие строки являются короткими.
Тройные вариации используются в основном для написания документационных аннотаций к модулям, классам и функциям. Иначе это называется docstring или докстринг, и о них мы поговорим, когда дойдём до функций. А пока что нужно иметь в виду, что такой тип объявления строки технически доступен в рамках кода как такового для создания длинных строк.
По умолчанию пайтон в принтах выводит строки, обёрнутые в одинарные апострофы, как бы они ни были заданы пользователем.
Сейчас внимательно следите за порядком слов «кавычки» и «апострофы». Если внутри самой строки должны содержаться апострофы или кавычки, то сама строка должна обрамляться соответственно кавычками или апострофами:
Т.е. питон самостоятельно меняет вид обрамляющих литералов в зависимости от того, что находится внутри строки. А что если внутри строки должны быть и кавычки, и апострофы одновременно? Тут можно пойти двумя путями:
1. использовать тройные кавычки или апострофы (при чём без разницы, что вы из них выберете),
>>> «»»O’Reilly published D.Beazley’s book «Python Cookbook» in 2013″»»
‘O\’Reilly published D.Beazley\’s book «Python Cookbook» in 2013’
>>> ‘O\’Reilly published D.Beazley\’s «Python Cookbook» in 2013’
‘O\’Reilly published D.Beazley\’s «Python Cookbook» in 2013’
>>> «O’Reilly published D.Beazley’s \»Python Cookbook\» in 2013″
‘O\’Reilly published D.Beazley\’s «Python Cookbook» in 2013’
В экранировании также нуждаются специальные символы, при использовании которых в поведении строк происходят те или иные изменения. За полным списком таких символов и за примерами использования я вас пошлю вот сюда. Здесь же я опишу только те, которые чаще всего используются на деле (некоторые примеры я позаимствовал оттуда же).
>>> s = «Мама мыла раму\nМила раму мыла»
>>> print(s) # только функция print понимает, что делать со спецсимволами
Мама мыла раму
Мила раму мыла
>>> s # в этом случае просто выводится содержимое переменной
‘Мама мыла раму\nМила раму мыла’
Achtung! Achtung! Приятные новости: в длинных строках всё это не нужно! =)
>>> s = «»»Эта очень длинная строка
. сама переносится, сама табулируется
. сама экранируется \.»»»
>>> print(s)
Эта очень длинная строка
сама переносится, сама табулируется
сама экранируется \.
>>> s
‘Эта очень длинная строка\nсама переносится, сама\tтабулируется\nсама экранируется \\.’
>>> s = «»»Но если вдруг вам будет очень нужно прописать здесь что-то вроде ‘\n’, то вам нужно воспользоваться экранированием, чтобы \\n не выполнялся»»»
>>> print(s)
Но если вдруг вам будет очень нужно прописать здесь что-то вроде ‘
‘, то вам нужно воспользоваться экранированием, чтобы \n не выполнялся
Тут надо бы вспомнить про функцию print. Как я уже говорил, это функция всеядная и может переварить много чего. Помимо того, что она всеядная, она ещё и достаточно хитрая. Напишите в консоли вот такую команду :
Кстати говоря, никогда не стесняйтесь использовать этот официальный help питона: передавая в него название любого встроенного объекта вы получите очень классную справку. Про print питон вам немедленно расскажет следующее:
Лаконично, просто и понятно. Вот её сигнатура:
Она говорит нам о том, что:
Собственно, что это вдруг я её вспомнил? Посмотрите ещё раз внимательно. В числе её параметров присутствуют такие вещи как sep=’ ‘ и end=’\n’. Оба этих параметра принимают любые строковые символы, в том числе экранируемые. Зачем это нужно знать? Затем, чтобы иметь возможность оформлять вывод по своему желанию.
>>> a = «Мама»
>>> b = «мыла»
>>> c = «раму»
>>> print(a, b, c) # стандартный принт трёх переменных
Мама мыла раму
>>> print(a, b, c, sep=’\t’) # делаем разделителем табуляцию
Мама мыла раму
>>> print(a, b, c, sep=’\t’, end=’\n\n’) # добавляем лишнюю пустую строку по окончанию вывода
Мама мыла раму
>>> print(a, b, c, sep=’42’)
Мама42мыла42раму
>>> print(a, b, c, sep=’42’, end=’THE END’)
Мама42мыла42рамуTHE END
Этими примерами я хотел показать прежде всего то, что упомянутые мной специальные символы могут корректировать вывод так, как вы бы этого ожидали, вставляя эти же символы в саму строку, тем самым форматируя её.
Но проще и лучше отформатировать строку заранее, чем пытаться подстроить под неё принт.
Кроме самих кавычек и апострофов в питоне существуют так называемые префиксы, которые определяют подвид строки. Их немного, я перечислю все, но остановлюсь только на тех, с которыми вы столкнётесь раньше всего и будете в последствии сталкиваться регулярно. Такими префиксами являются (в скобках указаны альтернативные виды написания:
Не знаю, как там у настоящих серьёзных программистов в свитерах из собственной бороды, но в простой мирской жизни вам понадобятся три вида строк: обычные, сырые и форматированные. Ну иногда и «сыроформатированные», но намного реже.
Префиксы указываются до литералов без пробелов, например:
>>> s = ‘\a\nМама’ # обычная строка
>>> print(s)
# в этом месте сработал символ переноса строки «\n»
Мама
Сырые строки можно использовать как минимум в трёх случаях:
— в регулярных выражениях,
— для хранения файловых путей Windows, поскольку в них содержатся обратные слэши;
— для хранения сложных математических формул в разметке LATEX.
Байтовыми строками являются строки, отражающие двоичную структуру любых данных, в том числе текста, картинок, музыки, видео и т.д. При работе с текстом такие строки возникают при кодировании строки методом encode():
Если к вам вдруг прилетела байтовая строка, то чаще всего её можно привести в человеческий вид при помощи обратного метода decode():
Форматированная строка, это строка, способная переводить в текстовый вид содержимое других переменных. Это то, чем вы все будете пользоваться неизбежно.
Представьте себе ситуацию, когда содержимое строки должно формироваться динамически. Например, вы пришли в магазин, набрали телегу продуктов, пришли на кассу, а кассир вместо того, чтобы быстро всё посчитать и потребовать с вас нужную сумму, занимается тем, что записывает каждый товар и его стоимость в отдельные строки, потом всё это как-то суммирует и пишет руками новую строку с общей стоимостью. Ну бред же, правда?
Итак, до версии 3.6 нужно было делать примерно так:
И всё это длинно, долго, муторно. А вот всё то же самое, только в f-строке:
>>> name = «Вася»
>>> surname = «Пупкин»
>>> age = 18
>>> s = f’Это. Его фамилия . Вчера ему исполнилось лет.’
>>> print(s)
Это Вася. Его фамилия Пупкин. Вчера ему исполнилось 18 лет.
Всё это, конечно же, дублируется в отдельном канале в телеге. По всем вопросам обращайтесь через Telegram.
P.S. Большое спасибо всем моим подписчикам за поддержку и активность! Без вас я, возможно, не решился бы продолжать.
Ссылки на предыдущие посты:
ПЕРВОЕ ЗНАКОМСТВО С PYTHON
Python (в русском языке распространено название пито́н или па́йтон) — кроссплатформенный высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода.
Эту фразу видели все, кто хоть раз в жизни открывал статью про Python на Википедии. Вроде бы всё просто и ясно, но как-то не очень. Уже здесь встречаются непонятные термины: кроссплатформенный, высокоуровневый… Дать ёмкое и понятное определение чему бы то ни было – это великое искусство. Поэтому, я думаю, стоит пояснить всё вышесказанное простыми словами. А простыми словами это выглядит примерно так: Пайтон – это язык программирования, который можно использовать на любой известной стандартной операционной системе (Windows, MacOs, Linux) и при помощи которого можно написать практически любую программу (от «Привет, мир!» до новой операционной системы или нового языка программирования). Звучит заманчиво, не так ли?
Пайтон был придуман в 1991 году голландцем Гвидо ван Россумом, также известным как «великодушный пожизненный диктатор». Именно он по сей день принимает окончательные решения о том, как именно будет развиваться язык. Кстати, последняя версия питона (3.9.0) вышла буквально на днях – 05.10.2020. Её главная особенность для новичков, на мой взгляд, в том, что для её установки требуется минимум Windows 10 (на семёрку она не инсталлируется). Всё, чему будут посвящены мои статьи, гарантированно будет актуальным для версий 3.6.0-3.9.0. Версии питона 2.Х здесь рассматриваться не будут, т.к. для разработки новых приложений они уже не используется, а те, кто всё ещё стоически поддерживает приложения, написанные на них, вряд ли будут всё это читать.
Этой командой мы узнаём адрес той ячейки памяти, где у нас лежит число 5 – это ячейка 1609562080 (у вас может быть другое значение – это неважно).
Следом выполним ещё пару команд:
То же самое?! Да, именно так. Переменная «b» ссылается всё на ту же самую пятёрку. Последняя проверка этой теории:
Возникает вопрос: а что же тогда такое знак «=» в данном случае? В питоне знак «=» не знак равенства, а оператор присваивания. Равенство в питоне выражается через оператор «==», который используется исключительно в булевой логике, т.е. для сравнения значений и/или содержимого разных объектов.
Итак, вывод: в питоне переменных нет, знак «=» не приравнивает значение к переменной и не записывает значение в переменную, а присваивает какому-либо объекту именную ссылку для удобства обращения.
Существуют языки со статической и динамической типизацией данных. Статическая типизация – это когда мы до того, как записать в нашу переменную «а» пятёрку, сначала должны создать эту самую переменную и объявить, что в эту переменную мы будем складывать только целые числа. Никакой другой тип данных, в том числе дробные числа, в эту переменную после этого положить уже не получится.
Прелесть и одновременно боль питона состоит в том, что в нём в одну и ту же «переменную» можно положить что угодно. А если вспомнить слова из предыдущего блока, то надо понимать, что «переменные» тут вообще ни при чём, так как это всего лишь ссылки, а вот сами объекты могут свободно менять своё состояние из одного в другое на лету. Например, было у нас целое число 5. Не хотим мы его в виде целого числа, мы хотим строку. Пожалуйста, без проблем:
Вот и всё, теперь переменная «а» ссылается уже не на целочисленный объект 5, а на строковый объект 5. Для наглядности я сразу запросил тип каждого из объектов, и оснований не верить результатам лично у меня нет: вначале пятёрка – это число, в конце – строка. Об этом говорит не только type(a), но и само значение, которое раньше было голой пятёркой, а теперь обрамлено кавычками.
Подобным образом тип любого объекта можно менять очень быстро в зависимости от нужд разработчика, и в этом прелесть. Почему это одновременно и боль? Потому что динамическая типизация к огромному сожалению отбирает большое количество ресурсов, что сказывается на производительности и быстродействии. Да, это какие-то там микросекунды, но они очень важны. Кроме того, неопытные разработчики очень любят использовать эту прелесть без особой нужды, что, во-первых, отъедает ресурсы, а во-вторых, даёт подчас внезапные неожиданные результаты. Например, вы бы хотели ожидать на выходе работы программы целое число, а получаете строку. Казалось бы, чего проще – ну переделай её обратно в число и живи счастливо? Но согласитесь, что это как минимум неудобно, когда вам нужно неожиданный результат потом как-то обрабатывать и приводить к нужному типу. Это дополнительный код, а значит дополнительное время на его написание, на его работу и на его поддержку. А время – деньги.
Стиль кодирования. PEP8
У каждого языка программирования, как и любого другого языка, есть свои законы, которым он подчинён. Если русском языке мы пишем названия месяцев со строчной буквы (9 мая, 8 марта), то в английском, например, месяцы всегда пишутся с прописной (January, 4th of July). Питон также имеет свою семантику, грамматику и свой синтаксис. Основным сводом законов, определяющих требования к красивому и качественному стилю кодирования определены в документе, который называется Python Enhancement Protocol 8 или PEP8. Основные правила на самом деле достаточно просты, но почему-то на каждом новом курсе я встречаю людей, упорно их игнорирующих.
Давайте начнём с того, что Python – язык международный. Это вам не 1С, на котором пишут в буквальном смысле по-русски. В питоне всё по-английски. Всё и всегда. Мне попадались 2 уникума, которые упорно именовали переменные по-русски. Объясняли они это тем, что «так понятнее». Нет, если вы не знаете английского, то вам, возможно, будет понятнее. Но нужно учитывать, что IT – это англоязычная среда, все программы, и 90% документации написаны именно на английском, и, в конце концов, ваш код могут читать (а большинство времени будет потрачено именно на его чтение, причём не только вами) люди, не знающие русского. Ну или давайте наоборот: вам прислали на проверку кусок кода, где половина на хинди или суахили. Как вам такое? Возьмите себя в руки и если вы не знаете или плохо знаете английский – начните его учить с нуля. Не брезгуйте онлайн-переводчиками и словарями для выбора имён переменных и функций – это не стыдно.
Вообще, раз уж зашла об этом речь, то надо сказать, что есть отдельная книга, которая посвящена рефакторингу кода. Название переменной должно отражать то, что в ней лежит (или в нашем случае – на что она ссылается). Название функции должно чётко отражать то, что она делает. Многие и то и дело пишут примерно так:
Не проще ли было сразу назвать эти переменные по-человечески (в прямом смысле)? Давайте попробуем:
Выхлоп не изменился, но мозгу становится понятнее, глазу приятнее. Осталось разобраться с «i».
В строке «for i in string» «i» является ничем иным как временной переменной. Её тоже нужно уметь красиво и понятно назвать. Как показывает моя собственная практика, иногда хорошее, грамотное название переменной снимает у студентов возникшие вопросы по дальнейшим действиям. Они внезапно начинают понимать, что делали не так и что нужно на самом деле делать и куда двигаться. Так давайте уже её переделаем и пойдём дальше:
>>> number = 5
>>> string = «mama»
>>> for letter in string:
. print(letter * number)
.
mmmmm
aaaaa
mmmmm
aaaaa
Именно это и описано в PEP8 – как писать качественный код, отвечающий требованиям и стилю Python, или как принято говорить – pythonic style или pythonic way. Многие из нас, кто ещё в школе пытался учиться программированию, помнят такой язык, как Basic или QBasic. Потом он перерос в VBA и до сих пор (к сожалению…) используется для написания макросов в офисных программах Microsoft. И в связи с этим у многих из нас при изучении питона всплывает Basic style – стиль кодирования на Basic. Pythonic style ушёл намного дальше. Читаемость кода за счёт простоты синтаксиса повысилась в разы. Вот для наглядности пример.
Задача: получите из входного потока число и напечатайте сумму его цифр.
Как бы эту задачу решило большинство в «Basic style»:
>>> number = input()
>>> summa = 0
>>> for dig in number:
… if dig in ‘0123456789’:
… summa = summa + int(dig)
>>> print(summa)
Как это решается в «Pythonic style»:
Возможно, вам сейчас ничего не понятно из того, что тут написано, но вам стоит оценить хотя бы то, сколько сил и времени сэкономлено за счёт сокращения количества строк. «Достаточно одной таблетки» (с). В данном случае – одной строки, а результат одинаковый.
Давайте тезисно определим основные правила синтаксиса:
— используя питон, мы пишем на английском языке;
— все названия переменных, функций, классов должны как можно полнее отражать их суть и содержание;
— названия переменных и функций принято писать в нижнем регистре, разделяя слова подчёркиванием (snake_case):
#НЕ правильно
MyNumber = 42
Mynumber = 42
MYNUMBER = 42
mynumber = 42
МоЙнОмЕр = 42
def MyFunction():
def Myfunction():
def MYFUNCTION():
def myfunction():
— названия классов принято писать в CamelCase – слова пишутся с заглавной буквы без разделителей между словами:
#НЕ правильно
все остальные варианты
— для названия переменных, функций и классов нельзя использовать зарезервированные слова (слова, которые зашиты в питоне в качестве операторов, имен встроенных функций, классов и их атрибутов и методов);
— конец строки является концом инструкции (никакие специальные знаки не требуются);
— вложенные инструкции объединяются в блоки по величине отступов. 1 отступ = 4 пробела;
— вложенные инструкции в Python записываются в соответствии с одним и тем же шаблоном: основная инструкция завершается двоеточием, вслед за которым располагается вложенный блок кода с отступом в 4 пробела под строкой основной инструкции.
if a == 1:
print(‘mama’ * 3) # 4 пробела после двоеточия
— в случае, если длина инструкции превышает 80 знаков, допустимо записывать одну инструкцию в нескольких строках. Достаточно ее заключить в пару круглых, квадратных или фигурных скобок:
if (a == 1 and b == 2 and
c == 3 and d == 4): # продолжение инструкции выравнивается по открывающей скобке
print(‘mama’ * 3) # 4 пробела после двоеточия
— тело составной инструкции может располагаться в той же строке, что и тело основной, если тело составной инструкции не содержит составных инструкций.
— технически возможно записать несколько инструкций в одной строке, разделяя их точкой с запятой (но такой способ не приветствуется, т.к. не соответствует стилю кодирования PEP8):
Это основные вещи, которые нужно выучить. Благо, что мы живём в 21 веке и рабочие среды уже давно умеют анализировать наш код на соответствие стилю, а также полно разнообразных сторонних линтеров. Поэтому, если вы переживаете, что вы не осилите этот момент – ваша IDE вам подскажет, где что поправить, и в большинстве случаев – сама же и поправит. Если она этого самостоятельно делать не умеет, то можно воспользоваться сторонними линтерами.
Что будет, если на всё это забить и писать как бог на душу положит? Да ничего. Просто вас проклянут до десятого колена те, кто будет это читать, а в остальном ничего.
Также у питона есть свой собственный сборник мантр, который также призван формировать хороший стиль у разработчиков. Выполним в консоли команду:
Перевод на русский конечно же существует:
Дзен Пайтон (составлен Тимом Питерсом)
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец (это такая шутливая отсылка к Гвидо).
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная вещь! Давайте будем делать их больше!
Все эти правила кажутся на первый взгляд элементарными. Но как я уже сказал выше: сформулировать что-то кратко и понятно – это искусство. Просто придерживайтесь этих мантр, и всё у вас будет хорошо.
Можно написать в консоли print(), нажать Enter – программа отработает без ошибок, но ничего напечатано не будет. И это нормально, ведь мы не сказали функции, что именно ей нужно напечатать. Пока что мы просто заставили её сработать вхолостую, что она и сделала.
Функция print весьма лояльна к пожеланиям разработчика и готова принимать в себя и выводить на экран почти всё, что ей скажут. Иными словами, она почти всеядная. Вывести её из себя, чтобы она завершилась ошибкой можно, но сложно.
Текст в питоне – это тип данных «строка» (подробнее о них мы поговорим в следующий раз, и поверьте, там есть о чём). Строки должны быть заключены в кавычки.
Hello, world! – это не строка.
«Hello, world!» – а вот это уже строка.
Значит именно так мы и должны передать её в функцию print.
Отлично, мы сделали это! Но, можно ещё интереснее. Например, можно записать строку в переменную, передать в функцию эту переменную и распечатается та же строка:
Мне надоело здороваться со всем миром, я хочу разнообразия. Для этого я хочу сам говорить программе, с кем поздороваться. Для этого я вызову функцию ввода с клавиатуры «input».
На сегодня это всё, спасибо за внимание!
Всё это, конечно же, дублируется в отдельном канале в телеге. По всем вопросам обращайтесь через Telegram.
P.S. Большое спасибо всем моим подписчикам за поддержку и активность! Без вас я, возможно, не решился бы продолжать.
Ссылки на предыдущие посты:
Предлагаю помощь в освоении Питона
На фоне пандемии у населения резко возрос интерес к изучению каких-либо языков программирования с целью «уйти в ай-ти». Стать программистом – желание похвальное, но стать хорошим и востребованным программистом на деле оказывается не так просто, как вам обещает реклама. За 6-12 месяцев от нуля до сениор-разработчика вырасти невозможно. За это время в лучшем случае можно более-менее уверенно освоить один язык программирования, менее уверенно пару фреймворков к нему и пописывать какие-то мелкие программки для решения собственных нужд. Нет, есть конечно же уникумы, но их единицы на тысячи.
Так вот, почти ежедневно я отвечаю на вопросы студентов, которые не смогли воспринять данный им материал. Это происходит по разным причинам:
— материала много, и всё за один вебинар рассказать не удаётся (ограниченная подача информации),
— материал подаётся бессистемно и сбивчиво (неопытность лектора как преподавателя),
— в плане обучения нет нужных реперных точек, которые могли бы якорить теорию в переложении на практику (непродуманность плана обучения),
— а также многое другое.
Сразу хочется предупредить восклицание «да это просто студенты тупые». Отнюдь. Когда человек сам платит деньги за обучение – он обычно знает, чего хочет и зачем ему это нужно. То есть он готов и хочет учиться, но не может воспринять материал, вследствие чего в его голове возникает каша из бессистемных знаний. И всё это уже на базовом уровне, то есть именно там, где всё нужно не просто забить к себе в голову, а разложить по полкам и знать где и что лежит, чтобы в нужный момент это взять, даже если вас подняли посреди ночи. Дело не в зубрёжке. Дело в понимании. Если нет понимания процесса, то нет и возможности этот процесс реализовать.
Не ждите, что я вам скажу что-то принципиально новое. Всё, что я буду излагать, можно было бы легко найти в другом месте. Есть куча сайтов с бесплатным контентом и даже бесплатными курсами. Всё это легко гуглится. Я сам их использовал в своё время, да и сейчас иногда проще что-то быстро нагуглить, чем читать специальную литературу или официальную документацию. В то же время, могу сказать, что лично мне некоторых вещей очень не хватало на старте изучения Python. Прежде всего, не хватало объяснения под другим углом, с другими примерами, иногда очень хотелось повышенной многословности вместо сухих фраз или просто брошенных кусков кода («читай – там всё написано»).
Я рассчитываю, что эти статьи вам помогут начать писать свои собственные программы «для дома, для семьи». Мы не будем лезть в такие дебри, как например, асинхронность. Мы также не будем рассматривать такие библиотеки как NumPy, matplotlib. Только необходимый минимум, только база, никакого хардкора. Но мы будем это делать обстоятельно и поступательно, связывая одно с другим и обрастая нужной информацией углубляться дальше. В каждой теме будут присутствовать примеры в виде рабочих и понятных кусков кода (никаких бессмысленных foo-bar).
В первом приближении план таков:
План неокончательный ни по составу, ни по компоновке, но общий скелет и путь именно такой.
Надеюсь, что всё это поможет всем, кто ищет помощи, но не может её по каким-то причинам найти.
Ещё раз повторюсь: я не являюсь истиной в последней инстанции и не претендую на то, чтобы понравиться всем. Кому-то зайдёт, кому-то нет – это нормально, т.к. обучение – это всегда очень индивидуально, потому что субъективно.