2016-04-14 2 views
1

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

Traceback (most recent call last): 
    File "W:\My Data Sources\My Documents\A level\Computer Science\Python\Tasks\Painting estimate copy wout gen.py", line 102, in <module> 
    area() 
    File "W:\My Data Sources\My Documents\A level\Computer Science\Python\Tasks\Painting estimate copy wout gen.py", line 71, in area 
    sub2() 
    File "W:\My Data Sources\My Documents\A level\Computer Science\Python\Tasks\Painting estimate copy wout gen.py", line 48, in sub2 
    area() 
    File "W:\My Data Sources\My Documents\A level\Computer Science\Python\Tasks\Painting estimate copy wout gen.py", line 67, in area 
    print("Please enter the dimensions of each wall in your",next(iter1),"when prompted.") 
StopIteration 

RoomDetails = [] 
wallDimensions = [] 
counter = 0 


def rooms(): 


    RoomNum = str(input("Please enter the name of the room you require painting (e.g. 'lounge'): ")) 

    RoomDetails.append(RoomNum) 

    inp1 = input("Have you entered all the rooms you need to decorate? Y or N?: ") 

    if inp1 == 'y': 
    print("") 


    elif inp1 == 'Y': 
     print("") 

    elif inp1 == 'n': 
     print("These are the rooms you have entered thus far: ", RoomDetails) 
     rooms() 

    elif inp1 == 'N': 
     print("These are the rooms you have entered thus far: ", RoomDetails) 
     rooms() 


def sub(): 

    wallH = float(input("What's the hieght of this wall? (In meters): ")) 
    wallW = float(input("What's the width of this wall? (In meters): ")) 

    wallD = wallH * wallW 

    wallDimensions.append(wallD) 


def sub2(): 

    global counter 

    var3 = input("Have you entered the dimensions of all the walls in this room that require painting? Y or N?") 
    if var3 == 'y': 
     area() 
    elif var3 == 'Y': 
     area() 
    elif var3 == 'n': 
     sub() 
     sub2() 
    elif var3 == 'N': 
     sub() 
     sub2() 


global iter1 
iter1 = iter(RoomDetails) 

def area(): 
    global counter 
    counter = counter + 1 


    print("Please enter the dimensions of each wall in your",next(iter1),"when prompted.") 

    sub() 

    sub2() 

    if counter < len(RoomDetails): 
     area() 
    elif iter1 == RoomDetails[-1]: 
     raise StopIteration 



def calc(): 

    var4 = float 
    var4 = sum(wallDimensions) 
    #£4.24 per square metre for painting 
    var5 = float 
    var5 = 4.24 
    finalAmount = var4 * var5 
    print("The total cost to paint",RoomDetails,"will be £",finalAmount) 
    input("...") 



    print("Welcome to the evaluation") 


    CustNum = input("Please enter your customer number: ") 

    DateEst = input("Please enter the date of your estimate: ") 

    rooms() 

    area() 

    calc() 

ответ

1

Вы сравниваете в iterator к элементу списка здесь:

iter1 == RoomDetails[-1]: 

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

>>> iter([]) 
<listiterator object at 0x6ffffdaf090> 

Таким образом, если ваш другой объект не является такой же итератор, он всегда будет возвращать значение False и поэтому никогда не поднимать ValueError. Попробуйте сделать этот тест немного проще, и он должен работать.

Кроме того, вы действительно не создали итератор - вам нужно дать значения, чтобы сделать вашу функцию выражением генератора. Возможно, стоит просто вернуть список или что-то простое для достижения вашей цели? Как правило, итератор даст возвращаемое значение области():

if counter < len(RoomDetails): 
    yield area() 

И как вы просто вызвать area(), не итерацию над ней, вам не нужно быть итератор здесь в любом случае.

+0

Отлично, спасибо! Я довольно новичок в программировании, и ни я, ни мой преподаватель информатики не могли увидеть, где я ошибаюсь. Извините, если это казалось глупым вопросом :) –

+0

Очень рад помочь. Не стесняйтесь принять ответ, если он решил вашу проблему :). Благодарю. – srowland

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