2011-08-10 8 views
0

묶음 값에 입력 번호를 추가하여 합계 함수 목록을 반환하는 함수를 작성해야합니다. 2,3,4,5,6하지만 6,6,6,6,6생성자와 실제 변수 값

문제는 "I"에있다 :

def addition_range(start, end): 
    if start >= end: return None 

    #res = ((lambda x: x + i) for i in range(start, end)) #1 
    res = [ (lambda x: x + i) for i in range(start, end) ] #2 

    return res 

for i in addition_range(0, 5): print(i(2)) 

출력은 같이해야한다 :이 내가 무슨 짓을 변수를 호출 할 때 함수는 i (4)의 실제 값을 사용하며 목록 생성 중에 사용되는 값은 사용하지 않습니다. 문제는 (# 1) 대신 (# 2)를 사용하여 간단히 해결할 수 있지만, (# 2)에 대한 해결책이 있습니까? 시도 :

res = [ (lambda x: x + copy.deepcopy(i)) for i in range(start, end) ] 

그러나 도움이되지 않습니다.

감사합니다. 버전이 i를 평가하는 반면, 더미 파라미터 람다가 정의 될 때 평가

def addition_range(start, end): 
    res = [(lambda x, i=i: x + i) for i in range(start, end)] 
    return res or None 

:

WINXP + 파이썬 3.2

답변

1

이 문제를 해결하는 가장 쉬운 방법은 더미 변수를 추가하는 것이다 람다가 호출 될 때만.

사이드 노트 : 구현의 정확한 동작을 시뮬레이션하기 위해서만 or None 부분을 추가했습니다. None 대신 빈 목록을 반환하는 것이 더 나을 것입니다.

def addition_range(start, end): 
    return [(lambda x, i=i: x + i) for i in range(start, end)] 
+0

고맙습니다. 작동합니다! – fogbit