#python #function #turtle-graphics #python-turtle
#python #функция #черепаха-графика #python-черепаха
Вопрос:
Я студент, посещающий свой первый урок python, и мы используем Turtle
его для рисования изображения. В целях экономии времени я пытаюсь создать зеркальную функцию, которая может переворачивать результаты одной функции по оси y на заданное количество пикселей. Для простоты я создал несколько функций, чтобы ускорить мое кодирование. Вот как работает мой код:
units, north, east, south, west = desiredPixelsPerUnit, 90, 0, 270, 180
def main():
eye(30, 15)
eye(40, 15)
def left():
myTurtle.left(90)
def draw(count):
distance = units * count
myturtle.forward(distance)
def singleStep(xDirection, yDirection, stepCount):
down()
for step in range(stepCount):
if yDirection == north:
point(north)
draw(1)
if xDirection == east:
point(east)
draw(1)
etc..
def eye(xPosition, yPosition):
....
draw(3)
left()
draw(2)
left()
....
singleStep(east, north, 1)
singleStep(west, north, 2)
etc....
Все это дает мне следующее
Результат выполнения eye()
в main дважды:
То, что я пытаюсь создать, — это функция, которая передается другой функции, а затем будет смотреть на то, что выполняется. если это left()
так, или right()
запустите наоборот. Если это точка (x, y)
, добавьте 180
to
x. Если у него есть вызов функции внутри функции, то он также проверяет это на наличие левых или правых. Что-то вроде этого.
def mirror(function):
for action in function:
if action == left():
execute right()
...
elif action == singleStep():
newFunction = singleStep()
for action in newFunction:
if:
statement above
else:
statement below
else:
execute initial action
Я все еще новичок в кодировании и программировании. Я пробовал использовать массивы, ассоциативные массивы и списки, используя eval
и многое другое. Время, потраченное на то, чтобы понять это, было намного дольше, чем на написание отдельного списка инструкций для левого и правого, ха-ха, но я действительно хочу выяснить, как сделать что-то подобное.
Комментарии:
1. Вы могли бы попробовать переключаться снова
left
иright
myTurtle
снова.
Ответ №1:
Вы могли бы отступить от призыва left()
и right()
напрямую. Просто создайте свои собственные функции your_left()
your_right()
и используйте их каждый раз. Затем используйте глобальную переменную called mirror
. Эта переменная будет работать для вас как флаг. Таким образом, вы просто устанавливаете mirror
True
, когда вы хотите отразить выходные данные.
Ваши функции your_right()
и your_left()
будут выглядеть примерно так:
def your_right():
left() if mirror else right()
def your_left():
right() if mirror else left()
И тогда вы можете зеркально отразить все свои результаты, если захотите. Я надеюсь, что смог бы помочь!
Комментарии:
1. Это было так просто, что я почувствовал себя дурачком из-за того, что не видел эту опцию перед публикацией этого вопроса! Это, безусловно, самый простой способ сделать это!
2. используя это, я действительно смог создать глобальную переменную для mirrorX и mirrorY, которая теперь позволяет мне зеркально отображать по любой оси или по обеим. Я бы сказал, что это больше, чем ответ на мой вопрос!
3. Хороший ответ! Наверное, я слишком все усложнял.
Ответ №2:
Вот как вы можете это сделать, используя yield
:
import turtle
def function(): # Your function here, with the action calls replaced with yielding the un-called action, along with the argument
for _ in range(4):
yield turtle.forward, 100
yield turtle.right, 90
def mirror(function):
actions = {turtle.right: turtle.left,
turtle.left: turtle.right,
turtle.forward: turtle.backward,
turtle.backward: turtle.forward}
for action, argument in function():
actions[action](argument)
mirror(function)
Разбить его:
- При определении функции, которая будет передана в
mirror
функцию, не вызывайте команды turtle . Вместо этого используйтеyield
для вывода функций и аргументов в виде кортежей, чтобыmirror
функция могла получить доступ к тому, какие функции следует вызывать. - В
mirror
функции определите словарь команд turtle,actions
, который будет использоваться для зеркального отображения. - Выполните итерацию по приведенным действиям черепахи из функции, переданной в скобки
mirror
функции, и распакуйте кортежи вaction, argument
пары, которые будут использоваться для зеркального отображения.
Комментарии:
1. Я даже не знал об этой команде! Большое вам спасибо за это! Я собираюсь попробовать это и провести некоторое исследование по доходности!!
2. Честно говоря, я учусь только на втором курсе по программированию, а последним был c #, так что мне еще многое предстоит выучить! Еще раз спасибо за помощь новичку!
3. @armysBest В любое время!