Python 函数缺少 2 个必需的位置参数:“x”和“y”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18940249/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 12:20:00  来源:igfitidea点击:

Function missing 2 required positional arguments: 'x' and 'y'

pythonturtle-graphics

提问by user2803457

I am trying to write a Python turtle program that draws a Spirograph and I keep getting this error:

我正在尝试编写一个绘制螺旋图的 Python 海龟程序,但我不断收到此错误:

Traceback (most recent call last):
  File "C:\Users\matt\Downloads\spirograph.py", line 36, in <module>
    main()
  File "C:\Users\matt\Downloads\spirograph.py", line 16, in main
    spirograph(R,r,p,x,y)
  File "C:\Users\matt\Downloads\spirograph.py", line 27, in spirograph
    spirograph(p-1, x,y)
TypeError: spirograph() missing 2 required positional arguments: 'x' and 'y'
>>> 

This is the code:

这是代码:

from turtle import *
from math import *
def main():
    p= int(input("enter p"))
    R=100
    r=4
    t=2*pi
    x= (R-r)*cos(t)-(r+p)*cos((R-r)/r*t)
    y= (R-r)*sin(t)-(r+p)*sin((R-r)/r*t)
    spirograph(R,r,p,x,y)


def spirograph(R,r,p,x,y):
    R=100
    r=4
    t=2*pi
    x= (R-r)*cos(t)-(r+p)*cos((R-r)/r*t)
    y= (R-r)*sin(t)-(r+p)*sin((R-r)/r*t)
    while p<100 and p>10:
        goto(x,y)
        spirograph(p-1, x,y)

    if p<10 or p>100:
        print("invalid p value, enter value between 10 nd 100")

    input("hit enter to quite")
    bye()


main()

I know this maybe has a simple solution but I really can't figure out what I am doing wrong, this was an exercise in my computer science 1 class and I have no idea how to fix the error.

我知道这可能有一个简单的解决方案,但我真的无法弄清楚我做错了什么,这是我的计算机科学 1 课的练习,我不知道如何修复错误。

采纳答案by Burhan Khalid

The last line of the traceback tells you where the problem is:

回溯的最后一行告诉您问题出在哪里:

  File "C:\Users\matt\Downloads\spirograph.py", line 27, in spirograph
    spirograph(p-1, x,y) # <--- this is the problem line
TypeError: spirograph() missing 2 required positional arguments: 'x' and 'y'

In your code, the spirograph()function takes 5 arguments: def spirograph(R,r,p,x,y), which are R, r, p, x, y. In the line highlighted in the error message, you are only passing in three arguments p-1, x, y, and since this doesn't match what the function is expecting, Python raises an error.

在您的代码中,该spirograph()函数采用 5 个参数:def spirograph(R,r,p,x,y), R, r, p, x, y。在错误消息中突出显示的行中,您只传递了三个参数p-1, x, y,由于这与函数预期的不匹配,Python 会引发错误。

I also noticed that you are overwriting some of the arguments in the body of the function:

我还注意到您正在覆盖函数体中的一些参数:

def spirograph(R,r,p,x,y):
    R=100 # this will cancel out whatever the user passes in as `R`
    r=4 # same here for the value of `r`
    t=2*pi

Here is a simple example of what is happening:

这是正在发生的事情的一个简单示例:

>>> def example(a, b, c=100):
...    a = 1  # notice here I am assigning 'a'
...    b = 2  # and here the value of 'b' is being overwritten
...    # The value of c is set to 100 by default
...    print(a,b,c)
...
>>> example(4,5)  # Here I am passing in 4 for a, and 5 for b
(1, 2, 100)  # but notice its not taking any effect
>>> example(9,10,11)  # Here I am passing in a value for c
(1, 2, 11)

Since you always want to keep this values as the default, you can either remove these arguments from your function's signature:

由于您始终希望将此值保留为默认值,因此您可以从函数的签名中删除这些参数:

def spirograph(p,x,y):
    # ... the rest of your code

Or, you can give them some defaults:

或者,您可以给他们一些默认值:

def spirograph(p,x,y,R=100,r=4):
    # ... the rest of your code

As this is an assigment, the rest is up to you.

由于这是一项分配,其余的取决于您。

回答by Jochen Ritzel

The error tells you that you're using too few arguments to call spirograph

该错误告诉您调用的参数太少 spirograph

Change this code:

更改此代码:

while p<100 and p>10:
    goto(x,y)
    spirograph(R,r, p-1, x,y) # pass on  the missing R and r

You're not using these arguments though, but you still have to give them to the function to call it.

虽然您没有使用这些参数,但您仍然必须将它们提供给函数来调用它。