2016-12-18 13 views
3

Я новичок в Python 2. Я пытаюсь создать программу Python для покупок, но застрял в" проверке запасов до поместить в корзину»шаг.: TypeError: аргумент типа 'function' не является итерируемым ", но работает при индивидуальном тестировании

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

во-вторых, я уже отделилась каждую функцию и тест в другой Они работали хорошо по отдельности, но когда они подключились к функции check_stock(y), она выдала ошибку.

Я считаю, проблема возникает из команды «in».

def check_stock(y):    #// Problem in this function // 
     if y in list: 
      print "%s is available" % y 
      add_to_cart(y) 
     else: 
      print "Sorry, but %s is not available." % y 

    def check_finish(): 
     y = raw_input(">") 
     if y == "checkcart":   
      print cart    #check inside shopping cart 
     elif y == " ": 
      check_finish()   #loop back for blank 
     elif y == "list": 
      list()     #present the list 
     else: 
      while y != "ok":  #"ok" = finished shopping 
       check_stock(y) 
      else: 
       print "Checking out..." 
       sorted(cart) 
       print "Your item(s) are %s." % cart 
       exit(0) 

Вот остальная часть кода, если это может помочь:

cart = [] 
list = ['apple', 'banana', 'cat', 'dog', 'elephant', 'flamingo', 'goofy', 'ham'] 
a = 0 

def list(): 
    print list     #present the list 
def representInt(s):   #check if value is integer 
    try: 
     int(s) 
     return True 
    except ValueError: 
     return False 
def annoyedAtError(a):   #interaction for repeated mistakes 
    if a < 2: 
     print "Numbers only please" 
    elif 2 < a < 4: 
     print "Man, just do as I say, please. I have another shift tonight." 
    elif a == 5 : 
     print "Hey, seriously?" 
    else: 
     print "..." 
def check_stock(y):    #// PROBLEM HERE // cross-check with list if item is available 
    if y in list: 
     print "%s is available" % y 
     add_to_cart(y) 
    else: 
     print "Sorry, but %s is not available." % y 

def add_to_cart(y): 
    amount = (raw_input("How many do you want to add? > ")) 
    if representInt(amount) == False: 
     annoyedAtError(a) 
     global a 
     a = a + 1 
     add_to_cart(y) 
    else: 
     y = y + " " + amount 
     print "%s is added to cart" % (y) 
     cart.append(y) 
     check_finish() 
def check_finish(): 
    y = raw_input(">") 
    if y == "checkcart":   
     print cart    #check inside shopping cart 
    elif y == " ": 
     check_finish()   #loop back for blank 
    elif y == "list": 
     list()     #present the list 
    else: 
     while y != "ok":  #"ok" = finished shopping 
      check_stock(y) 
     else: 
      print "Checking out..." 
      sorted(cart) 
      print "Your item(s) are %s." % cart 
      exit(0) 
def welcome():  
    print """\nWelcome to cyber shopping.\n 
    Please enter things you want to buy. 
    Check your cart by typing: checkcart 
    type "ok" when finished. 
    type "list" for things available for buying""" 
def start(): 
    welcome() 
    check_finish() 

start() 
+1

Не называть переменную 'list' или определять другую функцию' list() ... это встроенная функция python –

+0

Определенно не называйте функцию 'list'. Я бы предложил использовать 's_list' или' shopping_list' – GreenHawk1220

+0

Также 'while y! =" Ok ":' выглядит как бесконечный цикл, потому что вы никогда не переназначаете 'y' –

ответ

5

Вы создали список с именем list (которые вы не должны делать, потому что это встроенный имя уже), но затем вы также создаете функцию с именем list (опять же, не делайте этого). list относится к функции сейчас, а не к вашему списку. Итак, когда вы проверяете y in list, он пытается проверить, находится ли элемент в функции. Вы не можете использовать in для функции, следовательно, ошибку. Решение прост: используйте более понятные имена для вещей!

+0

Я работал сейчас. Вау. Спасибо за ваш добрый совет. lol. в следующий раз определенно обратят больше внимания на имена функций. –

1
lst = ['apple', 'banana', 'cat', 'dog', 'elephant', 'flamingo', 'goofy', 'ham'] 
a = 0 

list является встроенной функцией в Python, так что используйте другое имя.

+0

Также вопрос имеет 'def list()' –

+0

Да. Это также должно быть переименовано – FallAndLearn

+0

Спасибо. Теперь это сработало. –

1

Во-первых, не называйте список list! Во-вторых, чем более описательными являются названия вашей функции, тем лучше. Так вот какой-то код с именами редактируемых:

cart = [] 
groceries = ['apple', 'banana', 'cat', 'dog', 'elephant', 'flamingo', 'goofy', 'ham'] 
a = 0 

def prntgroceries(): 
    print groceries     #present the groceries 
def representInt(s):   #check if value is integer 
    try: 
     int(s) 
     return True 
    except ValueError: 
     return False 
def annoyedAtError(a):   #interaction for repeated mistakes 
    if a < 2: 
     print "Numbers only please" 
    elif 2 < a < 4: 
     print "Man, just do as I say, please. I have another shift tonight." 
    elif a == 5 : 
     print "Hey, seriously?" 
    else: 
     print "..." 
def check_stock(y):    #// PROBLEM HERE // cross-check with list if item is available 
    if y in groceries: 
     print "%s is available" % y 
     add_to_cart(y) 
    else: 
     print "Sorry, but %s is not available." % y 

def add_to_cart(y): 
    amount = (raw_input("How many do you want to add? > ")) 
    if representInt(amount) == False: 
     annoyedAtError(a) 
     global a 
     a = a + 1 
     add_to_cart(y) 
    else: 
     y = y + " " + amount 
     print "%s is added to cart" % (y) 
     cart.append(y) 
     check_finish() 
def check_finish(): 
    y = raw_input(">") 
    if y == "checkcart":   
     print cart    #check inside shopping cart 
    elif y == " ": 
     check_finish()   #loop back for blank 
    elif y == "list": 
     prntgroceries()     #present the list of groceries 
    else: 
     while y != "ok":  #"ok" = finished shopping 
      check_stock(y) 
     else: 
      print "Checking out..." 
      sorted(cart) 
      print "Your item(s) are %s." % cart 
      exit(0) 
def welcome():  
    print """\nWelcome to cyber shopping.\n 
    Please enter things you want to buy. 
    Check your cart by typing: checkcart 
    type "ok" when finished. 
    type "list" for things available for buying""" 
def start(): 
    welcome() 
    check_finish() 

start() 

Вторая вещь отметить, никакого отношения к вашему вопросу: когда вы просите за то, что вы можете купить, она выводит список ... и завершает программу. Я бы предложил сделать что-то, чтобы программа не заканчивалась сразу после того, как вы распечатали список доступных вещей. Возможно, даже распечатайте этот список в самом начале.

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

+0

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

+0

@ Nocab_Evol_1, не проблема, удачи! – heather

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