УПРАЖНЕНИЯ
8-9 . Фокусники: создайте список с именами фокусников . Передайте список функции show_
magicians(), которая выводит имя каждого фокусника в списке .
8-10 . Великие фокусники: начните с копии вашей программы из упражнения 8-9 . Напишите
функцию make_great(), которая изменяет список фокусников, добавляя к имени каждого
фокусника приставку «Great» . Вызовите функцию show_magicians() и убедитесь в том, что
список был успешно изменен .
8-11 . Фокусники без изменений: начните с программы из упражнения 8-10 . Вызовите функ-
цию make_great() и передайте ей копию списка имен фокусников . Поскольку исходный
список остался неизменным, верните новый список и сохраните его в отдельном списке .
Вызовите функцию show_magicians() с каждым списком, чтобы показать, что в одном спи-
ске остались исходные имена, а в другом к имени каждого фокусника добавилась приставка
«Great» .
Передача произвольного набора аргументов
В некоторых ситуациях вы не знаете заранее, сколько аргументов должно быть
передано функции. К счастью, Python позволяет функции получить произвольное
количество аргументов из вызывающей команды.
Для примера рассмотрим функцию для создания пиццы. Функция должна полу-
чить набор дополнений к пицце, но вы не знаете заранее, сколько дополнений за-
кажет клиент. Функция в следующем примере получает один параметр
*toppings
,
но этот параметр объединяет все аргументы, заданные в командной строке:
pizza.py
def make_pizza(*toppings):
"""Вывод списка заказанных дополнений."""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Звездочка в имени параметра
*toppings
приказывает Python создать пустой кор-
теж с именем
toppings
и упаковать в него все полученные значения. Результат
команды
print
в теле функции показывает, что Python успешно справляется
и с вызовом функции с одним значением, и с вызовом с тремя значениями.
Разные вызовы обрабатываются похожим образом. Обратите внимание: Python
упаковывает аргументы в кортеж даже в том случае, если функция получает всего
одно значение:
152 Глава 8 • Функции
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')
Теперь команду
print
можно заменить циклом, который перебирает список
дополнений и выводит описание заказанной пиццы:
def make_pizza(*toppings):
"""Выводит описание пиццы."""
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Функция реагирует соответственно независимо от того, сколько значений она
получила — одно или три:
Making a pizza with the following toppings:
- pepperoni
Making a pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Этот синтаксис работает независимо от количества аргументов, переданных
функции.
Позиционные аргументы с произвольными наборами аргументов
Если вы хотите, чтобы функция могла вызываться с разными количествами аргу-
ментов, параметр для получения произвольного количества аргументов должен
стоять на последнем месте в определении функции. Python сначала подбирает со-
ответствия для позиционных и именованных аргументов, а потом объединяет все
остальные аргументы в последнем параметре.
Например, если функция должна получать размер пиццы, этот параметр должен
стоять в списке до параметра
*toppings
:
def make_pizza(size, *toppings):
"""Выводит описание пиццы."""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
В определении функции Python сохраняет первое полученное значение в параметре
size
. Все остальные значения, следующие за ним, сохраняются в кортеже
toppings
.
В вызовах функций на первом месте располагается аргумент для параметра
size
,
а за ним следует сколько угодно дополнений.
Передача списка 153
В итоге для каждой пиццы указывается размер и количество дополнений, и каждый
фрагмент информации выводится в положенном месте: сначала размер, а потом
дополнения:
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Использование произвольного набора именованных аргументов
Иногда программа должна получать произвольное количество аргументов, но вы
не знаете заранее, какая информация будет передаваться функции. В таких случаях
можно написать функцию, получающую столько пар «ключ—значение», сколько
указано в команде вызова. Один из возможных примеров — построение пользова-
тельских профилей: вы знаете, что вы получите информацию о пользователе, но
не знаете заранее, какую именно. Функция
build_profile()
в следующем примере
всегда получает имя и фамилию, но также может получать произвольное количе-
ство именованных аргументов:
user_profile.py
def build_profile(first, last, **user_info):
"""Строит словарь с информацией о пользователе."""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile)
Определение
build_profile()
ожидает получить имя и фамилию пользователя,
а также позволяет передать любое количество пар «имя—значение». Две звездочки
перед параметром
**user_info
заставляют Python создать пустой словарь с име-
нем
user_info
и упаковать в него все полученные пары «имя—значение». Внутри
функции вы можете обращаться к парам «имя–значение» из
user_info
точно так
же, как в любом словаре.
В теле
build_profile()
создается пустой словарь с именем
profile
для хранения
профиля пользователя. В точке в словарь добавляется имя и фамилия, потому
что эти два значения всегда передаются пользователем. В точке функция пере-
бирает дополнительные пары «ключ—значение» в словаре
user_info
и добавляет
каждую пару в словарь
profile
. Наконец, словарь
profile
возвращается в точку
вызова функции.
154 Глава 8 • Функции
Вызовем функцию
build_profile()
и передадим ей имя
'albert'
, фами-
лию
'einstein'
, и еще две пары «ключ—значение»
location='princeton'
и
field='physics'
. Программа сохраняет возвращенный словарь в
user_profile
и выводит его содержимое:
{'first_name': 'albert', 'last_name': 'einstein',
'location': 'princeton', 'field': 'physics'}
Возвращаемый словарь содержит имя и фамилию пользователя, а в данном случае
еще и местонахождение и область исследований. Функция будет работать, сколько
бы дополнительных пар «ключ—значение» ни было передано при вызове функции.
При написании функций допускаются самые разнообразные варианты смешения
позиционных, именованных и произвольных значений. Полезно знать о существо-
вании всех этих типов аргументов, потому что они часто будут встречаться вам
при чтении чужого кода. Только с опытом вы научитесь правильно использовать
разные типы аргументов и поймете, когда следует применять каждый тип; а пока
просто используйте самый простой способ, который позволит решить задачу.
С течением времени вы научитесь выбирать наиболее эффективный вариант для
каждой конкретной ситуации.
Достарыңызбен бөлісу: |