2015-02-12 7 views
-1

Я хочу, чтобы моя функция, чтобы запустить снова с помощью рекурсии, если пользователь дает неверный ввод, однако я получаю сообщение об ошибке, когда код работает:Рекурсивные функции: TypeError: «ул» объект не вызываемая

> TypeError: 'str' object is not callable. 

Вот мой код.

y = 'yes' 
y1 ='Yes' 
y2 = 'y' 
y3 = 'Y' 

def triangle(): 
    triangle = raw_input('Is the triangle a 45-45-90 or a 30-60-90? ') 
    if triangle == y: 
     print 'yes' 
    elif triangle == y1: 
     print 'yes' 
    elif triangle == y2: 
     print 'yes' 
    elif triangle == y3: 
     print 'yes' 
    else: 
     print 'you must enter '+ y +' or ' + y1 + ' or ' + y + ' or ' + y3 
     triangle() 
+2

Не используйте одно и то же имя для функции и ввода пользователя ... – jonrsharpe

+2

Используйте другое имя локальной переменной. Это противоречит названию функции. Кроме того, вы можете использовать оператор «in» для проверки входного значения – karthikr

ответ

0

Вы создали строку ввода под названием triangle, который также название вашей функции. Остерегайтесь!

1

Поскольку Python является динамическим языком, вы можете переназначить тип переменной от одного к другому - в этом случае, непреднамеренно.

Когда вы устанавливаете переменную с равным значком =, вы фактически присваиваете не только значение, но и выводимый тип.

Этот маленький тест может показать вам тип переменной меняющийся на лету:

i = 1 
type(i) ## int 
i = "s" 
type(i) ## str 

Чтобы узнать больше о динамической природе и как присваивание переменной можно изменить тип переменной, смотрите по этой ссылке: http://www.python-course.eu/variables.php

Вот поток

  1. Ваше имя функции triangle
  2. Сразу внутри функции, вы создать переменную triangle которая является ул
  3. Когда ваш else блок выполняется, это ошибка, потому что triangle является теперь ул и больше не отсылка к функции triangle()

Это хорошая практика кодирования, чтобы назвать ваши переменные несколько представительно того, что они содержат - в данном случае - ответ пользователя;

Незначительное изменение имени переменной делает вашу работу программы :)

import math 

y = 'yes' 
y1 ='Yes' 
y2 = 'y' 
y3 = 'Y' 

def triangle(): 
    response = raw_input('Is the triangle a 45-45-90 or a 30-60-90? ') 
    if response == y: 
     print 'yes' 
    elif response == y1: 
     print 'yes' 
    elif response == y2: 
     print 'yes' 
    elif response == y3: 
     print 'yes' 
    else: 
     print 'you must enter '+ y +' or ' + y1 + ' or ' + y + ' or ' + y3 
     triangle() 

if __name__ == "__main__": 
    triangle() 

Бонус:

Вы можете сделать свой, если/иначе блок гораздо проще с помощью in тем более, что ваш ответ всегда является (распечатать «да» и выйти из программы):

if response in (y, y1, y2, y3): 
    print 'yes' 

Надеюсь, это поможет!

0

Вы назначили triangle на ваш raw_input(), который отменяет ваше объявление функции; таким образом, вы вызываете 'myinput'(), а не triangle(). Чтобы исправить это, просто измените имя своей функции или присвоение переменной raw_input().

Смежные вопросы