2013-07-24 2 views
2
#def func(param): 
# if param < 0: 
#  return "test" 
# i = 0 
# while i < param: 
#  yield i 
#  i += 1 
def func(param): 
    if param < 0: 
     return "test" 
    def gen(n): 
     i = 0 
     while i < param: 
      yield i 
      i += 1 
    return gen(param) 

print(func(-1)) 
print(func(3)) 
g = func(3) 
for i in range(0, 3): 
    print(next(g)) 

파이썬 인터프리터가 주석 처리 된 코드를 암시 적으로 실제 코드로 변환 할 수없는 이유가 있습니까? 이것은 이것이 허용되어야하는 것처럼 보이지만, 나는 그들이 반향을 일으키도록 선택하게 만든 반향이 있는지 궁금합니다.파이썬 인터프리터가 암시 적으로 생성기를 생성하지 않는 이유는 무엇입니까?

답변

0

이유는 defyield 문을 포함하면, 발전기를 생성 단순히 :

http://www.python.org/dev/peps/pep-0255/

yield 문은 함수 내부에서 사용될 수있다. yield 문이 에있는 함수를 생성기 함수라고합니다. 생성자 함수는 모든면에서 일반 함수 객체이지만 코드 객체의 co_flags 멤버에 새 CO_GENERATOR 플래그가 설정되어 있습니다.

이는 인터프리터가 일반 함수와 생성기 함수를 구별하는 방법입니다. 구현하기 쉽고 추론하기 쉽습니다 ("yield이 생성기 인 경우 생성기입니다")

설명하는 "조건부 생성기"동작은 구현하기가 훨씬 복잡하고 경우에 따라서는 바람직하지 않을 수도 있습니다 조건부는 발전기의 첫 번째 반복 안에서 발생해야합니다. 또는 func(...)으로 전화하는 즉시 실행해야합니다.

다른 코드는 생성자 또는 문자열을 반환합니다. 그게 당신이 원하는 인터페이스라면 완벽하게 좋은 솔루션 같아 보입니다. (실제 예제가 없으면 실용적인 제안을하는 것이 어렵습니다)

1

생성기 함수를 호출하면 반환 할 개체 유형을 알 수 있습니다 - 생성기. 발전기 기능을 return으로 허용하면 발전기를 반복하기 전에 반환 값의 유형을 확인해야하므로 더 이상 발전기 기능을 사용할 수 없으므로 발전기를 반환 할 수있는 기능 만 수행합니다 . 당신이 발전기 에서 return 문을 사용하지 못할

0

발전기 함수처럼 선언하지만, 다른있다, 당신이해야 할 것은 :

def func(param): 
    if param < 0: 
     yield "test" 
     raise StopIteration() 
    i = 0 
    while i < param: 
     yield i 
     i += 1 

더 나은 implmention은 다음과 같습니다

def func(param): 
    if param < 0: 
     raise ValueError("param must be a positive number") 
    i = 0 
    while i < param: 
     yield i 
     i += 1 
2

python2.x에서는 생성자에서 어떤 것을 반환 할 수 없습니다.

>>> def func(): 
...  return 3 
...  yield 3 
... 
    File "<stdin>", line 3 
SyntaxError: 'return' with argument inside generator 
>>> 
발전기에서 python3.x에서

사용 return는 인상을 의미 StopIteration(<something>) :

>>> def func(): 
...  return 3 
...  yield 3 
... 
>>> func().__next__() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration: 3 
>>> 

내가 발전기 인 부분을 결정하는 인터프리터에 대한 이유에 대해 생각할 수 없다. 어렵고 프로그래머의 책임이라고 생각합니다. 그리고 제네레이터의 가치를 반환하는 것이 좋은 구현인지 여부는 의심 스럽습니다.

+0

나는 그 기능이 들어간 줄 알았지 만, 처음부터 다시 소스를 찾을 수 없었습니다. 읽었을 때, 테스트 할 Python 3 설치가 없습니다. PEP 또는 변경 사항을 문서화 한 것에 대한 링크가 있습니까? – user2357112

+1

[PEP380] (http : //www.python.org/dev/peps/pep-0380 /). 당신은 규칙을 볼 수 있습니다. @ user2357112 – zhangyangyu

+3

기술적으로, 파이썬 2.x의 생성자에서'return'을 사용할 수 있습니다. 단지 값을 반환 할 수 없습니다. 'StopIteration'을 발생시키는 것과 같습니다. – Amber

관련 문제