2013-01-03 61 views
4

我有一個簡單的函數來讀取csv文件,並從中提取明杆第一:'Return'關鍵字只返回循環中的一個元素?

import csv 

def pass_username(): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=',') 
     for row in spamreader: 
      return row[0] 

當我調用該函數爲:

a = pass_username() 
print a 

僅打印第一要素。但是,當我用print替換return作爲print row[0]並將該函數調用爲pass_username()時,它將打印所有元素。我想將該函數分配給一個變量,因此我想使用return。如何解決它? test.csv的

內容:

"[email protected]","rockon" 
"[email protected]","hey" 
"[email protected]","ok" 
"[email protected]","password" 

回答

5

由於其他人誰接說,你可以積累的結果到一個列表並返回。另一種方法是,用yield替換return,它導致你的函數返回一個可迭代的類型對象,當你決定稍後迭代它時(可能用一個for循環),它會產生你產生的項目。

參見:What does the "yield" keyword do in Python?

這裏是你將如何使用它與您的代碼:

import csv 

def pass_username(): 
    with open('test.csv', 'r') as csvfile: 
     spamreader = csv.reader(csvfile, delimiter=',') 
     for row in spamreader: 
      yield row[0] 

username_generator = pass_username() 

# iterate through the usernames with a for loop 
for name in username_generator: 
    print name 
# call the list constructor which causes it to produce all of the names 
print list(pass_username()) 

請記住,用戶名是生產,因爲他們需要,這樣你就可以,例如,做username_generator.next()這將產生下一個用戶名,而不必產生所有這些。

+0

+1提一個發電機。儘管可迭代類型並不真正「包含」這些項目,因爲它們是按需生成的,而不是實際存儲的。 – jdi

+0

是的,很難解釋它的工作原理而不提出懶惰的評估等。我會編輯我的答案以更好地反映這一點。 – Wes

+0

可能要添加示例代碼的片段 - 使用生成器比理解它們要容易得多:) – theodox

1

您只能從一個函數返回一次。當它返回時,結束。函數第一次返回時,它結束,所以它只返回一個值。

如果要返回所有值,請將它們累積到列表中並返回列表。

+2

當你寫一個答案時,這很煩人,而其他人寫完全相同的東西,並在你面前提交他的答案。 – Volatility

2

當您撥打return時,它會自動退出該功能,因此它在到達return語句後不會處理任何內容。

您可能想將append的結果轉換爲列表,然後return的列表。

在你的情況,你甚至可能想使用一個list comprehension,所以不是在for循環,使用此:

return [row[0] for row in spamreader]