Python : If-Clause가없는 비어 있지 않은 목록 위의 반복이 비어 있습니다. 왜요?
-
22-08-2019 - |
문제
필터링 및 집계가없는 비어 있지 않은 시퀀스를 통해 반복자가 어떻게 할 수 있습니까?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
여기서 문제를 겪는 ...