Почему внутри функции не работает цикл for?
Передача произвольного набора аргументов.
Почему цикл for внутри функции не возвращает последовательно содержание всего кортежа, а выводит его только целиком?
def get_sndwch_info(*sandw_func_list):
print("Состав сендвича: ")
for name in sandw_func_list:
print(f" - {name}")
sandwich_list = ['хлеб', 'плавленный сыр', 'лук', 'колбаса', 'бекон']
get_sndwch_info(sandwich_list)
Почему ниже в коде, все работает ? Передаем аргументы они упаковываются в кортеж, и итерируются по одному?
def make_pizza(size, *toppings):
'''Выводсписка заказанных топингов'''
print(f"\nMaking a {size} pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
make_pizza(16, 'paperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra chise')
Ответы (2 шт):
А вы посмотрите, что у вас в функции получилось в sandw_func_list:
(['хлеб', 'плавленный сыр', 'лук', 'колбаса', 'бекон'],)
Когда вы использовали звёздочку в аргументе функции, вы запаковали аргумент в кортеж. Когда вы по нему итерируетесь, он просто распаковывается обратно в список, но сам список уже не итерируется. Просто уберите звёздочку из описания функции.
Звездочка перед аргументом в заголовке функции "собирает" все позиционные (перечисленные последовательно) аргументы в кортеж. Но по факту вы передаете один позиционный аргумент - список sandwich_list. В итоге в sandw_func_list получается кортеж из одного элемента - списка, который выведется в первой итерации цикла.
Чтобы заработало правильно, нужно либо убрать звездочку перед аргументом в заголовке функции, либо добавить ее при передаче перед sandwich_list, чтобы элементы списка распаковались в отдельные позиционные аргументы, а внутри списка собирались в кортеж.
Почему ниже в коде, все работает?
Потому что в этом примере аргументы перечисляются (передаются как отдельные позиционные аргументы), а не передаются одним аргументом-списком. Пример как "сломать", чтобы работало как в первом примере:
make_pizza(12, ['mushrooms', 'green peppers', 'extra chise'])
И как исправить обратно:
make_pizza(12, *['mushrooms', 'green peppers', 'extra chise'])