Я пишу информационный бюллетень для учащихся под названием Mighty Knowledge. Каждый новый выпуск содержит ссылки и основные уроки из самого лучшего контента, включая цитаты, книги, статьи, подкасты и видео. Каждый выбран специально для того, чтобы научиться жить более мудрой, счастливой и полной жизнью. Зарегистрируйтесь здесь.
Апокалипсис приближается ……
Нет, это не конец света… .. это конец Python 2!
Python 2 будет официально выведен из эксплуатации и не будет поддерживаться с 1 января 2020 г. Эта новость ужасна для некоторых (пользователей старой школы Python 2) и является огромным облегчением для других. (крутые пользователи Python 3).
Так что это значит для тех, кто кодирует на Python? Вы вынуждены перейти на Python 3?
Фактически, ответ однозначный: да.
Многие из крупных проектов Python подписали обещание полностью перейти на Python 3 и отказаться от Python 2. Мы говорим о некоторых действительно тяжелых в очень распространенных приложениях:
- Наука о данных: Pandas, Numpy, Scipy и т. д.
- Машинное обучение: TensorFlow, Scikit-Learn, XGBoost и т. д.
- Интернет: запросы, Торнадо
- Еще много
Излишне говорить, что, когда все эти основные библиотеки полностью переходят на Python 3, обновление базы кода становится практической необходимостью.
В этой статье я поделюсь с вами 5 простыми советами по переходу с Python 2 на 3, которые сделают переход плавным.
(1) Импорт
Python 2 использовал относительный импорт, в то время как Python 3 теперь использует абсолютный импорт, чтобы сделать вещи более явными.
Рассмотрим следующий пример структуры папок:
py_package
├── main_code.py
└── helper_code.py
При относительном импорте Python 2 оператор импорта записывается относительно текущего файла. Например, если бы мы хотели импортировать некоторый вспомогательный код в наш основной код, мы бы сделали что-то вроде этого:
from helper_code import help_function
Python 3 больше не поддерживает этот стиль импорта, поскольку неясно, хотите ли вы «относительный» или «абсолютный» helper_code
. Если бы на вашем компьютере был установлен пакет Python с именем helper_code
, вы ошиблись бы!
Python 3 теперь требует, чтобы вы использовали явный импорт, который явно указывает расположение модуля, который вы хотите использовать, относительно вашего текущего рабочего каталога. Таким образом, импорт вашего вспомогательного кода выглядит так:
from .helper_code import help_function
Обратите внимание на новый .
рядом с именем пакета, который указывает, что пакет находится в текущей папке. Вы также можете сделать что-то вроде ..helper_code
, которое сообщает Python, что пакет helper_code
находится на 1 каталог выше текущего из main_code.py
. Главное, что Python 3 требует, чтобы вы указали точное местоположение пакета.
(2) Распечатать выписки
Ужасные операторы печати Python!
Большинство из нас в то или иное время сталкивались с ошибкой, связанной с операторами печати Python. Это изменение, которое на 100% потребует от любого, кто использует операторы печати Python 2, переключиться на стиль Python 3.
# Python 2 style print "Hello, World!"
# Python 3 styleprint("Hello, World!")
По сути, вам нужно будет заключать в квадратные скобки все операторы печати во всем коде. К счастью, если в операторах печати есть скобки, они будут работать как с Python 2, так и с Python 3.
(3) Целочисленное деление
В Python 2 целые числа делятся с помощью оператора /
, и результат округляется до ближайшего целого числа. Если вы хотите, чтобы результат был числом с плавающей запятой, вам сначала нужно было бы преобразовать числа в число с плавающей запятой, а затем затем выполнить деление.
Python 3 устраняет необходимость явного преобразования в число с плавающей запятой с помощью двух разных операторов: /
для деления с плавающей запятой и //
для целочисленного деления.
### Python 2 a = 3 // 2 # Result is 1 b = 3 / 2 # Result is 1 c = float(3) / float(2) # Result is 1.5 ### Python 3 a = 3 // 2 # Result is 1 b = 3 / 2 # Result is 1.5
Использование явных операторов в Python 3 делает код более чистым и читаемым - мы точно знаем, что //
предназначен для целых чисел, а /
- для чисел с плавающей запятой, без необходимости выполнять явное преобразование типов.
Определенно стоит остерегаться нового оператора дивизиона. Если вы забыли преобразовать /
в //
для целочисленного деления при переходе с Python 2 на 3, тогда вы получите числа с плавающей запятой там, где изначально были целые числа!
(4) Форматирование строки
Синтаксис форматирования строк в Python 3 стал намного чище. В Python 2 вы бы использовали знаки %
следующим образом:
"%d %s" % (int_number, word)
"%d / %d = %f" % (10, 5, 10 / 5)
В отношении этих операторов Python 2 следует отметить несколько моментов:
- Типы переменных указаны явно (% d для int,% s для строки и% f для float)
- Оператор строки и переменные записываются отдельно, бок о бок
- Сам стиль очень похож на отпечатки Python 2; без скобок, знаков% для вставки переменных и т. д.
Python 3 теперь использует так называемое средство форматирования строк, которое содержится в строковом классе Python str.format()
. Средство форматирования строк позволяет объединять элементы в строку с помощью позиционного форматирования.
"{} {}".format(int_number, word
)
"{} / {} = {}".format(10, 5, 10 / 5)
С новой функцией format()
совсем не нужно указывать тип, и все записывается одним чистым оператором. Все, что вам нужно сделать, это убедиться, что переменные в порядке и все будет работать без сбоев.
(5) Возврат повторяемых объектов вместо списков
Многие встроенные функции теперь возвращают итератор вместо списка в Python 3. Основная причина этого изменения заключается в том, что итераторы обычно потребляют больше памяти, чем списки.
Когда вы используете итератор, элементы создаются и сохраняются в памяти по мере необходимости. Это означает, что если вам нужно создать 1 миллиард чисел с плавающей запятой с помощью итератора, вы будете сохранять их в памяти только по одному. Если вы хотите создать список из 1 миллиарда чисел с плавающей запятой, вам нужно будет убедиться, что у вас достаточно оперативной памяти, поскольку все данные будут храниться в памяти одновременно.
Во многих случаях поведение итератора по сравнению со списком будет одинаковым. Одним из примеров этого является цикл по выходу функции range()
.
# Python 2 range() function returns a list for i in range(10): print(i) # Python 3 range() function returns an iterator for i in range(10): print(i)
Обратите внимание на тот же синтаксис, хотя при использовании Python 3 у нас есть итератор. Единственное, о чем следует помнить, - это то, что если вы действительно хотите иметь список, все, что вам нужно сделать, это напрямую преобразовать тип: list(range(10))
.
Вот некоторые наиболее часто используемые функции и методы, которые возвращают итераторы вместо списков в Python 3:
- zip ()
- карта()
- фильтр()
- Методы Python dict ():
.keys()
,.values(),
.items()
Любите учиться?
Следуйте за мной в твиттере, где я публикую все о новейших и величайших достижениях искусственного интеллекта, технологий и науки! Присоединяйтесь и ко мне в LinkedIn!