why i am unable to access 2 generator object in 1 python code

Viewed 113

I am unable to use generator for second time. The object is created fine as a generator but I am not getting any values in the list.

CODE:

# list of names

names_list = ['Adam','Anne','Barry','Brianne','Charlie','Cassandra','David','Dana']

# too long
# reverse_uppercase = (name[::-1] for name in (name.upper() for name in names_list))

# breaking it up 

upper_case = (name.upper() for name in names_list)

reverse_uppercase = (name[::-1] for name in upper_case)

print("1")

for n in reverse_uppercase:
    print(n)

print('break')

for n in upper_case:
    print("1")
    print(n)

print(upper_case)
print(list(upper_case))
print(reverse_uppercase)
print(list(reverse_uppercase))

Output:

1

MADA

ENNA

YRRAB

ENNAIRB

EILRAHC

ARDNASSAC

DIVAD

ANAD

break

<generator object <genexpr> at 0x7f7434874510>

[]

<generator object <genexpr> at 0x7f74348744a0>

[]

you can see I am trying to acces those generator but I am getting empty list. Please help me.

2 Answers

Generators are one-time objects. This means that if you consumed them once, they are "empty".

Your generator upper_case is consumed in your first for loop, when you consume reverse_uppercase. reverse_uppercase consumes upper_case, because that's how it's defined:

reverse_uppercase = (name[::-1] for name in upper_case)

After

for n in reverse_uppercase:
    print(n)

both generators are empty. If you want to be able to iterate the content multiple times, use a list comprehension instead of a generator expression.

Related