В этом уроке вы узнаете, что такое значение None в Python и о том, как его правильно применять в своем коде.
Что такое None в Python?
None в Python— это специальный объект класса NoneType. Чтобы использовать значение None, вы указываете его следующим образом:
None
Если вы используете функцию type() для проверки типа значения None, вы получите класс NoneType:
print(type(None))
Выход:
<class 'NoneType'>
None — это одноэлементный объект класса NoneType. Это означает, что Python создает один и только один объект None во время выполнения.
Таким образом, если вы используете равенство(==) или оператор is для сравнения None с None, вы получите результат True:
print(None == None) print(None is None)
Выход:
True True
Хорошей практикой является использование оператора is или is not для сравнения значения с None.
Причина в том, что определяемые пользователем объекты могут изменить поведение оператора равенства, переопределив метод __eq__(). Например:
class Apple:
def __eq__(self, other):
return True
apple = Apple()
print(apple == None)
Выход:
True
Обратите внимание, что вы не можете переопределить поведение оператора is, как это происходит с оператором равенства(==).
Также важно отметить, что объект None имеет следующие возможности:
- None не равно нулю(0, 0,0, …).
- None — это не то же самое, что False.
- None — это не то же самое, что пустая строка(»).
- Сравнение None с любым значением вернет False, кроме самого None.
Применение объекта None
Давайте рассмотрим несколько практических примеров использования объекта None.
1) Использование Python None в качестве начального значения переменной
Если переменная не имеет начального значения, вы можете присвоить ей None, например:
state = None
Затем вы можете проверить, присвоено ли переменной значение или нет, проверив ее с помощью None следующим образом:
if state is None:
state="start"
2) Использование None для устранения проблемы с изменяемым аргументом по умолчанию
Следующая функция добавляет цвет в список:
def append(color, colors=[]):
colors.append(color)
return colors
Она работает так, как и ожидалось, если вы передаете существующий список:
colors = ['red', 'green']
append('blue', colors)
print(colors)
Выход:
['red', 'green', 'blue']
Однако проблема возникает, когда вы используете значение второго параметра по умолчанию. Например:
hsl = append('hue')
print(hsl)
rgb = append('red')
print(rgb)
Выход:
['hue'] ['hue', 'red']
Проблема в том, что функция создает список после определения и использует один и тот же список при каждом последующем вызове.
Чтобы устранить эту проблему, вы можете использовать значение None в качестве параметра по умолчанию следующим образом:
def append(color, colors=None):
if colors is None:
colors = []
colors.append(color)
return colors
hsl = append('hue')
print(hsl)
rgb = append('red')
print(rgb)
Выход:
['hue'] ['red']
3) None в качестве возвращаемого значения функции
Если функция не имеет возвращаемого значения, по умолчанию она возвращает None. Например:
def say(something):
print(something)
result = say('Hello')
print(result)
Функция say() ничего не возвращает; поэтому она возвращает None.
