Python:有没有一种方法可以在函数定义中使用“未导入”的对象?

2024-05-10 10:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在修改一个简单的递归函数,使用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()

因为在定义函数时我还没有导入turtle,所以解释器给了我"NameError: name 'turtle' is not defined"。你知道吗

有没有办法在我的draw\u dragon函数中仍然使用turtle模块的函数,而不首先在函数外部导入它们?你知道吗


Tags: 函数namesizeifdef绘制notorder
1条回答
网友
1楼 · 发布于 2024-05-10 10:53:58

我想问题可能是因为你的海龟.py不在中的目录中搜索路径. 你知道吗

网友
2楼 · 发布于 2024-05-10 10:53:58

在定义函数之前不导入有什么原因吗?
我不知道你为什么要把import放在main函数中。你知道吗

我不相信有什么神奇的方法可以让函数知道turtle的模块是什么,除非它们要么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将它们传递到函数中。你知道吗

不过,您可能应该将导入调用移到脚本的开头!你知道吗

编辑:

你的代码仍然有一些奇怪的特性。与其尝试将导入模块中的方法传递到函数中,不如使用您创建的turtle对象中的函数!这段代码应该可以工作,但它绝对不是您想要使用的常见做法。。。你知道吗

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

相关问题 更多 >