例1:程序从第一个return 2.1退出。此后的代码都未运行。
def func():
print("func() 1")
try:
print("func() 2")
return 2.1
except Exception:
print("func() Exception")
else:
print("func() 3")
return 3.1
print("func() 4")
return 4.1
print(f"func type {type(func)}")
print("func: 1")
try:
print(f"func() = {func()}")
except Exception as e:
print(f"Exception.value = {e.value}") # 获取return的值
print("func: 2")
输出:
func type <class 'function'>
func: 1
func() 1
func() 2
func() = 2.1
func: 2
例2:程序执行到第二个return 3.1退出。此后的代码都未运行,但执行到第一个return 2.1时没有退出,因为finally:中的代码段是必须执行的,并且finally代码块中有return语句。
def func():
print("func() 1")
try:
print("func() 2")
return 2.1
except Exception:
print("func() Exception")
finally:
print("func() 3")
return 3.1
print("func() 4")
return 4.1
print(f"func type {type(func)}")
print("func: 1")
try:
print(f"func() = {func()}")
except Exception as e:
print(f"Exception.value = {e.value}") # 获取return的值
print("func: 2")
输出:
func type <class 'function'>
func: 1
func() 1
func() 2
func() 3
func() = 3.1
func: 2
例3:程序执行到第一个return 2.1退出。此后finally:中的代码段是必须执行的,所以func() 3还是能打印出来。与例2执行结果比较得出,只要finally中的代码块中没有return语句,则还将在执行到第一个return语句处退出。
def func():
print("func() 1")
try:
print("func() 2")
return 2.1
except Exception:
print("func() Exception")
finally:
print("func() 3")
print("func() 4")
return 4.1
print(f"func type {type(func)}")
print("func: 1")
try:
print(f"func() = {func()}")
except Exception as e:
print(f"Exception.value = {e.value}") # 获取return的值
print("func: 2")
输出:
func type <class 'function'>
func: 1
func() 1
func() 2
func() 3
func() = 2.1
func: 2
例4:程序执行到第一个return 2.1退出。此后的代码不去执行。
def gen():
print("gen() 1")
yield 1
try:
print("gen() 2")
yield 2
print("gen() 3")
return 2.1
except Exception:
print("gen() Exception")
else:
print("gen() 4")
yield 3
print("gen() 5")
return 5.1
print("gen() 6")
return 6.1
it = gen()
print(f"it type {type(it)}")
print("it:1")
for i in range(2,6):
try:
print(f"next(it) = {next(it)}")
except StopIteration as e:
print(f"StopIteration.value = {e.value}") # 获取return的值
print(f"it:{i}")
输出:
it type <class 'generator'>
it:1
gen() 1
next(it) = 1
it:2
gen() 2
next(it) = 2
it:3
gen() 3
StopIteration.value = 2.1
it:4
StopIteration.value = None
it:5
例5:finally:中的代码段是必须执行的,所以生成器能返回3个值,此时return出生成器函数的返回值还是第一个return的值 2.1。
def gen():
print("gen() 1")
yield 1
try:
print("gen() 2")
yield 2
print("gen() 3")
return 2.1
except Exception:
print("gen() Exception")
finally:
print("gen() 4")
yield 3
print("gen() 5")
it = gen()
print(f"it type {type(it)}")
print("it:1")
for i in range(2,7):
try:
print(f"next(it) = {next(it)}")
except StopIteration as e:
print(f"StopIteration.value = {e.value}") # 获取return的值
print(f"it:{i}")
输出:
it type <class 'generator'>
it:1
gen() 1
next(it) = 1
it:2
gen() 2
next(it) = 2
it:3
gen() 3
gen() 4
next(it) = 3
it:4
gen() 5
StopIteration.value = 2.1
it:5
StopIteration.value = None
it:6
例6:finally:中的代码段是必须执行的,所以生成器能返回3个值,此时在finally代码块中有return语句,所有退出生成器函数的返回值是第二个return的值 5.1。
def gen():
print("gen() 1")
yield 1
try:
print("gen() 2")
yield 2
print("gen() 3")
return 2.1
except Exception:
print("gen() Exception")
finally:
print("gen() 4")
yield 3
print("gen() 5")
return 5.1
print("gen() 6")
yield 4
print("gen() 7")
return 7.1
it = gen()
print(f"it type {type(it)}")
print("it:1")
for i in range(2, 7):
try:
print(f"next(it) = {next(it)}")
except StopIteration as e:
print(f"StopIteration.value = {e.value}") # 获取return的值
print(f"it:{i}")
输出:
it type <class 'generator'>
it:1
gen() 1
next(it) = 1
it:2
gen() 2
next(it) = 2
it:3
gen() 3
gen() 4
next(it) = 3
it:4
gen() 5
StopIteration.value = 5.1
it:5
StopIteration.value = None
it:6