Yield after the return in Python function.

Terry Reedy tjreedy at udel.edu
Mon Apr 5 12:02:35 EDT 2021


On 4/5/2021 8:25 AM, Bischoop wrote:
> The return suspends the function execution so how is it that in below
> example I got output: <generator object doit at 0x7f57fd2912e0>
> 
> def doit():
>      return 0
>      yield 0
>      
> print(doit())

*Any* use of 'yield' in a function makes the function a generator 
function.  This is a simple rule that any person, and just as important, 
any automated algorithm, can understand.  If there were a 'dead 
(unreachable) code' exception, a reader or compiler would have to 
analyze each use of 'yield' and decide whether it is reachable or not. 
And we would have to decide whether just 1 or all 'yield's had to be 
reachable.

In the following code, in 3.x, it is also clear that 'yield' is unreachable.

 >>> def f():
	if False:
		yield 0
	return 1

 >>> f()
<generator object f at 0x0000023A7F3B0CF0>

But 'False' could be a more complex and less obvious but still 
equivalent expression, such and 'a and .... and not a'*.  Is 'log(a) = 
0' tautologically False?

*While 'a and not a' == False in logic, in Python it might raise 
NameError.  But that would still mean that it is never True, making 
'yield 0' still unreachable.

-- 
Terry Jan Reedy



More information about the Python-list mailing list