return
생성기에서 한 번만 사용할 수 있습니다 . 아무것도 산출하지 않고 반복을 중지하므로 함수가 범위를 벗어나도록하는 것에 대한 명시적인 대안을 제공합니다. 따라서 yield
함수를 제너레이터로 바꾸려면을 사용 하십시오. 그러나 return
어떤 것을 산출하기 전에 제너레이터를 종료하려면 먼저 사용하십시오.
>>> def f():
... return
... yield
...
>>> list(f())
[]
나는 그것이 당신이 가진 것보다 훨씬 낫다는 것을 확신하지 못합니다-단지 no-op if
문을 no-op 문으로 대체합니다 yield
. 그러나 그것은 더 관용적입니다. 그냥 사용 yield
하는 것은 작동하지 않습니다.
>>> def f():
... yield
...
>>> list(f())
[None]
왜 그냥 사용하지 iter(())
않습니까?
이 질문은 빈 생성기 함수 에 대해 구체적으로 묻습니다 . 따라서 일반적으로 빈 반복기를 만드는 가장 좋은 방법에 대한 질문 이라기보다는 Python 구문의 내부 일관성에 대한 질문으로 간주합니다.
질문이 실제로 빈 반복기를 만드는 가장 좋은 방법에 관한 것이라면iter(())
대신 사용 하는 것에 대해 Zectbumo 에 동의 할 수 있습니다 . 그러나 iter(())
함수를 반환하지 않는 것을 관찰하는 것이 중요 합니다! 빈 이터 러블을 직접 반환합니다. 이터 러블 을 반환 하는 콜 러블을 기대하는 API로 작업한다고 가정합니다 . 다음과 같이해야합니다.
def empty():
return iter(())
( 이 답변의 첫 번째 올바른 버전을 제공 한 크레딧은 Unutbu 에 가야합니다 .)
이제 위의 내용이 더 명확해질 수 있지만 덜 명확 할 상황을 상상할 수 있습니다. (기여 된) 생성기 함수 정의의 긴 목록의 다음 예를 고려하십시오.
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
긴 목록 끝에 다음과 같이 a가 yield
있는 것을보고 싶습니다 .
def empty():
return
yield
또는 Python 3.3 이상에서 ( DSM 에서 제안한대로 ) 다음과 같습니다.
def empty():
yield from ()
yield
키워드 의 존재 는 이것이 다른 모든 함수와 똑같이 또 다른 제너레이터 함수라는 것을 아주 간략하게 보여줍니다. iter(())
버전이 동일한 작업을 수행 하는지 확인하는 데 시간이 조금 더 걸립니다 .
미묘한 차이이지만 솔직히 yield
기반 함수가 더 읽기 쉽고 유지 관리가 가능 하다고 생각합니다 .
if False: yield
하지만 여전히 좀이 패턴을 모르는 사람에 대한 혼란