Функции, определяемые пользователем

Введение

В программировании часто приходится встречаться с достаточно сложными задачами, а, как известно, одна из характерных черт программистов — ленивость. Расправившись с трудностью один раз, они не хотят делать это вновь. Также тебе понадобится что-то, с помощью чего можно разбивать задачи на маленькие и независимые друг от друга кусочки, чтобы сфокусировать свои усилия над теми из них, которые тебе нужны.

Функции – один из способов в Python выразить эту абстракцию. В качестве примера рассмотрим turtle.reset(). reset – это функция, которая вызывает нашу черепашку (turtle) для выполнения некоторых действий, а именно:

  • Очищение доски для рисования.

  • Возвращение ширины и цвета в исходное состояние.

  • Возвращение черепашки в исходное положение

Но так как весь код заключён в функцию, нам не нужно беспокоиться о деталях. Мы просто вызываем её.

Итак — как же написать её?

Функции в Python могут быть определены ключевым словом def:

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

Определённая нами функция называется line_without_moving и она является абстракцией для двух шагов - движения вперёд и движения назад.

Чтобы использовать её (или, как обычно говорят “вызвать её”), напиши её имя и круглые скобки сразу за ним:

line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()
turtle.right(90)
line_without_moving()

Мы можем написать больше функций, чтобы избавиться от некоторых повторений:

def star_arm():
    line_without_moving()
    turtle.right(360 / 5)

for _ in range(5):
    star_arm()

Важно

В Python используются отступы из пробелов/табуляций для идентификации блоков кода, которые связаны друг с другом. Блок в Python’е (как показанное выше определение функции) должен иметь двоеточие в конце строки, а последующие команды – отступы (обычно, размером в 4 пробела). Блок заканчивается первой линией без отступа в начале строки.

Это отличается от многих других языков программирования, в которых для определения связанных блоков кода используются специальные символы (такие как фигурные скобки {})

Никогда не используй табуляцию для выделения своих блоков, только пробелы. Ты можешь – и должен – настроить свой редактор, чтобы тот вставлял 4 пробела, когда ты нажимаешь клавишу Tab

Функция для рисования квадрата

Упражнение

Напиши функцию для рисования квадрата. Можешь ли ты использовать эту функцию для улучшения программы для рисования повёрнутых квадратов? Если ты внедришь в программу функции, с ней будет легче экспериментировать?

Решение

def tilted_square():
  turtle.left(20)     # now we can change the angle only here
  for _ in range(4):
      turtle.forward(50)
      turtle.left(90)

tilted_square()
tilted_square()
tilted_square()

# bonus: you could have a separate function for drawing a square,
# which might be useful later:

def square():
  for _ in range(4):
      turtle.forward(50)
      turtle.left(90)

def tilted_square():
  turtle.left(20)
  square()

# etc

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

Упражнение

Напишите функцию для рисования шестиугольника

_images/hexagon.png

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

_images/honeycomb.png

Give it a good go!

Подсказка

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

Решение

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

for _ in range (6):
    hexagon()
    turtle.forward(100)
    turtle.right(60)

You could also put the turtle.forward(100); turtle.right(60) portion in the function, but you better not call it hexagon in that case. That’s misleading because it actually draws a hexagon and then advances to a position where another hexagon would make sense in order to draw a honeycomb. If you ever wanted to reuse your hexagon function outside of honeycombs, that would be confusing.