我正在修改一个简单的递归函数来使用turtle绘制龙曲线:
def draw_dragon(t, order, size, L=turtle.left, R=turtle.right):
""" Draw a dragon curve """
if not order:
t.forward(size)
return
size /= 1.41421
t.R(45)
draw_dragon(t, order-1, size, L, R)
t.L(90)
draw_dragon(t, order-1, size, R, L)
t.R(45)
if __name__=="__main__":
import turtle
wn = turtle.Screen()
fred=turtle.Turtle()
draw_dragon(fred,6,200)
wn.exitonclick()
由于我在功能定义时还没有导入龟,解释器会给我"NameError: name 'turtle' is not defined"
。
有没有办法在我的draw_dragon函数中使用turtle模块的函数,而不先将它们导入函数外?
答案 0 :(得分:2)
在定义函数之前是否有原因导致您没有导入? 我不确定为什么你需要将导入放在main函数中。
我不相信该函数有任何神奇的方法可以知道龟的模块是什么,除非它们是a)在命名空间中,或b)通过参数传递给函数。您可以将其放在主代码中:
if __name__=="__main__":
import turtle
wn = turtle.Screen()
fred=turtle.Turtle()
draw_dragon(fred,6,200,turtle.left, turtle.right)
wn.exitonclick() ^^^ ^^^
然后,将L和R更改为没有默认参数(它们将通过初始调用分配函数),因此您不会获得NameErrors。
您的函数现在应该知道这些方法是什么,因为您通过main将它们传递给函数。
你应该只是将导入调用移动到脚本的开头!
编辑:
你的代码仍然有一些奇怪的特质。而不是尝试将方法从导入的模块传递到您的函数中,只需使用属于您创建的龟对象的函数!这段代码应该有用,但它绝对不是你想要使用的常用做法......
def draw_dragon(t, order, size, right, left, forward):
""" Draw a dragon curve """
if order <= 0:
forward(size)
return
size /= 1.41421
right(45)
draw_dragon(t, order-1, size, right, left, forward)
left(90)
draw_dragon(t, order-1, size, left, right, forward)
right(45)
if __name__=="__main__":
import turtle
wn = turtle.Screen()
fred=turtle.Turtle()
draw_dragon(fred, 6,200, turtle.left, turtle.right, turtle.forward)
wn.exitonclick()
更好的代码是:
from turtle import Screen, left, right, forward, speed, hideturtle
def draw_dragon(order, size, left, right):
""" Draw a dragon curve """
if order <= 0:
forward(size)
return
size /= 1.41421
right(45)
draw_dragon(order-1, size, right, left)
left(90)
draw_dragon(order-1, size, left, right)
right(45)
if __name__=="__main__":
speed(0)
hideturtle()
wn = Screen()
draw_dragon(8,200, left, right)
wn.exitonclick()
答案 1 :(得分:-1)
我认为问题可能是因为你的turtle.py不在sys.path的目录下。