Книга «Изучаем Python»



Pdf көрінісі
бет87/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   83   84   85   86   87   88   89   90   ...   238
Байланысты:
2 5343781172763690906

УПРАЖНЕНИЯ

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'}

Возвращаемый словарь содержит имя и фамилию пользователя, а в данном случае 

еще и местонахождение и область исследований. Функция будет работать, сколько 

бы дополнительных пар «ключ—значение» ни было передано при вызове функции.

При написании функций допускаются самые разнообразные варианты смешения 

позиционных, именованных и произвольных значений. Полезно знать о существо-

вании всех этих типов аргументов, потому что они часто будут встречаться вам 

при чтении чужого кода. Только с опытом вы научитесь правильно использовать 

разные типы аргументов и поймете, когда следует применять каждый тип; а пока 

просто используйте самый простой способ, который позволит решить задачу. 

С течением времени вы научитесь выбирать наиболее эффективный вариант для 

каждой конкретной ситуации.



Достарыңызбен бөлісу:
1   ...   83   84   85   86   87   88   89   90   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет