"The joy of coding Python should be in seeing short, concise, readable classes that express a lot of action in a small amount of clear code — not in reams of trivial code that bores the reader to death."
Guido van Rossum

Python — язык программирования, на котором приятно писать и который приятно читать. Мы предлагаем тринадцать лекций осеннего курса CS центра, чтобы посмотреть вглубь языка и попробовать понять, как пользоваться всеми его возможностями. Лекции читает Сергей Лебедев, разработчик в компании JetBrains и преподаватель в Computer Science Center.

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

Фотография сделана осенью 2014 года в Страсбурге, за две недели до начала первого прочтения этого курса.

Лекции курса


Видеозаписи всех лекций в плейлисте на YouTube.

Начало


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

Всё, что вы хотели знать о функциях в Python


Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.

Декораторы и модуль functools


Синтаксис декораторов. Декораторы с аргументами, без аргументов. Примеры использования декораторов. Модуль functools.

Строки, байты, файлы и ввод/вывод


Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io.

Встроенные коллекции и модуль collections


И снова встроенные коллекции: кортеж, список, множество, словарь — обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.

Классы, часть 1


Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.

Исключения и менеджеры контекста


Исключения, зачем они нужны и как их обрабатывать. Встроенные исключения и базовые классы BaseException и Exception. Операторы try...except..else..finally. Менеджеры контекста и модуль contextlib.

Итераторы, генераторы и модуль itertools


Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.

Модули, пакеты и система импорта


Модули. Операторы import и from ... import. Пакеты. Относительный и абсолютный импорт. __init__-фасад. И снова оператор import — обход в глубину.

Классы, часть 2


Дескрипторы: что-как-зачем. Конструктор __new__, класс type и метаклассы. Наследование встроенных типов. Модули abc и collections.abc.

Тестирование


Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test — на порядок лучше. Тестирование свойств и пакет hypothesis.

Быстрее, Python, ещё быстрее


Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.

Многопоточность и GIL


Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.

Что дальше


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

Для разных языков есть списки хороших библиотек, например, Awesome Java, Awesome R и Awesome C++. Конечно же, такой список есть и для Python. В следующий раз, когда вам потребуется библиотека для работы с базой данных, логирования или анализа изображений, смело идите в соответствующий раздел списка за вдохновением.

Комментарии (30)


  1. riivers
    29.03.2016 16:02
    +2

    Плохо слышно вопросы из зала. А так курс очень крутой!


  1. brainick
    29.03.2016 16:50
    +18

    >>Практические задания этого курса доступны только студентам CS центра
    что снижает ценность курса очень сильно.


  1. amarao
    29.03.2016 17:20
    +2

    Wow. Поздравляю Сергея.


  1. shvetsiya
    29.03.2016 21:17
    +2

    Не планируете ли в будущем запустить курс на stepic?


    1. katherins
      29.03.2016 21:21
      +1

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


      1. Postalus
        29.03.2016 22:26
        +1

        Сейчас там 2 курса:

        stepic.org/course/67 — совсем базовый для абсолютных новичков.
        stepic.org/course/512 — пока не открыт, но судя по набору тем — обещает быть не намного более продвинутым.
        Ещё один курс (наиболее продвинутый) должен был стартовать 10 марта, но его отменили. Так что ничего сравнимого с курсом Сергея Лебедева по Питону сейчас на Степике нет.


  1. andrievski88
    29.03.2016 21:17
    +1

    Скажите пожалуйста, я стою перед вопросом изучения Python или PHP, учитывая, что JS я знаю на слабую троечку по пяти бальной. Будет ли полезным для меня ваш курс или искать, что-то попроще?


    1. katherins
      29.03.2016 21:27
      +1

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


  1. qvas
    29.03.2016 21:21
    +1

    А есть тоже самое, но в виде книги?


    1. katherins
      29.03.2016 21:33
      +1

      Какую-то одну книгу сложно посоветовать, поэтому предлагаю обратить внимание на список литературы на странице курса.


  1. J_K
    29.03.2016 21:32
    -1

    >>>Python — язык программирования, на котором приятно писать и который приятно читать.

    Очень, очень спорное заявление.


    1. kolyaflash
      29.03.2016 21:58
      +4

      А почему? Странно слышать непопулярное мнение без подробностей.


      1. J_K
        29.03.2016 22:11
        -6

        Непопулярное? Да ладно! Наберите в гугле «why do people hate python», ну или чтобы далеко не ходить, вот несколько ответов здесь: https://www.quora.com/Why-do-people-hate-Python

        Лично меня безумно бесят отступы. Вот ничего не могу с собой поделать, после C++, JavaScript, Java и C# писать на языке, логика которого основана на отступах, просто невозможно. Тем, у кого это первый ЯП, наверное, нормально, они просто еще не знают, что есть языки, в которых такой заморочки нет.


        1. Spirans
          29.03.2016 22:26
          +7

          why people hate python — 620.000 результатов
          why people love python — 15.800.000 результатов, по версии гугла. так что это таки непопулярное мнение :)
          довод про отступы достаточно странный, с учетом того, что любая IDE сама занимается вопросом отступов и с высокой вероятностью код на большинстве языком все равно будет с отступами.
          а сам курс хороший, спасибо, есть интересные моменты.


          1. skssxf
            30.03.2016 14:59

            Ещё немного версий гугла в процентах за/против:
            python: 97/3
            java: 70/30
            javascript: 84/16
            и внезапно
            ada: 98/2 — вот он, лидер! Простота, элегантность, отступы и скобочки… А люди любят begin-end
            В общем, к версиям гугла нужно с осторожностью подходить.


        1. drafterleo
          29.03.2016 22:35
          +2

          Вы пишете без отступов? Экономите пробелы? :) Лично меня в классических языках несколько напрягают длиннющие лесенки закрывающих фигурных скобок, когда по отступам и без того понятно, где какой структурный блок.


          1. J_K
            29.03.2016 22:45
            +3

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


            1. JC_Piligrim
              30.03.2016 02:47
              +1

              Вы просто пока не поняли дзен Python. Ничего, это бывает. Просто, похоже, что вы изначально начали изучать программирование с языка, где были скобочки для оформления блоков, поэтому приросли к догме, что «нет другого синтаксиса, кроме как в C и фигурные скобки — неизменный атрибут его». Я тоже поначалу после долгих лет практики с C-like языками (C, JS, PHP) смотрел на Python как-то странно. А потом всё понял.

              Python за лаконичность. В данном случае избавляет от необходимости повторять по 2 раза. Зачем оформлять код И скобочками И отступами (как в стандартах кодирования всех С-like языков), когда можно использовать только один инструмент для этого? Всё равно всем приходится делать отступы, чтобы код не превращался в кашу. Опять же, визуальное, графическое выделение блоков в plain-text, да без использования лишних замусоривающих символов — а в этом что-то есть от ТРИЗ, кстати.


              1. J_K
                30.03.2016 05:19
                +3

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


                1. Angel2S2
                  30.03.2016 14:14
                  +2

                  Скобки мне нравятся за их явность — неважно, где они стоят, если они есть, они формируют блок.
                  В пайтон взглянул на код и сразу видишь, что это блок, где начинается и где заканчивается. А со скобками, надо еще внимание обратить, что тут есть скобка, а потом найти, где парная закрывающая скобка. Например, в С if (...) {then} нужно проверить наличие скобки в конце строки (ведь не все ставят скобку под if), чтобы понять, код под if является then или это уже другой код. А если код еще и не оформлен… В пайтон — если под if есть отступ, значит это then, если нет — другой код. Визуально код воспринимается легче, поэтому и читать его проще.

                  Код, который компилируется только если правильно отформатирован, кажется мне по меньшей мере странным.
                  Так в этом то и плюс большой. Пайтон «заставляет» изначально программиста правильно оформлять код. Я вот, например, не могу нормально читать код, который не оформлен. Ладно еще если там десяток строк, но если их 100+… С другой стороны, пока найдешь «лишнюю» скобку, тем более в не оформленном коде, может не мало времени пройти. Или когда нужно большой блок, скажем, if...then убрать в большой функции, искать где конец (закрывающая скобка) порой бывает не очень просто, тем более если код не оформлен. В пайтон с этим проблем нет, хоть в блокноте читай и правь. Да, многие IDE сильно облегчают весь процесс в поиске этих скобок, но речь не об этом.


                  1. TimeCoder
                    30.03.2016 17:47
                    +2

                    Позволю себе возразить. Фигурные скобки в С (С++/Java/C#) — это не только элемент для обозначения блоков кода, но еще и естестественный способ слегка разрядить код. От одного хорошего программиста, много лет назад, перенял я такую привычку: не экономить пробелы. В однородном потоке кода те строки, которые образуют некую логически цельную группу я пишу без пробелов, потом пробел, и следующая группа — получается набор "шагов". Между методами — два пробела. После if, while, for, foreach — за счет скобки получается пробельная строка, это естественным образом облегчает код. И еще момент: видя закрывающую скобку в длинном файле кода, я могу подвести к ней указатель мыши и мне высветится код начала этой строки, т.е. будет видно, какой из циклов или if-ов здесь закрывается.


                    1. Angel2S2
                      31.03.2016 12:00

                      У меня в C# после Pascal был вау-эффект от скобок, после этих begin...end. Код казался значительно понятнее и мне проще было в нем ориентироваться. Сейчас изучаю(!) python, влюбился в него "с первого раза". На НЕ больших блоках (примерах) кода со скобками мне такой код удобнее воспринимать и читать код, чем код пайтона. А вот с большими кусками кода все наоборот, а если код еще и не отформатирован и без подсветки это жесть. Все же фломастеры на вкус и цвет для всех разные.
                      С привычкой "не экономиться пробелы" полностью согласен. Такой код и без подсветки читается не плохо.

                      И еще момент: видя закрывающую скобку в длинном файле кода, я могу подвести к ней указатель мыши и мне высветится код начала этой строки, т.е. будет видно, какой из циклов или if-ов здесь закрывается.
                      Выше я писал
                      Да, многие IDE сильно облегчают весь процесс в поиске этих скобок, но речь не об этом.
                      Понятное дело, что программист работает в своей среде, которая настроена так, как ему удобно. Но это, на мой взгляд, не имеет отношение к какому-то конкретному языку.
                      Если в C/C++/Java/C#/etc можно написать код без форматирования и отступов, то в python это уже не прокатит, т.о. код всегда отформатирован, с первых строк.


                      1. TimeCoder
                        31.03.2016 15:11

                        Сравню с книгой: новая глава начинается с нового листа (Питон), но иногда в начале еще рисуется три звездочки, что подчеркивает начало нового раздела (C#).


                    1. mukizu
                      06.04.2016 00:17

                      То ли дело Python, где уже есть набор pep'ов, которые очень долго прорабатывались и где уже описано, где сколько переносов строк и прочих пробелов должно быть :)

                      Лучше только в Go, где код вообще за тебя отформатируют


        1. kolyaflash
          29.03.2016 22:36
          +3

          Набрал — не увидел ничего необычного. Python «любят» за элегантность кода и «ненавидят» по совсем другим причинам (динамическая типизация, GIL, быстродействие и т.д.).


          1. J_K
            29.03.2016 23:01

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


            1. kolyaflash
              29.03.2016 23:37
              +4

              Мы с вами обсуждали «Python приятно писать и читать» и ваше несогласие с этим, так что это именно тот вопрос.

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


        1. vechnoe
          29.03.2016 23:08
          +4

          А меня раздражают скобки в других языках после Python. Но самый элегантный язык это, конечно, Лисп. А в Python больше всего раздражает раздутая стандартная библиотека, политика Гвидо (помянем reduce), затягивание перехода на 3 версию.


        1. Mixim333
          30.03.2016 18:21

          С Python'ом хотел познакомится еще года 3-4 назад, купил книгу Лутца, но руки так и не доходили до нее, все писал на .NET\C#. Буквально пару дней назад работа заставила реализовать небольшое приложение на Python (использование re, чтение\запись в файл и т.д.) и что Вы думаете: работу завершил примерно за час, хотя до этого на практике Python никогда в глаза не видел.

          Так что Вы в корне не правы насчет Python!


        1. fireSparrow
          30.03.2016 20:04
          +4

          У меня основной опыт программирования был на JS.
          Когда несколько месяцев назад я познакомился с Python, мне показалась очень странной идея задавать логику через форматирование.
          Но сейчас я считаю это очень удачной находкой.
          И во всём остальном код на Python вызывает у меня сильное эстетическое удовольствие.