>>> comment = commentary('blue')
Функция сделает следующее:
• присвоит значение 'blue' параметру функции color;
• пройдет по логической цепочке if-elif-else;
• вернет строку;
• присвоит строку переменной comment.
Что мы получим в результате?
>>> print(comment)
I've never heard of the color blue.
Функция может принимать любое количество аргументов (включая нуль) любого типа. Она может возвращать любое количество результатов (также включая нуль) любого типа. Если функция не вызывает return явно, вызывающая сторона получит результат None.
>>> print(do_nothing())
None
None может быть полезным
None — это специальное значение в Python, которое заполняет собой пустое место, если функция ничего не возвращает. Оно не является булевым значением False, несмотря на то что похоже на него при проверке булевой переменной. Рассмотрим пример:
>>> thing = None
>>> if thing:
…·····print("It's some thing")
… else:
…·····print("It's no thing")
…
It's no thing
Для того чтобы понять важность отличия None от булева значения False, используйте оператор is:
>>> if thing is None:
…·····print("It's nothing")
… else:
…·····print("It's something")
…
It's nothing
Разница кажется небольшой, однако она важна в Python. None потребуется вам, чтобы отличить отсутствующее значение от пустого. Помните, что целочисленные нули, нули с плавающей точкой, пустые строки (''), списки ([]), кортежи ((,)), словари ({}) и множества (set()) все равны False, но не равны None.
Напишем небольшую функцию, которая выводит на экран проверку на равенство None:
>>> def is_none(thing):
…·····if thing is None:
…·········print("It's None")
…·····elif thing:
…·········print("It's True")
…·····else:
…·········print("It's False")
…
Теперь выполним несколько проверок:
>>> is_none(None)
It's None
>>> is_none(True)
It's True
>>> is_none(False)
It's False
>>> is_none(0)
It's False
>>> is_none(0.0)
It's False
>>> is_none(())
It's False
>>> is_none([])
It's False
>>> is_none({})
It's False
>>> is_none(set())
It's False
Позиционные аргументы
Python довольно гибко обрабатывает аргументы функций в сравнении с многими языками программирования. Наиболее распространенный тип аргументов — это позиционные аргументы, чьи значения копируются в соответствующие параметры согласно порядку следования.
Эта функция создает словарь из позиционных входных аргументов и возвращает его:
>>> def menu(wine, entree, dessert):
…·····return {'wine': wine, 'entree': entree, 'dessert': dessert}
…
>>> menu('chardonnay', 'chicken', 'cake')
{'dessert': 'cake', 'wine': 'chardonnay', 'entree': 'chicken'}
Несмотря на распространенность аргументов такого типа, у них есть недостаток, который заключается в том, что вам нужно запоминать значение каждой позиции. Если бы мы вызвали функцию menu(), передав в качестве последнего аргумента марку вина, обед вышел бы совершенно другим:
>>> menu('beef', 'bagel', 'bordeaux')
{'dessert': 'bordeaux', 'wine': 'beef', 'entree': 'bagel'}
Аргументы — ключевые слова
Для того чтобы избежать путаницы с позиционными аргументами, вы можете указать аргументы с помощью имен соответствующих параметров. Порядок следования аргументов в этом случае может быть иным:
>>> menu(entree='beef', dessert='bagel', wine='bordeaux')
{'dessert': 'bagel', 'wine': 'bordeaux', 'entree': 'beef'}
Вы можете объединять позиционные аргументы и аргументы — ключевые слова. Сначала выберем вино, а для десерта и основного блюда используем аргументы — ключевые слова.
>>> menu('frontenac', dessert='flan', entree='fish')
{'entree': 'fish', 'dessert': 'flan', 'wine': 'frontenac'}
Если вы вызываете функцию, имеющую как позиционные аргументы, так и аргументы — ключевые слова, то позиционные аргументы необходимо указывать первыми.
Указываем значение параметра по умолчанию
Вы можете указать значения по умолчанию для параметров. Значения по умолчанию используются в том случае, если вызывающая сторона не предоставила соответствующий аргумент. Эта приятная особенность может оказаться довольно полезной. Воспользуемся предыдущим примером:
>>> def menu(wine, entree, dessert='pudding'):