Язык программирования Python

Тип данных None в Python – что это и как применяется.

Мы уже знаем, что Python – динамически “типизированный” язык. То есть не нужно указывать, к какому типу данных относится переменная, когда она создается.

Она сохраняет этот тип данных на протяжении всего выполнения программы: она может быть сначала целым числом, затем строкой, затем числом с плавающей точкой и так далее.

Все переменные имеют некоторый тип данных, который мы можем узнать с помощью встроенной функции type():

pi = 3.14 print(type(pi))
Code language: PHP (php)
<class 'float'>
Code language: HTML, XML (xml)

Четыре основных типа данных: целое (int), число с плавающей запятой (float), строка (str) и булево (bool).

Однако в Python есть пятый тип данных, который называется NoneType. Его единственное возможное значение – None.

a = None print(type(a))
Code language: PHP (php)
<class 'NoneType'>
Code language: HTML, XML (xml)

Обычно None используется, когда вы хотите создать переменную (поскольку Python не отличает создание от присвоения: создание переменной – это просто присвоение ей значения), но пока не хотите присваивать ей какое-либо конкретное значение.

Хотя как мы уже говорили, None – это тоже значение.

Его не следует интерпретировать как значение NULL в языках типа C и C++, которое применяется только к указателям. None может быть присвоено любому объекту.

# Переменная может быть задана как `None`, а затем ей может быть присвоено другое значение. a = None print(type(a)) a = "Привет, мир!" print(type(a)) # Или наоборот, начать со значения, а затем получить `None`. b = 5 b = None
Code language: PHP (php)

Обратите внимание, что когда мы пишем имя переменной в интерактивной консоли, содержимое которой равно None, ничего не будет показано.

>>> a = None >>> a >>>

Поскольку это такой же тип данных, как и любой другой, с той особенностью, что он имеет только одно возможное значение, мы можем проводить обычные сравнения.

a = None if a == None: print("a - None.") else: print("a = не None.")
Code language: PHP (php)

Хотя это допустимо, рекомендуемый способ проведения сравнений с этим типом данных – использовать зарезервированное слово is.

# Рекомендуемый метод сравнения. a = None if a is None: print("a - None.") else: print("a = не None.")
Code language: PHP (php)

Или для проверки того, что переменная не является None:

a = 1 b = 2 if not a is None: print("a - None.") if b is not None: print("b = не None.")
Code language: PHP (php)

Эти два сравнения похожи, но второе является более рекомендуемым.

Примеры

Когда полезно использовать None?

Мы уже говорили, что это особенно полезно, когда мы хотим создать переменную, но не присваивать ей в данный момент ─ никакого значения.

Например, следующий код ищет строку “Python” в списке языков и печатает ее позицию, если она найдена:

languages = ["C", "C++", "Python", "Java", "Go"] position = None for i, element in enumerate(languages): if element == "Python": position = i break if position is None: print("Элемент не найден.") else: print("Элемент находится на позиции:", i)
Code language: PHP (php)

Здесь мы определяем позицию изначально как None, так как может случиться, что искомый элемент не будет найден в списке.

Если после выполнения цикла значение остается таким, это означает, что элемент не найден.

Начальное значение не может быть нулем, потому что ноль – это допустимый индекс (первый элемент). Не -1, потому что к элементам списка можно обращаться и в обратном порядке (-1 – последний, -2 – предпоследний и т.д.).

Мы видим, что None идеально подходит для этой задачи.

Также None особенно полезен при определении аргументов со значениями по умолчанию.

Рассмотрим функцию, которая принимает список в качестве аргумента и печатает каждый из элементов на экране.

def to_print(list): for element in list: print(element) to_print([1, 2, 3, 4])
Code language: PHP (php)

Теперь мы хотим, чтобы, если пользователь не предоставит в качестве аргумента какой-либо список, он печатал строки из текстового файла.

Назначив None в качестве значения по умолчанию для списка, мы сможем узнать внутри функции, был ли аргумент предоставлен пользователем.

def to_print(list=None): if list is not None: for element in list: print(element) else: with open("my_file.txt") as f: print(f.read())
Code language: PHP (php)

Техническое объяснение

Для тех, кому интересно, техническое объяснение того, почему сравнения выполняются с использованием частицы is, следующее: в памяти хранится только один объект None, и все переменные, имеющие это значение, являются просто “указателями” на этот адрес памяти.

Мы можем проверить это с помощью встроенной функции id(), которая возвращает адрес памяти объекта (обратите внимание, что это одно и то же число).

>>> a = None >>> b = None >>> id(a) 1636093900 >>> id(b) 1636093900

Зарезервированное слово is делает именно это, оно сравнивает адреса памяти двух объектов, что гораздо быстрее, чем операции, выполняемые с помощью равенства (==) и неравенства (!=), которые включают вызов магического метода eq() одного из сравниваемых объектов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *