2016-01-23 105 views
1

我想知道如何在不打破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() 

return只会变得那么第一个答案退出循环,我不希望出现这种情况,我想返回多个元素到那循环的结束。

如何解决这个问题,有没有解决方法?

+0

你可以把它分配给全局/类变量,但你不能没有打破循环,我知道 – 2016-01-23 20:45:23

+2

这似乎像是在做什么,应该是相当简单的一种高度令人费解的方式回归。你能解释一下你的代码目标吗? 'myfunction'的目的是什么? – Gabriel

+0

@DeliriousSyntax是的,我知道,但我想知道是否有为了一些方法来避免 – Lindow

回答

5

您可以为此创建一个generator,以便您可以从生成器中生成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 

也可以在循环开始前创建一个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) 

注:与列表,你必须知道有多少价值的功能将在results列表中返回,以避免too many values to unpack错误的做法

+0

是的,这正是我寻找 – Lindow

+0

希望这会为你))工作 –

3

使用generator是一种可能的方式:

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() 

通过做

>>> val = next(g) 
>>> print(v) 
a 
>>> v = next(g) 
>>> print(v) 
b 

或者,在for循环中:现在,您可以通过它调用next()访问与yield i所有返回的元素

>>> for returned_val in myfunction(): 
... print(returned_val) 
a 
b 
c 
d 
e 
f 
+0

的问题是怎么样的外面的什么,我问了,但我应该在哪里在myfunction的呼吁'returned_val():'在Django,在模板还是模型? – Lindow

+0

当你需要使用时调用它;我真的不知道你的设置/你想要达到什么目的,以便能够告诉你更多关于它的信息。 –

1

你想要什么是最容易名单切片表示:

>>> l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 
>>> l[:6] 
# ['a', 'b', 'c', 'd', 'e', 'f'] 

或者创建另一个列表,您将在函数结束时返回。

def myfunction(): 
    l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 
    ret = [] 

    total = 0 
    for i in l: 
     if total < 6: 
      total += 1 
      ret.append(i) 

    return ret 

myfunction() 

# ['a', 'b', 'c', 'd', 'e', 'f'] 
0

A yield声明创建一个生成器是你想要的。

What does the "yield" keyword do in Python?

然后使用下一个方法从环路返回的每个值。

var = my_func().next() 
+0

很好的答案。实际上价值会'屈'而不是'返回' –

+0

是非常好的一点 – BenJ

相关问题