Однако вторые имена нужны не всегда, а в такой записи функция не будет работать, если при вызове ей передаются только имя и фамилия. Чтобы средний аргумент был необязательным, можно присвоить аргументу middle_name пустое значение по умолчанию; этот аргумент игнорируется, если пользователь не передал для него значение. Чтобы функция get_formatted_name() работала без второго имени, следует назначить для параметра middle_name пустую строку значением по умолчанию и переместить его в конец списка параметров:

(1) def get_formatted_name(first_name, last_name, middle_name=''):

. ."""Возвращает аккуратно отформатированное полное имя."""

(2) . .if middle_name:

. . . .full_name = first_name + ' ' + middle_name + ' ' + last_ name

(3) . .else:

. . . .full_name = first_name + ' ' + last_name

. .return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')

print(musician)

(4)musician = get_formatted_name('john', 'hooker', 'lee')

print(musician)

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

В теле функции мы сначала проверяем, было ли задано второе имя. Python интерпретирует непустые строки как истинное значение, и, если при вызове задан аргумент второго имени, middle_name дает результат True (2). Если второе имя указано, то из имени, второго имени и фамилии строится полное имя. Затем имя преобразуется с капитализацией символов и возвращается в строку вызова функции, где оно сохраняется в переменной musician и выводится. Если второе имя не указано, то пустая строка не проходит проверку if и выполняет блок else (3). В этом случае полное имя строится только из имени и фамилии, и отформатированное имя возвращается в строку вызова, где оно сохраняется в переменной musician и выводится.

Вызов этой функции с именем и фамилией достаточно тривиален. Но при использовании второго имени придется проследить за тем, чтобы второе имя было последним из передаваемых аргументов. Это необходимо для правильного связывания позиционных аргументов в строке (4).

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

Jimi Hendrix

John Lee Hooker

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

<p>Возвращение словаря</p>

Функция может вернуть любое значение, нужное вам, в том числе и более сложную структуру данных (например, список или словарь). Так, следующая функция получает части имени и возвращает словарь, представляющий человека:

person.py

def build_person(first_name, last_name):

. ."""Возвращает словарь с информацией о человеке."""

(1) . .person = {'first': first_name, 'last': last_name}

(2) . .return person

musician = build_person('jimi', 'hendrix')

(3)print(musician)

Функция build_person() получает имя и фамилию и сохраняет полученные значения в словаре в точке (1) . Значение first_name сохраняется с ключом 'first', а значение last_name — с ключом 'last'. Весь словарь с описанием человека возвращается в точке (2). Возвращаемое значение выводится в точке (3) с двумя исходными фрагментами текстовой информации, теперь хранящимися в словаре:

{'first': 'jimi', 'last': 'hendrix'}

Функция получает простую текстовую информацию и помещает ее в более удобную структуру данных, которая позволяет работать с информацией (помимо простого вывода). Строки 'jimi' и 'hendrix' теперь помечены как имя и фамилия. Функцию можно легко расширить так, чтобы она принимала дополнительные значения: — второе имя, возраст, профессию или любую другую информацию о человеке, которую вы хотите сохранить. Например, следующее изменение позволяет также сохранить возраст человека:

def build_person(first_name, last_name, age=''):

. ."""Возвращает словарь с информацией о человеке."""

. .person = {'first': first_name, 'last': last_name}

. .if age:

. . . .person['age'] = age

. .return person

musician = build_person('jimi', 'hendrix', age=27)

print(musician)

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

<p>Использование функции в цикле while</p>

Функции могут использоваться со всеми структурами Python, уже известными вам. Например, используем функцию get_formatted_name() в цикле while, чтобы поприветствовать пользователей более официально. Первая версия программы, приветствующей пользователей по имени и фамилии, может выглядеть так:

greeter.py

def get_formatted_name(first_name, last_name):

. ."""Возвращает аккуратно отформатированное полное имя."""

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги