2017-11-03 41 views
1

다음 코드 조각 문제로 내가 달릴 PHP로 일부 파이썬 코드를 포팅 :의미 "다음 (L에서 C에 대한 C의 경우)"

def getOrAdd(self, config): 
    h = config.hashCodeForConfigSet() 
    l = self.configLookup.get(h, None) 
    if l is not None: 
     r = next((c for c in l if config.equalsForConfigSet(c)), None) 
     if r is not None: 
      return r 
    if l is None: 
     l = [config] 
     self.configLookup[h] = l 
    else: 
     l.append(config) 
    return config 

내가 알아낼 수 없습니다, 이게 뭐야?

r = next((c for c in l if config.equalsForConfigSet(c)), None) 

을 의미합니다.

아무도 내게이 진술의 감각을 설명 할 수 있습니까?

미리 감사드립니다.

+1

이 예에서'next'는 단지 이해력의 첫 번째 값을 얻는 것입니다. 아니면'None'입니다. –

답변

3
그것은 (반복자에서 다음 값을 끌어와 반복자가 소진 반환을 기본으로 두 번째 인수 인 경우) 게으른 list 이해를 같이하는 generator expression와, (이 반복자/발전기를 생산 two-arg next을 결합하는 것

그 수요에 따라 가치를 창출 함).

그래서 : 영어

r = next((c for c in l if config.equalsForConfigSet(c)), None) 

는 "해당 요소의 config.equalsForConfigSet이 truthy되는 l의 첫 번째 요소를 가져옵니다, 이러한 요소가 없으면, None를 돌려"를 의미한다. 느리게 처리하거나 선호하는 경우 단락을 사용하여 하나의 c 값이 전달 되 자마자 계속할 필요가 없습니다. l의 나머지 부분도로드되지 않았습니다 (목록 이해 방법과는 달리).

코드에서, 당신은과 같이 함수와 동일한 동작을 표현할 수있다 :

def firstEqualsConfigSet(l, config): 
    for c in l: 
     if config.equalsForConfigSet(c): 
      # Short-circuit: got one hit, return it 
      return c 
    # Didn't find anything 
    return None # Redundant to explicitly return None, but illustrating 
       # that two-arg next could use non-None default 

다음 수행 할 함수를 사용

r = firstEqualsConfigSet(l, config) 
+0

대단히 감사합니다! –

+0

당신은 초고속 @ShadowRanger입니다. – bagrat

0

나의 이해는

옆에 (반복자 , default) next() 함수는 반복기에서 다음 항목을 반환합니다.

목록에서 c를 추출하는 for 루프에서 'c'를 취합니다 (이전에 채워짐). 여기서 for 루프는 config.equalsForConfigSet (C)가 true를 반환해야한다는 조건으로 평가합니다.

) (다음 첫 번째 매개 변수에 'C'에 대한 값이없는 경우 없음

https://www.programiz.com/python-programming/methods/built-in/next

0

이 기본적으로 두 개의 인수로 next 함수를 호출하지 반환합니다

  • 발전기의 이해 - (c for c in l if config.equalsForConfigSet(c))
  • None

그럼 조각으로 찢어 보겠습니다.

이해 파트

괄호 ()로 묶인 것은이 generator expression이다. 목록 이해력 ([]과 함께 사용되는 경우)과 같지만 결과는 생성기 개체입니다.

의견에 힌트가있는 @ShadowRanger 감사합니다.

nextNone

next 함수는 주어진 반복자의 다음 항목 (귀하의 경우 발전기 식)을 반환합니다. 그러나 반복자가 끝나고 반환 할 것이 없으면 StopIteration 예외가 발생합니다. 이 경우 두 번째 인수를 기본값으로 전달할 때 예외를 발생시키는 대신 반환됩니다. 따라서 귀하의 경우, 후자의 경우가 발생한 경우 None이 반환됩니다.

요약

이 모든 것은 다음 수행됩니다

: 주문형 값을 생성

  • 발전기를하는 반복자, 그래서 모든 목록은 메모리
  • 을에로드되지 않습니다 next 전화가 있으면 새 발전기의 첫 번째 요소가 호출됩니다. 그렇지 않으면 None

우리는 소스 기능을 설명한다면,이 같은 소리 것입니다 :

그렇지 않으면, config.equalsForConfigSet 조건 (있는 경우)을 충족 l에서 나에게 첫 번째 요소를 가져옵니다 None을 반환합니다.

+0

Pedantic point : 괄호 안에'[]'안에 목록 이해력이 있습니다. 괄호 안의'()'는 생성자 표현식입니다. 이것은 "발전기 인스턴스를 만드는 목록 이해력"이 아닙니다. 그것들은 공식적인 용어이며, 다른 하나를 의미하기 위해 하나를 사용하면 사람을 혼란스럽게 할 것입니다. – ShadowRanger

+0

그것이 맞습니다. 그것은 지적하기위한 것입니다. 링크를 더 추가 할 것입니다. – bagrat

+0

이제 iterators와 generators에 대해 더 많이 배우기 위해 무엇을 검색해야하는지 알고 있습니다. –