Python: 有没有办法在函数定义中使用 "unimported" 对象?
Python: is there a way to use "unimported" objects in function definitions?
我正在修改一个简单的递归函数以使用海龟绘制一条龙曲线:
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_dragon 函数中继续使用 turtle 模块的函数,而无需先将它们导入函数外?
有没有在定义函数之前不导入的原因?
我不确定为什么您需要首先将导入放在主要功能中。
我不相信有什么神奇的方法可以让函数知道 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 将它们传递给函数的。
不过,您或许应该将导入调用移到脚本的开头!
编辑:
您的代码仍有一些奇怪的特性。与其尝试将方法从导入的模块传递到您的函数中,不如使用您创建的海龟对象中的函数!此代码应该有效,但它绝对不是您要使用的常见做法...
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()
我认为问题可能是由于您的 turtle.py 不在 sys.path 中的目录。
我正在修改一个简单的递归函数以使用海龟绘制一条龙曲线:
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_dragon 函数中继续使用 turtle 模块的函数,而无需先将它们导入函数外?
有没有在定义函数之前不导入的原因?
我不确定为什么您需要首先将导入放在主要功能中。
我不相信有什么神奇的方法可以让函数知道 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 将它们传递给函数的。
不过,您或许应该将导入调用移到脚本的开头!
编辑:
您的代码仍有一些奇怪的特性。与其尝试将方法从导入的模块传递到您的函数中,不如使用您创建的海龟对象中的函数!此代码应该有效,但它绝对不是您要使用的常见做法...
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()
我认为问题可能是由于您的 turtle.py 不在 sys.path 中的目录。