В функции отсутствуют 2 обязательных позиционных аргумента: «x» и «y»

Я пытаюсь написать программу черепахи 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'
>>> 

Это код:

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

Я знаю, что у этого может быть простое решение, но я действительно не могу понять, что я делаю неправильно, это было упражнение в моем классе информатики 1, и я понятия не имею, как исправить ошибку.


person user2803457    schedule 22.09.2013    source источник


Ответы (2)


Последняя строка трассировки говорит вам, где проблема:

  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'

В вашем коде функция spirograph() принимает 5 аргументов: def spirograph(R,r,p,x,y), то есть R, r, p, x, y. В строке, выделенной в сообщении об ошибке, вы передаете только три аргумента p-1, x, y, и, поскольку это не соответствует тому, что ожидает функция, Python выдает ошибку.

Я также заметил, что вы перезаписываете некоторые аргументы в теле функции:

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

Вот простой пример того, что происходит:

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

Поскольку вы всегда хотите сохранить эти значения по умолчанию, вы можете либо удалить эти аргументы из подписи вашей функции:

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

Или вы можете дать им некоторые значения по умолчанию:

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

Поскольку это задание, остальное зависит от вас.

person Burhan Khalid    schedule 22.09.2013

Ошибка говорит вам, что вы используете слишком мало аргументов для вызова spirograph

Измените этот код:

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

Вы не используете эти аргументы, но вам все равно нужно передать их функции для ее вызова.

person Jochen Ritzel    schedule 22.09.2013