2013-01-03 2 views
4

나는 CSV 파일을 읽을 수있는 간단한 기능을 가지고 있고 그것에서 처음 coloum를 추출 :'Return'키워드는 루프에서 하나의 요소 만 반환합니까?

a = pass_username() 
print a 

이 첫 번째 요소를 출력합니다

import csv 

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

내가으로이 함수를 호출

. 그러나 return 단어를 print으로 바꾸고 print row[0]으로 표시하고이 함수를 pass_username()으로 호출하면 모든 요소가 인쇄됩니다. 그 함수를 변수에 대입하여 반환을 사용하고 싶습니다. 그것을 고치는 방법? test.csv의

내용 :

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

답변

5

, 당신은 목록에 결과를 축적 할 수있다 그걸 돌려 보내라. 또 다른 방법은 returnyield으로 바꾸는 것입니다. 그러면 함수가 나중에 for 루프를 사용하여 반복 할 때 얻을 수있는 항목을 생성하는 반복 가능한 유형의 객체를 반환하게됩니다.

참조 : 그들은을 필요로 할 수 있도록, 예를 들어,

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

는 사용자 이름이 를 생산하는 것을 유의 사항 : What does the "yield" keyword do in Python? 여기

당신이 당신의 코드로 사용하는 것이 방법입니다 , 모두를 생성 할 필요없이 다음 사용자 이름을 생성하는 username_generator.next()을 수행하십시오.

+0

발전기 언급 +1. iterable 유형은 실제로 항목을 포함하지 않지만 요청에 따라 생성되어 실제로 저장되지 않기 때문에 항목을 포함하지는 않습니다. – jdi

+0

예, 게으른 평가 등을 일으키지 않고 작동하는 방식을 정확하게 설명하는 것은 어렵습니다. 나는 그것을 반영하기 위해 나의 대답을 편집 할 것이다. – Wes

+0

예제 코드 스 니펫을 추가하고자 할 수 있습니다. 이해하는 것보다 생성기가 훨씬 쉽습니다. – theodox

1

에서만 기능에서 한 번 반환 할 수 있습니다. 그것이 돌아 왔을 때, 끝났어. 함수가 처음으로 반환되면 끝나기 때문에 하나의 값만 반환됩니다.

모든 값을 반환하려면 목록에 누적하여 목록을 반환하십시오.

+2

당신이 대답을 쓸 때 매우 성가시다. 누군가 다른 사람이 똑같은 것을 쓰고 자신의 대답을 내 보낸다. – Volatility

2

return을 호출하면 함수에서 자동 종료되므로 return 문에 도달 한 후에 아무 것도 처리하지 않습니다.

목록에 결과가 append 인 경우 목록에 return이 표시 될 수 있습니다.

귀하의 경우에는

, 당신은 심지어 대신 루프의하는 list comprehension을 사용할 수 있습니다,이를 사용했다 응답 한 다른 사람으로

return [row[0] for row in spamreader] 
관련 문제