我正在尝试使用Python中的Turtle模块使用单独的函数绘制美国国旗,首先我有draw_flag计算所有维度,然后draw_rectangle实际绘制标志形状,然后生成draw_stars等,绘制星星和线条。
但是,我在理解函数如何工作方面遇到了一些麻烦。到目前为止,我的代码还有:
import turtle
import time
import random
def draw_rectangle(length, height):
turtle.up()
x = length
y = height
turtle.begin_fill()
turtle.setpos(x,y)
turtle.down()
turtle.forward(418)
turtle.right(90)
turtle.forward(220)
turtle.right(90)
turtle.forward(418)
turtle.right(90)
turtle.forward(220)
turtle.end_fill()
turtle.sleep(2)
turtle.bye
def draw_flag(A):
height = int(A)
## length = height*1.9
## union_height = height*(7/13)
## union_length = length*(2/5)
## E = F = union_height/10
## G = H = union_length/12
## stripe_width = height/13
## diameter_star = stripe_width*(4/5)
length = height*1.9
return
A = input("Please enter the height of the flag: ")
draw_rectangle(length, height)
我希望它会通过绘制一个矩形来返回,但是它一直说未定义长度,不知道在哪里放置'length'它将识别变量。
我正在使用Python 3,谢谢。
答案 0 :(得分:2)
你有两个问题。首先,您定义函数draw_flag
,但您永远不会调用它。
但是,如果你确实调用了它,它就行不通,因为你的函数draw_flag
并没有真正做任何事情。它只是在自身内部定义了一些变量,然后在它结束时抛弃它们。您应该使用return length, height
返回长度和高度,然后执行length, height = draw_flag(A)
并使用这些值调用draw_rectangle
。 (或者你可以做draw_rectangle(*draw_flag(A))
。)
length, height = draw_flag(A)
draw_rectangle(length, height)
功能不会彼此神奇地沟通。函数接受输入并产生返回值。如果要在其他地方使用该返回值,则需要在要使用该值的位置调用该函数。
答案 1 :(得分:1)
您正在调用函数draw_rectangle
,它需要两个参数 - 长度和高度。长度由draw_flag
函数计算;但是你没有返回值。
你有几种方法可以解决这个问题。一种是简单地用用户提供的高度调用draw_flag
函数,保存返回值,然后调用draw_rectangle
:
def draw_flag(A):
height = int(A)
## length = height*1.9
## union_height = height*(7/13)
## union_length = length*(2/5)
## E = F = union_height/10
## G = H = union_length/12
## stripe_width = height/13
## diameter_star = stripe_width*(4/5)
return height*1.9
A = input("Please enter the height of the flag: ")
length = draw_flag(A)
draw_rectangle(length, int(A))
另一种方法是将input
移至draw_flag
函数,然后从draw_rectangle
函数内调用draw_flag
函数。如果这样做,那么draw_flag
函数根本不需要任何参数:
def draw_flag():
A = input("Please enter the height of the flag: ")
height = int(A)
## length = height*1.9
## union_height = height*(7/13)
## union_length = length*(2/5)
## E = F = union_height/10
## G = H = union_length/12
## stripe_width = height/13
## diameter_star = stripe_width*(4/5)
draw_rectangle(height*1.9, height)
draw_flag()
我认为您还应该阅读有关变量范围的Python书籍部分。稍后当你期望打印一些变量但是你会遇到奇怪的错误时会有所帮助 - 特别是如果你正在使用函数。
答案 2 :(得分:1)
尝试以下
import turtle
import time
import random
def draw_rectangle(length, height):
turtle.up()
x = length
y = height
turtle.begin_fill()
turtle.setpos(x,y)
turtle.down()
turtle.forward(418)
turtle.right(90)
turtle.forward(220)
turtle.right(90)
turtle.forward(418)
turtle.right(90)
turtle.forward(220)
turtle.end_fill()
turtle.sleep(2)
turtle.bye
def draw_flag(A):
height = int(A)
length = height*1.9
draw_rectangle(length,height)
return
A = input("Please enter the height of the flag: ")
draw_flag(A)
答案 3 :(得分:1)
好的,为了回答你更普遍的问题,python中的函数在你调用它们时会接受参数,这些函数通过引用传递,这意味着你在函数内部和调用空间中的数据相同。这对于可变类型很重要,因为如果它们在函数内部被更改,它们也会在函数外部更改。 (str,int,float和tuple不可变,dict和list是)。当一个函数返回时,返回标记之后的值被传递回调用者,所以如果你说a=input('input? ')
,函数输入会为提示显示给用户一个参数,注意这是通过引用传入的,它不是字符串的副本。它返回用户生成的输入,并将其存储到。您可以从函数返回多个值,它们会自动转换为元组;如果你有
def test():
return 1,2
a,b = test()
你会得到a = 1和b = 2。必须定义函数内使用的名称。它们首先在函数内部寻找,然后在任何封闭的命名空间中,最后在内置函数中。不能使用在其他函数中定义的变量,因为它们不在本地名称空间中,也不在其父项中。要访问这些名称的值,您必须将它们传递给函数,请注意函数内使用的名称不必与函数外部的名称匹配。考虑:
def fun1(a):
return a * 2
def fun2():
b = 5
c = fun1(b)
print c
fun2()
值5以名称b存储在内存中,然后通过引用传递给fun1,这次是在名称a下,它被加倍并返回,(返回也是通过引用),然后存储返回值在名称c下,然后打印。
答案 4 :(得分:1)
这是一个思考它的好方法。函数是一个“黑盒子”,它以特定的顺序接收一些名为 arguments 的值,并使用它们来产生一些其他值。当我说“黑匣子”时,我的意思是当你使用这个功能时,你不必关心如何它做它做什么,你只需给它一些值,你得到一个值
让我们考虑一个非常简单的函数,它只是减去它给出的两个数:第一个减去第二个。换句话说,我们将创建一个实现规则“参数#1 - 参数#2”的函数。现在,当您编写此函数的代码时,您需要某种方式告诉计算机何时要使用参数#1以及何时使用参数#2。在其他一些编程语言中,您必须通过显式指定要使用的参数的编号(#1或#2)来执行此操作,但如果您可以为这些值指定名称,则编写代码会更容易。因此,与大多数其他语言一样,Python允许您使用您选择的名称来引用函数的参数。例如,假设您希望参数#1在名称x
下,参数#2在名称y
下。您可以通过写下来表明:
def subtract(x, y):
接下来是构成该函数的代码。对于减法示例,它将是
def subtract(x, y):
return x - y
当Python编译器遇到这种情况时,它会将代码转换为“计算值#1 - 值#2并将其发送回调用者”的内部表示形式。然后它打包该代码块并将其保存在名称subtract
下(因为这就是你告诉它你想要命名的功能)。
希望有意义的是,一旦这段代码完成执行,引用“参数#1”或“参数#2”就没有任何意义了,因为没有函数你就不能拥有参数!所以类似地,一旦函数完成了它的事情,你给参数x
和y
的标签就不再有任何意义了。标签仅在函数代码的持续时间内存在。这称为作用域:将标签限制在代码中它们所指的部分。
因为标签x
和y
本地作用域,正如人们可能会说的那样,它甚至不管它们是什么。例如,如果您在代码中定义了subtract
,则可以随意决定将其更改为first
和second
,并且您必须更改的内容就是其中的代码那一个功能。您只需将定义更改为
def subtract(first, second):
return first - second
就是这样 - 你的代码在功能上完全一样。在x
和y
出现的程序中的任何其他位置,它们指的是除此函数的参数之外的其他内容,因此在重命名参数时不必更改它们。
在您的情况下发生的事情是您尝试在其定义的函数之外的某处使用标签length
(即,您存储为draw_rectangle
的函数)。 Python知道你不能引用你不在的函数的参数,所以它希望你已经定义了length
来表示其他东西。但你没有。这就是你收到错误的原因。 (好吧,那个错误,无论如何)
答案 5 :(得分:0)
return
会将您提供的任何内容返回给调用者。 不会自动使函数内的局部变量在外面可用(这些 local 是有原因的!)。另请注意,没有任何参数的return
将返回特殊值None
(因此它等同于return None
)。
因此,如果要返回某些值,请在函数内部使用return height, length
,在外部使用height, length = draw_flag(A)
。