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))

Python インタープリターがコメント化されたコードを実際のコードに暗黙的に変換できない理由はありますか? これは許可されるべきだと思われますが、私は彼らがこれを許可しないことを選択した理由が何であるか疑問に思っています.

4

4 に答える 4

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
>>> 

インタープリターがどの部分がジェネレーターであるかを判断する理由については考えられません。大変ですし、プログラマーの責任だと思います。そして、ジェネレーターで値を返すことが適切な実装であるかどうかさえ疑問に思います。

于 2013-07-24T04:57:05.193 に答える
0

ジェネレーターは関数のように宣言されていますが、異なるため、ジェネレーターで return ステートメントを使用することはできません。次のことを行う必要があります。

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

さらに良い実装は次のとおりです。

def func(param):
    if param < 0:
        raise ValueError("param must be a positive number")
    i = 0
    while i < param:
        yield i
        i += 1
于 2013-07-24T04:56:05.277 に答える