try/except/else/finally中return出现位置与执行观察

例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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容