如何在不破坏循环的情况下返回值?

Hir*_*uri 2 python function return-value

我想知道如何在不破坏Python循环的情况下返回值.

这是一个例子:

def myfunction():
    list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    print(list)
    total = 0
    for i in list:
        if total < 6:
            return i  #get first element then it breaks
            total += 1
        else:
            break

myfunction()
Run Code Online (Sandbox Code Playgroud)

return 只会得到第一个答案,然后离开循环,我不希望这样,我想返回多个元素,直到该循环结束.

如何解决这个问题,有什么解决方案吗?

And*_*yko 6

你可以为它创建一个生成器,这样你就可以yield从你的生成器中获取值(你的函数在使用该yield 语句后将成为一个生成器).

请参阅以下主题,以便更好地了解如何使用它:

使用发电机的一个例子:

def simple_generator(n):
    i = 0
    while i < n:
        yield i
        i += 1

my_simple_gen = simple_generator(3) // Create a generator
first_return = my_simple_gen.next() // 0
second_return = my_simple_gen.next() // 1
Run Code Online (Sandbox Code Playgroud)

您也可以list在循环开始之前创建一个append项目,然后返回该列表,然后返回该列表,这样该列表就可以被视为循环内"返回"的结果列表.

使用list返回值的示例:

def get_results_list(n):
    results = []
    i = 0
    while i < n:
        results.append(i)
        i += 1
    return results


first_return, second_return, third_return = get_results_list(3)
Run Code Online (Sandbox Code Playgroud)

注意:在带有列表的方法中,您必须知道函数将在results列表中返回多少个值以避免too many values to unpack错误


Jim*_*ard 5

使用生成器是一种可能的方法:

def myfunction():
    l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    total = 0
    for i in l:
        if total < 6:
            yield i  #yields an item and saves function state
            total += 1
        else:
            break

g = myfunction()
Run Code Online (Sandbox Code Playgroud)

现在,您可以yield i通过调用next()它来访问返回的所有元素:

>>> val = next(g)
>>> print(v)
a
>>> v = next(g)
>>> print(v)
b
Run Code Online (Sandbox Code Playgroud)

或者,在for循环中执行以下操作:

>>> for returned_val in myfunction():
...    print(returned_val)
a
b
c
d
e
f
Run Code Online (Sandbox Code Playgroud)