Python: Именованные аргументы
При вызове функции аргументы можно передавать двумя способами. В позиционном вызове значения идут строго по порядку. Первое попадает в первый параметр, второе во второй. Именованные аргументы позволяют при вызове явно указать имя параметра. Это удобно, когда у функции много параметров и нужно переопределить лишь некоторые. Остальные остаются со значениями по умолчанию.
def repeat(text, times=1):
return text * times
repeat("Hi", 3) # позиционный вызов
repeat(text="Hi", times=3) # именованный вызовОба варианта делают одно и то же. Во втором случае мы явно написали, что "Hi" является значением text, а 3 является значением times. С точки зрения определения функции ничего не поменялось. Именованные аргументы работают для любой функции, и сама функция об этом ничего не знает. Она получает значения так, как они описаны в определении.
def truncate(text, length):
...
Позиционные: truncate('hello', 3)
└──┬──┘ └┬┘
text length
Именованные: truncate(length=3, text='hello')
└──┬───┘ └─────┬─────┘
length textИменованные аргументы можно указывать в любом порядке. Это не меняет результат работы функции, потому что значения связываются именно по имени параметра.
repeat(times=3, text="Hi") # => HiHiHiИменованные аргументы можно комбинировать с позиционными, при этом позиционные идут первыми. Такой вызов позволяет указывать только те параметры, которые нужно переопределить.
repeat("Hi", times=3) # позиционные + именованные => HiHiHiКогда использовать именованные аргументы
Именованные аргументы полезны, когда у функции есть несколько параметров и не все из них нужно менять. В таких случаях можно указать только те параметры, которые важны в конкретном вызове, а остальные оставить со значениями по умолчанию.
def make_line(symbol="-", length=10):
return symbol * length
make_line() # все параметры по умолчанию
make_line(length=5) # меняем только длину
# Без этого пришлось бы писать так
make_line("-", 5)Символ указывать не пришлось, даже несмотря на то, что он идет в списке параметров раньше длины. Именованные аргументы делают вызовы понятнее. Читая код, сразу видно, какое значение к какому параметру относится.
Задание
Реализуйте функцию trim_and_repeat(), которая принимает три параметра:
- Строку
offset— число символов, на которое нужно обрезать строку слеваrepetitions— сколько раз нужно повторить строку перед возвратом получившейся строки
Число символов для среза по умолчанию равно 0, а количество повторений по умолчанию равно 1.
Функция должна возвращать полученную строку.
text = 'python'
trim_and_repeat(text, offset=3, repetitions=2) # honhon
trim_and_repeat(text, repetitions=3) # pythonpythonpython
trim_and_repeat(text) # pythonПодсказки
- Реализовать эту функцию можно различными способами
- С точки зрения проверочной системы не имеет значения, каким из способов будет реализована функция
trim_and_repeat()внутри. Главное – чтобы она выполняла поставленную задачу
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import solution
def test():
assert solution.trim_and_repeat("python") == "python"
assert solution.trim_and_repeat("python", offset=4) == "on"
assert solution.trim_and_repeat("python", repetitions=2) == "pythonpython"
assert solution.trim_and_repeat("python", offset=4, repetitions=2) == "onon"Решение учителя откроется через:
20:00
