Функции с параметрами

Введение

Мы уменьшаем количество нашего кода и добавляем функции, что бы избежать повторений - это называется рефакторинг. Рефакторинг крайне полезен. Ведь функции, которые мы определили не очень “гибкие”. Необходимые значения заданы внутри функций и если мы захотим изменить угол или дистанцию - нам прийдеться писать новую функцию. Наша функция для рисования шестиугольников может рисовать шестиугольники только одного размера!

Поэтому у нас должна быть возможность задавать параметры функции, которые также называют аргументами. В таком случае переменные в функции могут принимать разные значения кождый раз, когда мы вызываем нашу функцию:

Вспомни, как мы описали функцию line_without_moving() в предыдущей главе:

def line_without_moving():
    turtle.forward(50)
    turtle.backward(50)

Мы можем улучить её используя параметр:

def line_without_moving(length):
    turtle.forward(length)
    turtle.backward(length)

Параметр функции действует как переменная, но только внутри функции, в которой мы его объявили. Теперь можно вызвать новую функцию со значением, которое необходимо ей передать:

line_without_moving(50)
line_without_moving(40)

Мы пользовались функциями с параметрами еще в самом начале учебника используя turtle.forward(), turtle.left() и т.д.

И мы можем вставить столько аргументов (или параметров), сколько захотим, дав им разные имена и разделив запятыми:

def tilted_line_without_moving(length, angle):
    turtle.left(angle)
    turtle.forward(length)
    turtle.backward(length)

Функция с параметрами для шестиугольника произвольного размера

Упражнение

Напиши функцию для рисования шестиугольника, которая позволяет выбирать его размер при вызове.

Решение

def hexagon(size):
    for _ in range(6):
        turtle.forward(size)
        turtle.left(60)

Функция с несколькими параметрами

Упражнение

Напиши функцию для рисования фигур с произвольным количеством (т. е. >2) сторон любой длины и проверь её в деле.

Пример рисования фигур с помощью этой функции:

_images/shapes.png

Совет

Сумма внешних углов любой фигуры всегда равна 360 градусов!

Решение

def draw_shape(sides, length):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(360 / sides)

Дополнительно

Это может звучать немного безумно, но вполне возможно передать функции в качестве параметра другую функцию — Python обращается с ними так же, как и с переменными, числами и строками.

For instance, you could create a shape drawing function which turned one way or another depending on which turtle function you passed to it - turtle.left or turtle.right.

Попоробуй, сможешь ли ты это сделать!

Примечание

Passing a function (e.g turtle.left) is different than calling it, which would instead be written turtle.left(45).