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