python代码实践 | 函数与异常处理

python代码实践

03函数与异常处理

递归函数

$$
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所有的标准异常类

posted @ 2021-10-12 16:02  hardworkruok  阅读(66)  评论(0)    收藏  举报