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

Аватар Артём Артемьев

Обложка поста Короткие ответы на популярные вопросы о 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, более читаемый и понятный код.

Лучшая практика
Python
Собеседование
42090