Python — 100 дней от новичка до мастера
Автор: Ло Хао
Анализ областей применения Python и трудового рынка
Кратко говоря, Python — это "elegantный", "ясный" и "простой" язык программирования.
- Низкая кривая обучения, доступна даже непрофессионалам
- Открытый исходный код с мощной экосистемой
- Интерпретируемый язык, обеспечивающий идеальную переносимость между платформами
- Поддерживает объектно-ориентированное и функциональное программирование
- Возможность расширения функциональности через вызов кода на C/C++
- Высокий уровень стандартизации кода, что обеспечивает его читаемость
Сегодня Python широко используется во многих популярных областях:
- Облачные инфраструктуры — Python / Java / Go
- DevOps — Python / Shell / Ruby / Go
- Веб-скрапинг — Python / PHP / C++
- Анализ данных и машинное обучение — Python / R / Scala / Matlab
- Машинное обучение — Python / R / Java / Lisp
Как Python-разработчику, основные области трудоустройства включают:
- Разработка серверных приложений на Python / игры / API
- Автоматизация операционной среды Python
- Анализ данных / визуализация данных / большие данные
- Разработка скриптов для веб-скрапинга
- Разработка чат-ботов / алгоритмы компьютерного зрения / глубокое обучение
Ниже приведены графики, показывающие спрос на работу с Python и зарплаты в крупнейших городах (по состоянию на май 2018 года).


Рекомендации для начинающих:
- Делайте английский вашим рабочим языком.
- Практика делает мастера.
- Все опыт приходит из ошибок.
- Не будьте паразитами.
- Либо выделяйтесь, либо вас выгонят.
- Описание Python — история Python / преимущества и недостатки / области применения
- Установка окружения для разработки — Windows / Linux / MacOS
- Запуск Python-программ из командной строки — DOS-команды / Привет, мир / функция
print
/ запуск программы
- Использование IDLE — интерактивная среда (REPL) / написание многострочных кодов / запуск программы / выход из IDLE
- Комментарии — роль комментариев / односимвольные комментарии / многострочные комментарии#### День 2 — Элементы языка — Программы и системы счисления — Инструкции и программы / Машина фон Неймана / Двоичная и десятичная системы счисления / Восьмеричная и шестнадцатеричная системы счисления
- Переменные и типы данных — Название переменной / Использование переменной / Функция
input()
/ Проверка типа переменной / Преобразование типов данных
- Числа и строки — Целые числа / Числа с плавающей запятой / Комплексные числа / Строки / Основные операции со строками / Кодировка символов
- Операторы — Математические операторы / Оператор присваивания / Сравнение значений / Логические операторы / Операторы тождественности / Приоритет операторов
- Примеры применения — Конвертация температур из Фаренгейта в Цельсий / Ввод радиуса круга для вычисления его окружности и площади / Ввод года для проверки на високосность
- Применение циклической конструкции - условия / отступы / блоки кода / схемы процессов
- Цикл
while
- базовая структура / оператор break
/ оператор continue
- Цикл
for
- базовая структура / тип данных range
/ ветвящиеся конструкции внутри цикла / вложенные циклы / преждевременное завершение программы
- Прикладные примеры - сумма чисел от 1 до 100 / проверка на простоту числа / игра "Угадай число" / вывод таблицы умножения / печать треугольников / история про монаха и груши / задача "сто денег сто птиц"
-
Основная практика - число Нэшонал / совершенное число / разделение рыбы между пятью людьми / последовательность Фибоначчи / простое число-палиндром
-
Комбинированная практика - игра в кости Craps#### Day06 - использование функций и модулей
-
Зачем нужны функции — плохой запах кода / использование функций для упаковки функциональных модулей
-
Определение функции — ключевое слово def
/ имя функции / список параметров / ключевое слово return
/ вызов пользовательской функции
-
Вызов функции — встроенные функции Python / импорт модулей и функций
-
Параметры функции — параметры со значением по умолчанию / переменные параметры / параметры со значением ключевых слов / параметры с именованными ключевыми словами
-
Возвращаемые значения функции — отсутствие возврата / возврат одного значения / возврат нескольких значений
-
Вопросы области видимости — локальная область видимости / вложенная область видимости / глобальная область видимости / встроенная область видимости / ключевые слова связанные с областью видимости
-
Управление функциями с помощью модулей — понятие модуля / управление функциями с помощью пользовательского модуля / что происходит при конфликте названий (один и тот же модуль и разные модули)#### Day07 - строки и часто используемые структуры данных - Использование строк - вычисление длины / доступ по индексу / срезы / часто используемые методы
-
Основные способы использования списков - создание списка / доступ к элементам по индексу / выход за границы индекса / добавление элементов / удаление элементов / изменение элементов / срезы / циклический перебор
-
Часто используемые операции со списками - объединение / копирование (копия элементов и массива) / длина / сортировка / обратная сортировка / поиск
-
Создание списков - использование range для создания списков чисел / генераторное выражение / генератор
-
Использование кортежей - создание кортежей / использование значений в кортежах / изменение переменной кортежа / преобразование между кортежами и списками
-
Основные способы использования множеств - различие между множеством и списком / создание множества / добавление элементов / удаление элементов / очистка
-
Часто используемые операции со множествами - пересечение / объединение / разность / симметрическая разность / подмножество / надмножество
-
Основные способы использования словарей - особенности словарей / создание словаря / добавление элементов / удаление элементов / получение значений / очистка- Часто используемые операции со словарями - метод keys()
/ метод values()
/ метод items()
/ метод setdefault()
-
Базовые задачи - эффект бегущей строки / поиск максимального элемента в списке / расчет среднего балла экзаменационных оценок / последовательность Фибоначчи / треугольник Паскаля
-
Интегрированные примеры - выбор номеров лотереи "Двойной шанс" / игра "Крестики-нолики"
-
Атрибуты - атрибуты класса / атрибуты экземпляра / геттеры / сеттеры / делетеры / использование __slots__
-
Методы в классах - методы экземпляров / методы класса / статические методы
-
Переопределение операторов - __add__
/ __sub__
/ __or__
/ __getitem__
/ __setitem__
/ __len__
/ __repr__
/ __gt__
/ __lt__
/ __le__
/ __ge__
/ __eq__
/ __ne__
/ __contains__
-
Отношения между объектами классов - ассоциация / наследование / зависимость
-
Наследование и полиморфизм - что такое наследование / синтаксис наследования / вызов методов родителя / переопределение методов / проверка типа / множественное наследование / алгоритмы C3 и ромбовидное наследование
-
Интегрированные примеры - система расчета зарплат / автоматическая система скидок книг / пользовательский класс дробей#### Day10 - Графический пользовательский интерфейс и разработка игр
-
Разработка графического пользовательского интерфейса с помощью tkinter
-
Разработка приложений для игр с использованием библиотеки pygame
-
Игра "Большие шарики поглощают маленькие"
- Чтение файла — чтение всего файла / чтение построчно / пути к файлам
- Запись в файл — запись поверх существующего содержимого / добавление нового содержимого / текстовые файлы / двоичные файлы
- Обработка исключений — важность механизма исключений / блоки try-except / блоки else / блоки finally / типы встроенных исключений / стек исключений / ключевое слово raise
- Устойчивость данных — общие сведения о CSV-файлах / применение модуля csv / формат JSON / применение модуля json
- Интегрированные примеры — анализ текста песен#### Day12 - Строки и регулярные выражения - Продвинутые операции со строками - Экранирующие символы \ Начальные строки \ Многострочные строки \ Операторы in и not in \ Методы с префиксом is \ Методы join и split \ Методы strip \ Модуль pyperclip \ Непостоянные и постоянные строки \ Использование модуля StringIO
- Введение в регулярные выражения - Задачи регулярных выражений \ Метасимволы \ Экранирование \ Кванторы \ Группировка \ Нулевые границы \ Жадное и ленивое соответствие \ Использование модуля re для работы с регулярными выраженияи (соответствие, поиск, замена, захват)
- Работа с регулярными выражениями - Модуль re \ Функция compile \ Методы group и groups \ Метод match \ Метод search \ Методы findall и finditer \ Методы sub и subn \ Метод split
- Прикладные примеры - Использование регулярных выражений для проверки введенной строки
- Основы компьютерных сетей - история развития компьютерных сетей / модель TCP/IP / IP-адреса / порты / протоколы / другие связанные концепции
- Архитектура сетевых приложений - архитектура клиент-сервер / архитектура браузер-сервер
- Сетевое программирование на Python - концепция сокетов / модуль socket / функция socket / создание TCP-сервера / создание TCP-клиента / создание UDP-сервера / создание UDP-клиента / модуль SocketServer
- Доступ к сетевым API - общее представление о сетевых API / доступ к URL / модуль requests / парсинг данных в формате JSON
- Передача файлов - протокол FTP / модуль ftplib / интерактивное приложение FTP
- Электронная почта - протокол SMTP / протокол POP3 / протокол IMAP / модуль smtplib / модуль poplib / модуль imaplib
- SMS-услуги - модуль twilio / SMS-услуги в Китае
- Часто используемые структуры данных
- Продвинутый подход к работе с функциями - "первый класс" / высшие порядки функций / lambda-функции / области видимости и замыкания / декораторы
- Продвинутые знания объектно-ориентированного программирования - "три столпа" / отношения между классами / сборка мусора / магические свойства и методы / микси / метаклассы / принципы объектно-ориентированного проектирования / паттерны проектирования GoF
- Итераторы и генераторы - связанные магические методы / два способа создания генераторов
- Параллелизация и асинхронное программирование - многопоточность / многопроцессорность / асинхронное I/O / async и await
Day21~30 - Введение в front-end Web-разработку- Использование HTML-тегов для отображения содержимого страницы
- Использование CSS для рендера страницы
- Использование JavaScript для управления интерактивным поведением
- Введение в jQuery и его применение
- Введение в Vue.js
- Использование библиотеки Element
- Использование библиотеки Bootstrap
-
Относительные базы данных MySQL
- Обзор относительных баз данных
- Установка и использование MySQL
- Использование SQL
- DDL — язык определения данных — создание / удаление / изменение
- DML — язык управления данными — вставка / удаление / обновление / выбор
- DCL — язык контроля доступа — предоставление / отзыв
- Связанные знания
- Теория нормализации — руководящие идеи для проектирования двухмерных таблиц
- Интегрированность данных
- Консистентность данных
- Работа с MySQL в Python
-
Начало работы с NoSQL
- Обзор NoSQL
- Обзор Redis
- Обзор MongoDB
- Принцип работы веб-приложений и протокол HTTP
- Обзор фреймворка Django
- Быстрый старт за cq минут
- Использование представлений и шаблонов
- Параллельное программирование
- Модели I/O и событийного драйвера
- Обзор Tornado
- Быстрый старт с использованием Tornado за Yöntem 5 минут
- Распределение маршрутов
- Обработчики запросов
- Использование aiomysql и aioredis
-
Введение в WebSocket
-
Программирование серверной части WebSocket
-
Программирование клиентской части WebSocket
-
Проект: Веб-чат#### День 65 - Практическая работа над проектом
-
Разделение на фронтенд и бэкенд при разработке проекта и создание документации API
-
Реализация фронтального отображения с помощью Vue.js
-
Реализация отчётной функциональности с помощью ECharts
-
Реализация сервиса push с использованием WebSocket
День 76 - Основы машинного обучения#### День77 - Применение Pandas#### День78 - [Применение NumPy и SciPy](./Day76-90/03.NumPy и SciPy применения)
День79 - [Matplotlib и визуализация данных](./Day76-90/04.Matplotlib и данные визуализации)
День80 - [К ближайшему соседу (KNN) классификация](./Day76-90/05.K-ближайший сосед классификация.md)
День81 - [Деревья решений](./Day76-90/06.деревья решения.md)
День82 - [Байесовская классификация](./Day76-90/07.Байесовская классификация.md)
День83 - [Поддержка векторной машины (SVM)](./Day76-90/08.поддержка векторная машина.md)
День84 - [K-средние кластеры](./Day76-90/09.K-средние кластеры.md)
День85 - [Анализ регрессии](./Day76-90/10.регрессия анализ.md)
День86 - [Основы анализа больших данных](./Day76-90/11.основы анализа больших данных.md)
День87 - [Повышение уровня анализа больших данных](./Day76-90/12.повышение уровня анализа больших данных.md)
День88 - [Основы TensorFlow](./Day76-90/13.TensorFlow основы.md)
День89 - [Практическое применение TensorFlow](./Day76-90/14.TensorFlow практика.md)
День90 - [Рекомендательные системы](./Day76-90/15.рекомендательные системы.md)
День91: Создание команды и выбор проекта1. Модели процесса программирования
-
Классическая модель процесса (модель водопада)
- Анализ возможности (выявление целесообразности начала проекта), выход — «Отчет о анализе возможностей».
- Анализ требований (определение конкретных задач), выход — «Спецификация требований» и прототип продукта.
- Общее проектирование и детальное проектирование, выход — концептуальная модель, физическая модель, диаграмма классов, последовательность событий и т.д.
- Программирование / тестирование.
- Ввод в эксплуатацию / обслуживание.
-
Агилное развитие (Scrum) - владелец продукта, Scrum мастер, разработчики - спринты
- Бэклог продукта (истории пользователя, прототип продукта).
- Плановое совещание (оценка и бюджет).
- Ежедневное развитие (стандартное совещание, методика Pomodoro, парное программирование, тестирование перед программированием, рефакторинг кода...).
- Устранение ошибок (описание проблемы, шаги воспроизведения, тестировщики, назначенные исполнители).
- Совещание по проверке (показывание работы).
- Совещание по обратной связи (что хорошо и плохо было сделано в текущем цикле). > Дополнительно: Декларация агилного программирования
-
Личности и взаимодействие важнее процесса и инструментов
-
Работающее программное обеспечение важнее подробной документации
-
Сотрудничество с клиентами важнее переговоров
-
Ответ на изменения важнее соблюдения плана
Роли: продукт-OWNER (определяет, что делать и принимает решения относительно требований), лидер команды (решает различные проблемы, сосредоточен на том, как лучше работать, защищает команду от внешних воздействий), команда разработчиков (исполнитель проекта, конкретно — программисты и тестировщики).
Подготовка: бизнес-кейсы и финансы, контракты, мечты, первоначальные требования к продукту, начальный план выпуска, инвестиции, создание команды.
Обычно в агилной команде насчитывается 8–10 человек.
Оценка объема работы: количественная оценка задач разработки, включая прототипирование, дизайн логотипа, UI-дизайн, фронтенд-разработку и т. д., с целью разделения каждого задания на минимальные подзадачи. Минимальная подзадача должна занимать не более двух рабочих дней. После этого оценивается общее время выполнения проекта. Каждое задание прикрепляется к доске, которая разделена на три части: to do (не выполненное), in progress (выполняется) и done (выполнено).
Сборка команды проекта- Состав и роли команды
Примечание: Благодарю госпожу Фу Шяньин за создание следующей красивой организационной схемы компании.

-
Программистские нормы и проверка кода (flake8, pylint)

-
Некоторые "обычаи" в Python (см. Обычаи Python — как писать "питонический" код)
-
Причины, влияющие на читаемость кода:
- Недостаточное количество комментариев или отсутствие комментариев
- Код, нарушающий лучшие практики языка
- Антипаттерны программирования (тестовая лапша, копирование-вставка, самолюбование, ...)
Введение в инструменты для командного развития
Для более подробной информации см. Инструменты для командного развития проекта.
Выбор темы проекта и понимание бизнеса
-
Определение области выбора темы
-
CMS (клиентская сторона): Новостные агрегаторы, сайты вопросов и ответов, сайты отзывов на фильмы и книги.
-
MIS (клиентская + административная стороны): KMS, системы оценки KPI, HRS, CRM, системы управления цепочками поставок, системы управления складом. - Back-end приложений (административная сторона + API): Приложения для вторичной торговли, журналы и газеты, малый бизнес электронной коммерции, новостные порталы, туризм, социальные сети, чтение.
-
Другие типы: Отраслевое и опытное знание, легко понимаемые и контролируемые бизнес-процессы.
-
Понимание требований, разделение на модули и распределение задач
- Понимание требований: мозговой штурм и анализ конкурентов.
- Разделение на модули: создание карт мышления (XMind), каждый модуль является ветвлением, каждая конкретная функция является листовым узлом (выражается глаголами), необходимо убедиться, что каждый листовой узел не может порождать новые узлы, определить важность, приоритет и объём работы каждого листового узла.
- Распределение задач: руководитель проекта распределяет задачи каждому участнику команды на основе вышеупомянутых критериев.
3. Создание плана выполнения проекта (ежедневное обновление)| Модуль | Функционал | Человек | Статус | Выполнено | Часы работы | Плановая дата начала | Реальная дата начала | Плановая дата окончания | Реальная дата окончания | Примечание |
|--------|------------|---------|--------|-----------|-------------|----------------------|-----------------------|--------------------------|--------------------------|--------------|
| Комментарий | Добавление комментария | Ван Дацай | В процессе | 50% | 4 | 07.08.2018 | | 07.08.2018 | | |
| | Удаление комментария | Ван Дацай | Ожидание | 0% | 2 | 07.08.2018 | | 07.08.2018 | | |
| | Просмотр комментария | Бай Юаньфана | В процессе | 20% | 4 | 07.08.2018 | | 07.08.2018 | | Необходима проверка кода |
| | Голосование за комментарий | Бай Юаньфана | Ожидание | 0% | 4 | 08.08.2018 | | 08.08.2018 | | |
День 92: Проектирование баз данных и OOAD#### Концептуальная модель и прямое проектирование
-
Диаграмма классов в UML (Unified Modeling Language)

-
Создание таблиц на основе модели (прямое проектирование)
python manage.py makemigrations app
python manage.py migrate
Физическая модель и обратное проектирование
-
PowerDesigner

-
Создание модели на основе таблиц данных (обратное проектирование)
python manage.py inspectdb > app/models.py
Дни 93–98: Разработка проекта с использованием Django
Примечание: Подробнее см. «Конспект знаний Django».
Общие проблемы при разработке проекта
- Настройка баз данных (несколько баз данных, мастер-слейв репликация, маршрутизация баз данных)
- Настройка кэширования (разделение кэша, установка ключей, настройка времени жизни, мастер-слейв репликация, восстановление после отказа (sentinel))
- Настройка журнала
- Анализ и отладка (Django-Debug-Toolbar)
- Полезные модули Python (вычисление дат, обработка изображений, шифрование данных, использование сторонних API)
Проектирование REST API1. Архитектура RESTful
-
Написание документации для API (см. «Проектирование сетевых API»).
-
Применение django-REST-framework#### Анализ сложностей проекта
-
Использование кэширования для снижения нагрузки на базу данных — Redis
-
Использование очередей сообщений для декомпозиции и ограничения пиков — Celery + RabbitMQ
Дни 99–100: Тестирование и развертывание
Единичные тесты
- Виды тестов
- Написание единичных тестов (unittest, pytest, nose2, tox, ddt, ...)
- Охват тестами (coverage)
Развертывание проекта
Примечание: Подробнее см. «Руководство по развертыванию проекта».
- Подготовка к развёртыванию
- Ключевые настройки (SECRET_KEY / DEBUG / ALLOWED_HOSTS / кэш / база данных)
- HTTPS / CSRF_COOKIE_SECURE / SESSION_COOKIE_SECURE
- Настройки логирования
- Обзор часто используемых команд в Linux
- Установка и конфигурация основных служб в Linux
- Использование uWSGI/Gunicorn и Nginx
- Сравнение Gunicorn и uWSGI
- Для простых приложений, не требующих значительной кастомизации, Gunicorn является хорошим выбором; кривая обучения для uWSGI намного круче, чем для Gunicorn. По умолчанию параметры Gunicorn уже подходят большинству приложений.
- uWSGI поддерживает гетерогенную установку.
- Поскольку сам Nginx поддерживает uWSGI, обычно его используют вместе с uWSGI для развёртывания в продакшене. Кроме того, uWSGI представляет собой полнофункциональное и высоко кастомизируемое WSGI средство.
- В плане производительности Gunicorn и uWSGI примерно равны.
- Технология виртуализации (Docker)
Проверка производительности> Примечание: подробная информация доступна в «Обзор ключевых понятий Django».
- Использование Apache Bench (AB)
- Использование SQLSlap
- Использование SysBench
Автоматизация тестирования
- Автоматизация тестирования с использованием Shell и Python
- Автоматизация тестирования с помощью Selenium
- Selenium IDE
- Selenium WebDriver
- Selenium Remote Control
- Введение в тестовый фреймворк Robot Framework
Оптимизация производительности проекта
-
Оптимизация производительности баз данных — см. «Основные знания о MySQL»
-
Оптимизация производительности веб-сервера
-
Оптимизация производительности кода
- Использование многопоточности
- Преобразование в асинхронный режим
-
Оптимизация доступа к статическим ресурсам
Благодарность: благодарю моих коллег Гуйя, Чжаньцзюнь, Сяоширонг, Ванхаифэй, Юнджиявей, Люфэнконг за предоставленные ими технические советы и помощь.
Комментарии ( 0 )