. .full_name = first_name + ' ' + last_name
. .return full_name.title()
# Бесконечный цикл!
while True:
(1) . .print("\nPlease tell me your name:")
. .f_name = input("First name: ")
. .l_name = input("Last name: ")
. .
. .formatted_name = get_formatted_name(f_name, l_name)
. .print("\nHello, " + formatted_name + "!")
В этом примере используется простая версия get_formatted_name(), без вторых имен. В цикле while (1) имя и фамилия пользователя запрашиваются по отдельности.
Но у этого цикла while есть один недостаток: в нем не определено условие завершения. Где следует разместить условие завершения при запросе серии данных? Пользователю нужно предоставить возможность выйти из цикла как можно раньше, так что в приглашении должен содержаться способ завершения. Команда break позволяет немедленно прервать цикл при запросе любого из компонентов:
def get_formatted_name(first_name, last_name):
. ."""Возвращает аккуратно отформатированное полное имя."""
. .full_name = first_name + ' ' + last_name
. .return full_name.title()
while True:
. .print("\nPlease tell me your name:")
. .print("(enter 'q' at any time to quit)")
. .
. .f_name = input("First name: ")
. .if f_name == 'q':
. . . .break
. . . .
. .l_name = input("Last name: ")
. .if l_name == 'q':
. . . .break
. .
. .formatted_name = get_formatted_name(f_name, l_name)
. .print("\nHello, " + formatted_name + "!")
В программу добавляется сообщение, которое объясняет пользователю, как завершить ввод данных, и при вводе признака завершения в любом из приглашений цикл прерывается. Теперь программа будет приветствовать пользователя до тех пор, пока вместо имени или фамилии не будет введен символ 'q':
Please tell me your name:
(enter 'q' at any time to quit)
First name: eric
Last name: matthes
Hello, Eric Matthes!
Please tell me your name:
(enter 'q' at any time to quit)
First name: q
Упражнения
8-6. Названия городов: напишите функцию city_country(), которая получает название города и страну. Функция должна возвращать строку в формате “Santiago, Chile”. Вызовите свою функцию по крайней мере для трех пар «город—страна» и выведите возвращенное значение.
8-7. Альбом: напишите функцию make_album(), которая строит словарь с описанием музыкального альбома. Функция должна получать имя исполнителя и название альбома и возвращать словарь, содержащий эти два вида информации. Используйте функцию для создания трех словарей, представляющих разные альбомы. Выведите все возвращаемые значения, чтобы показать, что информация правильно сохраняется во всех трех словарях.
Добавьте в make_album() дополнительный параметр для сохранения количества дорожек в альбоме. Если в строку вызова включено значение количества дорожек, добавьте это значение в словарь альбома. Создайте как минимум один новый вызов функции с передачей количества дорожек в альбоме.
8-8. Пользовательские альбомы: начните с программы из упражнения 8-7. Напишите цикл while, в котором пользователь вводит исполнителя и название альбома. Затем в цикле вызывается функция make_album() для введенных пользователей и выводится созданный словарь. Не забудьте предусмотреть признак завершения в цикле while.
Передача списка
Часто при вызове функции удобно передать список — имен, чисел или более сложных объектов (например, словарей). При передаче списка функция получает прямой доступ ко всему его содержимому. Мы воспользуемся функциями для того, чтобы сделать работу со списком более эффективной.
Допустим, вы хотите вывести приветствие для каждого пользователя из списка. В следующем примере список имен передается функции greet_users(), которая выводит приветствие для каждого пользователя по отдельности:
greet_users.py
def greet_users(names):
. ."""Вывод простого приветствия для каждого пользователя в списке."""
. .for name in names:
. . . .msg = "Hello, " + name.title() + "!"
. . . .print(msg)
(1) usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
В соответствии со своим определением функция greet_users() рассчитывает получить список имен, который сохраняется в параметре names. Функция перебирает полученный список и выводит приветствие для каждого пользователя. В точке (1) мы определяем список пользователей usernames, который затем передается greet_users() в вызове функции:
Hello, Hannah!
Hello, Ty!
Hello, Margot!
Результат выглядит именно так, как ожидалось. Каждый пользователь получает персональное сообщение, и эту функцию можно вызвать для каждого нового набора пользователей.
Изменение списка в функции
Если вы передаете список функции, код функции сможет изменить список. Все изменения, внесенные в список в теле функции, закрепляются, что позволяет эффективно работать со списком даже при больших объемах данных.
Допустим, компания печатает на 3D-принтере модели, предоставленные пользователем. Проекты хранятся в списке, а после печати перемещаются в отдельный список. В следующем примере приведена реализация, не использующая функции:
printing_models.py
# Список моделей, которые необходимо напечатать.