Тип NoneType в Python: что это?

Одним из типов данных, предоставляемых Python, является NoneType, с которым вы могли столкнуться при программировании на Python, если видели ключевое слово None.

NoneType — это тип данных Python, который показывает, что объект не имеет значения. None — единственный объект типа NoneType, и вы можете использовать его, чтобы показать, что переменная не имеет значения. None также можно использовать, когда функция не возвращает значение или для определения необязательного параметра в функции.

Вы готовы узнать, как использовать None в этом уроке?

Что такое NoneType в Python?

NoneType в Python — это тип данных, представляющий отсутствие значения или значение null. Объект None — единственный объект Python типа NoneType.

Используя функцию type() в оболочке Python, мы можем увидеть, что None имеет тип NoneType.

>>> type(None)
<class 'NoneType'>

Теперь попробуйте присвоить переменной значение None. Вы увидите, что тип этой переменной также NoneType.

>>> x = None
>>> type(x)
<class 'NoneType'>

Как проверить NoneType в Python?

Как можно проверить, имеет ли объект Python тип NoneType или, другими словами, равно ли значение объекта None?

Чтобы проверить, равен ли объект Python None, можно использовать оператор Python «is». Также можно применить его отрицание с помощью оператора «is not».

Например, возьмем переменную с именем number и присвоим ей значение None.

Затем используйте оператор if/else и оператор is, чтобы проверить, является ли значение этой переменной None или нет.

>>> number = None
>>> 
>>> if number is None:
...     print("The variable number is equal to None")
... else:
...     print("The variable number is not equal to None")
... 
The variable number is equal to None

Используя оператор is, мы правильно определили, что значение переменной number равно None.

Но как именно это работает?

Чтобы понять это, мы просто проверим значение, возвращаемое выражением, использующим оператор is.

>>> number is None
True

Выражение, использующее оператор is, возвращает логическое значение True, означающее, что переменная number равна None.

Теперь присвойте значение переменной number и выполните выражение еще раз.

>>> number = 10
>>> number is None
False

На этот раз мы получаем значение False, поскольку переменная не равна None.

Мы также можем изменить логику выражения, используя оператор Python «is not».

>>> number is not None
True

Как и ожидалось, в этом случае результатом является логическое значение True.

None — это то же самое, что и Undefined в Python?

Если вы впервые слышите о None в Python, вы можете подумать, что None и undefined — это одно и то же в Python.

Это не так…

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

Давайте посмотрим на практике:

>>> print(result)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'result' is not defined

Мы распечатали значение переменной result, не присвоив ей значение. Вот почему мы получаем сообщение об ошибке, в котором говорится, что эта переменная не определена.

Если вы попытаетесь получить доступ к переменной Python до присвоения ей значения, интерпретатор Python выдаст исключение NameError, поскольку переменная, к которой вы пытаетесь получить доступ, не определена.

Теперь присвоим переменной result значение None.

>>> result = None
>>> print(result)
None

На этот раз мы не получаем ошибку при выводе значения переменной result. Мы получаем значение None.

Это показывает, что None и undefined — это не одно и то же в Python.

Может ли функция Python возвращать None?

Функция Python может возвращать None, и это обычно происходит, если функция не имеет оператора return или возвращаемого значения. Примером функции, которая возвращает None, является функция print().

>>> print(print("Hello"))
Hello
None

Первое сообщение «Hello» — это вывод внутренней функции print(). Значение None — это вывод внешней функции print(), которая печатает значение, возвращаемое внутренней функцией print().

Чтобы убедиться, что эта концепция понятна, давайте определим пользовательскую функцию Python, которая не возвращает никакого значения.

Прежде всего, мы определяем функцию с именем custom, которая возвращает целое число 1.

>>> def custom():
...     x = 1
...     return x
... 
>>> print(custom())
1

Вы можете видеть, что когда мы выводим значение, возвращаемое функцией, мы получаем целое число.

Теперь обновите функцию, удалив оператор return, а затем снова выведите вывод функции.

>>> def custom():
...     x = 1
... 
>>> print(custom())
None

Значение, возвращаемое функцией, равно None, поскольку функция не имеет оператора return.

Теперь попробуйте добавить оператор return, не возвращая никакого значения.

>>> def custom():
...     x = 1
...     return
... 
>>> print(custom())
None

Даже в этом случае возвращаемое функцией значение равно None, поскольку даже если присутствует оператор return, этот оператор не возвращает никакого значения.

None как значение по умолчанию для необязательных параметров

В Python None часто используется как значение по умолчанию для необязательных параметров в функции. Передача различных значений для необязательных параметров позволяет настраивать поведение функции.

Чтобы объяснить, как можно использовать None с необязательным параметром, давайте создадим функцию, которая выводит простое сообщение.

def say_hello():
    print("Hello user!")

Давайте вызовем функцию и убедимся, что она работает нормально:

say_hello()

[output]
Hello user!

Теперь добавим имя параметра в функцию. Сделаем этот параметр необязательным.

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

def say_hello(name=None):
    if name is None:
        print(f"Hello user!")
    else:
        print(f"Hello {name}!")

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

# Without passing the optional argument
say_hello()

# Passing the optional argument
say_hello('CodeFatherTech')

[output]
Hello user!
Hello CodeFatherTech!

Как установить переменную в значение null в Python?

В других языках программирования переменная, которая не ссылается ни на один объект, представляется значением null.

Давайте посмотрим, применимо ли значение null к Python.

>>> number = null
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'null' is not defined

При попытке присвоить переменной значение null мы получаем NameError, поскольку имя «null» не определено в Python.

Значение null не применимо к языку программирования Python. Для представления концепции null можно использовать значение None.

None — это то же самое, что ноль или пустая строка в Python?

None в Python не то же самое, что 0, не то же самое, что пустая строка, и не то же самое, что логическое значение со значением False. None — это определенное значение, которое представляет нулевые объекты и переменные.

Как исправить ошибку TypeError в Python: объект NoneType не является итерируемым

Вы запускаете программу Python и получаете следующую ошибку?

TypeError: 'NoneType' object is not iterable

Как можно решить эту ошибку в Python?

Эта ошибка вызвана тем, что вы пытаетесь выполнить итерацию по объекту, значение которого равно None.

Например, представьте, что вы используете цикл for для прохода по элементам списка Python, но значение списка по какой-то причине равно None.

>>> numbers = None
>>> for number in numbers:
...     print(number)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

Мы установили значение номеров списка на None. Затем при итерации по списку с использованием цикла for интерпретатор Python выдает ошибку «TypeError: объект ‘NoneType’ не итерируемый».

И снова эта ошибка TypeError в Python возникает, потому что список, по которому мы перебираемся, равен None и, следовательно, он не является итерируемым объектом.

В этом случае основная причина проблемы очевидна, поскольку мы явно присвоили None переменной numbers.

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

Заключение

Теперь вы должны понимать, что такое None в Python и как его можно использовать в своих программах.

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

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.