In [1]:
i = 0
stuff = ('hello', 'world', 'q', 'bar')

def getstuff():
    global i
    
    s = stuff[i]
    i += 1
    return s
    
for s in iter(getstuff, 'q'):
    print(f'inside loop {s}')
else:
    print(f'else {s}')


inside loop hello
inside loop world
else world

In [2]:
i = 0
stuff = ('hello', '123', 'q', 'bar')

def getstuff():
    global i
    
    s = stuff[i]
    i += 1
    return s

def foo():
    for s in iter(getstuff, 'q'):
        print(f'inside loop {s}')
        try:
            x = int(s)
        except ValueError:
            print('try again')
        else:
            print('break')
            break
    else:
        print(f'else {s}')
        return None
    
    print(f'good with {x}')
    return x
    
foo()


inside loop hello
try again
inside loop 123
break
good with 123
Out[2]:
123

In [3]:
i = 0
stuff = ('hello', 'world', 'q', 'bar')

def getstuff():
    global i
    
    s = stuff[i]
    i += 1
    return s

def foo():
    for s in iter(getstuff, 'q'):
        print(f'inside loop {s}')
        try:
            x = int(s)
        except ValueError:
            print('try again')
        else:
            print('break')
            break
    else:
        print(f'else {s}')
        return None
    
    print(f'good with {x}')
    return x
    
foo()


inside loop hello
try again
inside loop world
try again
else world