Я пишу информационный бюллетень для учащихся под названием 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 style 
print("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!