Python : If-Clause가없는 비어 있지 않은 목록 위의 반복이 비어 있습니다. 왜요?

StackOverflow https://stackoverflow.com/questions/703520

문제

필터링 및 집계가없는 비어 있지 않은 시퀀스를 통해 반복자가 어떻게 할 수 있습니까?sum(), 등), 아무것도 산출하지 않습니까?

간단한 예를 고려하십시오.

sequence = ['a', 'b', 'c']
list((el, ord(el)) for el in sequence)

이것은 수율입니다 [('a', 97), ('b', 98), ('c', 99)] 예상대로.

자, 그냥 스왑 ord(el) 일부 발전기에서 첫 번째 값을 가져 오는 표현식을 위해 (...).next() - 고려 된 예를 용서하십시오 :

def odd_integers_up_to_length(str):
    return (x for x in xrange(len(str)) if x%2==1)

list((el, odd_integers_up_to_length(el).next()) for el in sequence)

이것은 수율입니다 []. 그래, 빈 목록. 아니 ('a',물건) 튜플. 아무것도 아님.

그러나 우리는 필터링하거나 집계하거나 감소하지 않습니다. 발전기 표현 n 필터링이나 집계가없는 물체는 생성해야합니다 n 물체, 맞습니까? 무슨 일이야?

도움이 되었습니까?

해결책

odd_integers_up_to_length(el).next() 거기에 잡히지 않았지만 그 안에있는 발전기 표현을 위해 잡히면 아무것도 산출하지 않고 멈 춥니 다.

값이 'a'인 경우 첫 번째 반복을보십시오.

>>> odd_integers_up_to_length('a').next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

다른 팁

일어나는 일은 그게 next() 전화가 a StopIteration 예외, 스택을 외부 발전기 표현으로 거품하고 멈 춥니 다. 저것 반복.

StopIteration 반복자가 완료되었음을 알리는 정상적인 방법입니다. 일반적으로 우리는 일반적으로 그것을 보지 못합니다 next() 호출은 반복자를 소비하는 구조물 내에서 발생합니다 (예 : for x in iterator 또는 sum(iterator). 그러나 우리가 전화 할 때 next() 직접, 우리는 StopIteration. 그렇게하지 않으면 추상화에 누출이 발생하여 외부 반복에서 예상치 못한 동작으로 이어집니다.

교훈은 다음과 같이 생각합니다. next().

STR은 예약 된 keword입니다. 변수의 이름을 다르게 지정해야합니다.

나는 또한 다음에 대해 조언해야했다

>>> seq=['a','b','c']
>>> list((el,4) for el in seq)
[('a',4), ('b',4), ('c',4)]

그래서 그렇지 않습니다 list 여기서 문제를 겪는 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top