简体   繁体   中英

Most pythonic way to get variable based on last element in generator?

I have the following code:

class MyClass:
    def __init__(self):
        self.some_variable = None

    def func1(self):
        i = 1

        while i < 10:
            yield i * i
            self.some_variable = len(str((i * i)))
            i += 1

    def func2(self):
        *_, last = my_class.func1()
        print(self.some_variable)


my_class = MyClass()

my_class.func2()

As you can see, some_variable is the length of the last element in the generator. Basically, I was wondering, is this the most pythonic way of getting this variable? If not, how should this be done? I'm just wondering if this is how it should be done or if there's a better way of doing this.

Probably the simplest code is to simply use a for loop to consume the generator, doing nothing in the loop body. The loop variable will have the last value from the generator after the loop ends, which is exactly what you want.

for x in some_generator():
    pass

print(x) # print the last value yielded by the generator

This may be a little more efficient than other options because it discards all the values before the last one, rather than storing them in a list or some other data structure.

I think that one pythonic way would be to yield both the element and the length:

def func1():
    i = 1

    while i < 10:
        yield i * i, len(str((i * i)))
        i += 1

def func2():
    *_, (_, last_len) = func1()
    print(last_len)


func2()

or even to extract the calculation of the derived value to another function and call it after consuming the generator:

def func1():
    i = 1

    while i < 10:
        yield i * i
        i += 1

def func2(i):
    return len(str(i))

def func3():
    *_, last = func1()
    print(func2(last))


func3()

I think that you have simplified your example too much to be able to find the solution that fits your real use case the best.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM