Короткие ответы на популярные вопросы о Python

Python — отличный язык для большого количества различных задач: от веба до научных расчетов. Кроме того, он достаточно простой. Настолько, что начать писать на нем можно за день-два. Однако никто не будет спорить, что Python достаточно сильно отличается от большиства популярных языков — таких, как C, C++, C# или Java. В этой статье мы собрали ответы на распространенные вопросы и объяснения некоторых «странностей» Python, которые часто занимают головы как новичков, так и опытных специалистов. 

(Заголовки кликабельны.)


Почему для некоторых вещей используются методы (list.index()), а для некоторых — операторы (len(list))?

Это было сделано в первую очередь для улучшения читаемости. Вторая, немаловажная причина — возможность реализовать эти методы на C.


Почему [] работает быстрее, чем list()?

[] и {} — это часть синтаксиса. Списки и словари, созданные этим методом, инициализируются в байт-коде сразу, тогда как методы list() и dict() требуют поиска в таблице методов.


Почему в Python нет switch/case?

Эти операторы легко заменяются if ... elif ... else или словарем с коллбеками.


Почему итерироваться по списку быстрее, чем по строке?

Это справедливо только для Python 2, но не для Python 3. Кроме того, индексация по массиву происходит быстрее из-за меньшего количества различных проверок.


Почему в Python используется GIL (Global Interpreter Lock)?

Основные преимущества GIL — лучшая производительность в однопоточных программах и более легкая интеграция с потоконебезопасными C-библиотеками.


Зачем в названии некоторых методов есть знаки подчеркивания в начале?

Согласно PEP8, одно нижнее подчеркивание в начале названия метода используется для скрытия метода из списка импортируемых (подобно protected в Java), два подчеркивания — для подстановки имени класса. Методы с двумя знаками подчеркивания в начале и двумя в конце (например, __init__()) — т.н. «магические». Их название и назначение строго определены стандартом языка.


Как 1000000000000000 in range(1000000000000001) работает так быстро в Python 3?

range() — это «ленивая коллекция» в Python 3. Кроме того, метод __contains__() у нее реализован так, что считает, попадает ли заданное число в диапазон за O(1).


Почему необходимо писать self у каждого метода?

Эта идея была заимствована из Modula-3. У такого объявления и вызова методов есть много преимуществ. В том числе: вы можете вызвать любой метод класса на любом объекте, нет необходимости в модификаторах или ключевых словах вроде static, более читаемый и понятный код.

Артём Артемьев, штатный автор