Есть ли способ сократить мой код, чтобы мне не пришлось писать «черепаху»? каждый раз, когда я использую функции из модуля черепахи? - PullRequest
4 голосов
/ 19 апреля 2019

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

import turtle


turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(200)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.back(100)



turtle.exitonclick()

Я ожидаю написать свой код безписать turtle каждый раз

Ответы [ 4 ]

8 голосов
/ 19 апреля 2019

Вы можете импортировать все из модуля turtle, написав

from turtle import *  # this is a wildcard import

Вместо этого, однако, вы должны просто import turtle as t (или все, что вы хотите), например так:

import turtle as t  # you can replace t with any valid variable name

Поскольку при импорте подстановочных знаков возникает тенденция к конфликту определений функций

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

from turtle import Turtle

Теперь нам нужно создать его экземпляр:

t = Turtle()

Теперь мы можем использовать его:

t.do_something()  # methods that act on the turtle, like forward and backward

ЭтоОднако модуль Screen не будет импортирован, поэтому вы не сможете использовать exitonclick(), если не импортируете также Screen:

from turtle import Turtle, Screen
s = Screen()
s.exitonclick()

Как отмечает @cdlane, циклы могут быть вашимиЛучшая ставка для уменьшения количества кода, который вы должны написать.Этот код:

for _ in range(x):
    turtle.forward(100)
    turtle.right(90)

Перемещает turtle вперед, затем вправо x раз.

4 голосов
/ 20 апреля 2019

Есть ли у вас какие-либо идеи о том, сколько комментариев есть на SO, говорящем "Не использовать импорт подстановочных знаков" в ответ на людей, которые делают from turtle import *, как предлагают люди?Я также утверждаю, что не делайте import turtle as t, так как он предоставляет функциональный интерфейс черепахе.Модуль Turtle является объектно-ориентированным , вам нужно только выставить этот интерфейс.Если вы устали печатать так много, узнайте о циклах:

from turtle import Screen, Turtle

t = Turtle()

for _ in range(4):
    t.forward(100)
    t.right(90)

for _ in range(4):
    t.backward(100)
    t.left(90)

t.backward(100)

for _ in range(3):
    t.backward(100)
    t.left(90)

s = Screen()

s.exitonclick()

По общему признанию, я на самом деле не против импорта с использованием подстановочных знаков для коротких примеров с черепашками и ткинтерами, а также графических программ Zelle.Но ничего из этого fd() вздор вместо forward() тоже!Празднуйте себя черепахой, не прячьтесь в своей раковине!

4 голосов
/ 19 апреля 2019

Вы можете использовать импорт по шаблону:

from turtle import * 

Но было бы лучше использовать префиксный импорт, чтобы сохранить чистоту ваших пространств имен. См. @ alec_a ответ .

2 голосов
/ 19 апреля 2019

Отказ от ответственности: этот ответ для ленивых людей, таких как я:)

Уже есть хорошие ответы, которые показывают вам, как решить вашу проблему, и предупреждают вас об импорте подстановочных знаков.

Есливы просто хотите поиграть с модулем черепах, вы можете упростить свою жизнь, то есть вместо написания turtle.forward(90) лучше просто написать forward(90), но это будет очень просто, если вы просто напишите f(90)

Опять же, это повлияет на читабельность вашего кода, но, как правило, оно заслуживает пробной версии

, теперь ваш код будет выглядеть так:

Редактировать : изменить импорт в одну строку, как предложено @ chepner быть супер ленивее

from turtle import forward as f, back as b, right as r, left as l, exitonclick

# to draw one square
f(100)
r(90)
f(100)
r(90)
f(100)
r(90)
f(100)

exitonclick()
...