Каков эффект передачи скаляра в turtle.color() в Skulpt?

#python #turtle-graphics #skulpt

#python #черепаха-графика #skulpt

Вопрос:

Когда я пытаюсь запустить свой приведенный ниже код python, как turtle.color интерпретирует входные данные как число?

 import turtle

for i in ['red', 'blue', 'green', 'pink', 8, 10]:
       turtle.color(i)
       turtle.forward(100)
       turtle.right(90)
  

Актуально:

Результат, который я получаю, — это квадрат со сторонами в заданном порядке. Когда он достигает turtle.color(8) , одна из сторон перезаписывается черным цветом, за которым следует следующая сторона ( turtle.color(10) ).

Ожидаемый:

Код должен выдавать ошибку как turtle.color(8) , не имеет смысла!!

На самом деле я использую онлайн-компилятор turtle для тестирования своего кода (repl.it/languages/python_turtle).

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

1. Вы пробовали просмотреть turtle.color исходный код и посмотреть, что он делает?

2. Это выдает ошибку для меня. Вы уверены, что это именно тот код, который вы используете?

3. да, это именно тот код, который я запускаю.

4. Ваш код вызывает TypeError: object of type 'int' has no len() исключение при его запуске.

5. Большое спасибо Дэниелу за разъяснение..

Ответ №1:

Из их блога, repl.it упоминает, что они используют skulpt в качестве своего веб-интерфейса.

На странице Skulpt на Github показана следующая функция, которая предполагает, что по умолчанию используется значение «Черный». Это объясняет странное поведение, которое вы наблюдаете по сравнению с другими во время отладки.

 function createColor(color, g, b, a) {
    var i;

    if (g !== undefined) {
        color = [color, g, b, a];
    }

    if (color.constructor === Array amp;amp; color.length) {
        for(i = 0; i < 3; i  ) {
            color[i] = (typeof color[i] === "number") ?
                Math.max(0, Math.min(255, parseInt(color[i]))) :
                0;
        }
        if (typeof color[i] === "number") {
            color[3] = Math.max(0, Math.min(1, color[i]));
            color = "rgba("   color.join(",")   ")";
        }
        else {
            color = "rgb("   color.slice(0,3).join(",")   ")";
        }
    }
    else if (typeof color === "string" amp;amp; !color.match(/s*urls*(/i)) {
        color = color.replace(/s /g, "");
    }
    else {
        return "black";
    }

    return color;
}
  

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

1. turtle.color(«10») / turtle.color («Привет») — выдает вывод черного цвета

2. Спасибо за тестирование Richin. Похоже, это ваш ответ. 8 и 10 передаются в виде строк и, следовательно, печатаются черным цветом.

3. спасибо, Дэниел .. тем не менее, я только что попробовал запустить приведенный ниже код без цикла for, и он снова дает мне черный импорт turtle turtle.color(10) turtle. вперед (100) turtle.right(90)

4. Вы используете самую последнюю версию Turtle? (Странно, что turtle.color (10) не выдает ошибку для вас, как для других в разделе комментариев.)

5. Держу пари, что repl.it использует некоторую скрытую магию для уменьшения ошибок в целях обучения. Я бы предложил попробовать вне repl.it , поскольку результаты, вероятно, будут отличаться. (Я только что проверил на repl.it этот turtle.color (10) на самом деле печатает черным цветом.)