2013-12-16 2 views
3

의 내가 그 출력합니다 모든 숫자 1 개에 for 루프를 작성한다고 가정 해 봅시다 :"돌아 가기"기능 만 반환 한 값

: 함수에 루프 같은 퍼팅 지금

x=4 
for number in xrange(1,x+1): 
    print number, 
#Output: 
1 
2 
3 
4 

def counter(x): 
    for number in xrange(1,x+1): 
     return number 
print counter(4) 
#Output: 
1 

for 루프를 함수에 넣을 때 하나의 값만 얻는 이유는 무엇입니까?

for 루프의 모든 결과를 목록에 추가 한 다음 목록을 반환하여이 문제를 해결했습니다.

이유는 루프에 대한 모든 결과를 추가 않으며, 단지 하나?

목록에 추가, 모든 값을 반환하는 가장 좋은 방법은 무엇
def counter(x): 
    output=[] 
    for number in xrange(1,x+1): 
     output.append(number) 
    return output 

은 매우 비효율적 인 것 같습니다.

+2

'return' 반환 함수에서. 'yield '에 관심이있을 수 있지만, 그것은'return'이 무엇을하는지 배우는 것이 필요합니다. – squiguy

답변

8

return의 파이썬의 equivilent 키워드의 이름은 의미 않습니다 똑같이. 이 명령문을 명중하면 을 반환하고 나머지 기능은 실행되지 않습니다.

대신 yield 키워드를 사용하는 것이 좋습니다. 이렇게하면 생성기 함수 (생성기를 반환하는 함수)가 만들어집니다. 생성기는 반복 가능합니다. 그들은 yield 표현식이 실행될 때마다 하나의 요소를 "산출"합니다.

def func(): 
    for x in range(10): 
     yield x 

generator = func() 
for item in generator: 
    print item 
5

당신이 발전기라고되어 원하는 :

c = counter(5) 
next(c) # 1 
next(c) # 2 

또한 수행하여 전체 발전기를 소비 할 수 :

def counter(x): 
    for number in xrange(1,x+1): 
     yield number 

당신은 다음과 같이 사용할 것

xs = list(c) # xs = [1, 2, 3, 4, 5] 

자세한 내용은 http://docs.python.org/2/tutorial/classes.html#generators을 참조하십시오.

파이썬에서 문이 함수를 반환하고 상태를 저장하지 않습니다. 함수를 호출 할 때마다 새 스택 프레임이 만들어집니다. 반면에 수율은 (다소는) continutations

2

함수에 return되면 함수 단부 나머지 코드는 더 excuted되지 않는다. 두 번째 솔루션은 좋은 당신이 더 나은 솔루션을 원한다면, 당신은 발전기 사용할 수 있습니다

def counter(x): 
    for number in xrange(1,x+1): 
     yield number 

을 그리고 다음과 같이 사용할 수 있습니다 :

>>> for i in counter(5): 
...  print i 
... 
1 
2 
3 
4 
5