python代码实践 | 函数与异常处理
03函数与异常处理
递归函数
$$
fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
$$
fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n
$$
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
print(fact(5));
out>>>>120
递归函数的优点是定义简单,逻辑清晰,但要注意防止栈溢出。
尾递归——可以优化栈溢出
在函数返回的时候,调用自身本身,并且, return 语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
def fact(n):
return fact_iter(n,1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
print(fact(5));
out>>>>120
return fact_iter(num - 1, num * product)仅返回递归函数本身
-
针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。
-
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
局部变量与全局变量
<!--变量无需print就可以直接输出-->
局部变量
def show():
sal = 15000
print("xinzi:", sal)
show()
out>>>>>xinzi: 15000
全局变量
money = 1200
def test1():
print(money)
def test2():
print(money)
test2()
test1()
out>>>>1200
1200
当局部变量与全局变量有相同命名时,函数优先使用的是局部变量,全局变量不会发生变化。
#全局与局部的冲突
x = 100
def test1():
x = 300
print('---test1---%d'%x)
x = 200
print('x = %d'%x)
def test2():
print('x = %d'%x)
test1()
test2()
>>>>>>>>out>>>>>>
---test1---300
x = 200
x = 100
修改全局变量:用GLOBAL修改
x = 100
def test1():
global x
print('修改前:%d'%x)
x = 200
print('修改后:%d'%x)
def test2():
print('x = %d'%x)
test1()
test2()
>>>>>out>>>>>
修改前:100
修改后:200
x = 200
利用try...except...finally....来处理可能会出错的代码
-
except 可以来捕获不同类型的错误,如果没有错误,可以在except语句后面加一个else。
-
python的错误也是一个class,所以使用except的时候,会把BaseException及其子类都捕获。
-
可以跨越多层调用,减少麻烦。
常见的错误类型和继承关系看这里: https://docs.python.org/3/library/exceptions.html#exception-hierarchy
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
>>>>>>out>>>>>>
try...
result: 5.0
no error!
finally...
END
#感觉错误语句放在try
#except用来根据错误类型进行输出
try:
print("这是try里面")
r = 10/0
print("结果",r)
# ZeroDivisionError 范围小
except Exception as e :
print("这里是另一个except",e)
except ZeroDivisionError as e:
print("这里是except",e)
#Exception 范围 捕捉不到了
finally:
print("结束")
print("这里还能执行")
>>>>>out>>>>>
这是try里面
这里是另一个except division by zero
结束
这里还能执行
python所有的标准异常类

浙公网安备 33010602011771号