Есть ли способ отразить функцию python?

#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)
 

Разбить его:

  1. При определении функции, которая будет передана в mirror функцию, не вызывайте команды turtle . Вместо этого используйте yield для вывода функций и аргументов в виде кортежей, чтобы mirror функция могла получить доступ к тому, какие функции следует вызывать.
  2. В mirror функции определите словарь команд turtle, actions , который будет использоваться для зеркального отображения.
  3. Выполните итерацию по приведенным действиям черепахи из функции, переданной в скобки mirror функции, и распакуйте кортежи в action, argument пары, которые будут использоваться для зеркального отображения.

Комментарии:

1. Я даже не знал об этой команде! Большое вам спасибо за это! Я собираюсь попробовать это и провести некоторое исследование по доходности!!

2. Честно говоря, я учусь только на втором курсе по программированию, а последним был c #, так что мне еще многое предстоит выучить! Еще раз спасибо за помощь новичку!

3. @armysBest В любое время!