2016-01-23 104 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

相關問題