동일한 기능에서 반환 및 산출
파이썬에서 동일한 함수에서 yield와 return을 사용하면 정확히 어떻게됩니까?
def find_all(a_str, sub):
start = 0
while True:
start = a_str.find(sub, start)
if start == -1: return
yield start
start += len(sub) # use start += 1 to find overlapping matches
여전히 발전기입니까?
예, 여전히 발전기입니다. 는 return
모금에 (거의) 동일합니다 StopIteration
.
PEP 255는 다음과 같이 설명합니다.
사양 : 반환
생성기 함수에는 다음 형식의 return 문도 포함될 수 있습니다.
"return"
expression_list는 생성기 본문의 return 문에서 허용되지 않습니다 (물론 생성기 내에 중첩 된 비 생성자 함수의 본문에 나타날 수 있음).
return 문이 나타나면 적절한 finally 절 (있는 경우)을 실행하여 모든 함수 반환 에서처럼 제어가 진행됩니다. 그런 다음 StopIteration 예외가 발생하여 반복기가 소진되었음을 알립니다. 제어가 명시 적 반환없이 생성기 끝에서 흘러 나오는 경우에도 StopIteration 예외가 발생합니다.
return은 제너레이터 함수와 비 제너레이터 함수 모두에 대해 "완료했습니다. 반환 할 내용이 없습니다"를 의미합니다.
return은 항상 StopIteration을 발생시키는 것과 동일하지 않습니다. 차이점은 둘러싸는 try / except 구조가 처리되는 방식에 있습니다. 예를 들면
>>> def f1(): ... try: ... return ... except: ... yield 1 >>> print list(f1()) []
모든 함수에서와 마찬가지로 return은 단순히 종료되지만
>>> def f2(): ... try: ... raise StopIteration ... except: ... yield 42 >>> print list(f2()) [42]
StopIteration은 모든 예외와 마찬가지로 베어 "예외"에 의해 캡처되기 때문입니다.
예, 여전히 발전기입니다. 비어 return
있거나 return None
생성기 함수를 종료하는 데 사용할 수 있습니다. 이것은 a를 올리는 것과 같습니다 StopIteration
(자세한 내용은 @NPE의 답변 참조).
None이 아닌 인수가있는 반환은 SyntaxError
3.3 이전의 Python 버전에서입니다.
@BrenBarn이 Python 3.3부터 시작하는 주석에서 지적했듯이 이제 반환 값이 StopIteration.
에서 PEP 380 :
생성기에서 문
return value
의미 상 동등하다
raise StopIteration(value)
값이나 생성기를 반환 할 수있는 함수에서 yield 및 return 메서드를 사용하는 방법이 있습니다.
원하는만큼 깨끗하지는 않지만 예상 한대로 작동합니다.
예를 들면 다음과 같습니다.
def six(how_many=None):
if how_many is None or how_many < 1:
return None # returns value
if how_many == 1:
return 6 # returns value
def iter_func():
for count in range(how_many):
yield 6
return iter_func() # returns generator
ReferenceURL : https://stackoverflow.com/questions/26595895/return-and-yield-in-the-same-function
'Development Tip' 카테고리의 다른 글
부동 소수점 (또는 배정 밀도) 숫자로 0으로 나누면 Java에서 java.lang.ArithmeticException : / 0으로 처리되지 않는 이유 (0) | 2020.12.30 |
---|---|
find 명령의 -exec 옵션에 백 슬래시와 세미콜론이 필요한 이유는 무엇입니까? (0) | 2020.12.30 |
하나의 dll을 다른 내부에 포함 된 리소스로 포함하고 내 코드에서 호출 (0) | 2020.12.30 |
날짜 범위별로 Subversion 저장소에서 변경 사항 목록을 어떻게 얻습니까? (0) | 2020.12.30 |
열거 형을 배열 인덱스로 사용 (0) | 2020.12.30 |