Python基础:递归、变量作用域和异常

递归

  • 递归必须要有边界条件,即停止递归的条件
  • 以斐波那契数列为例,出口就是0或1时
def fib(n):
    if n == 0 or n == 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)
def hanoi(a,b,c,n):
    if n == 1:
        print(a,'->',c)
    else:
        hanoi(a,c,b,n-1)#借由c先移动到b上
        print(a,'->',c)
        hanoi(b,a,c,n-1)#出口是n=1时
def foo(num,base):
    if num >= base:
      foo(num // base, base)
    print(num % base, end = ' ')
foo(126,2)
1 1 1 1 1 1 0

变量作用域

全局变量
  • 在程序代码主体部分的是全局变量
  • 全局变量和局部变量用同一个名字,遵循内层屏蔽外层原则
  • 对于一个全局变量修改它的值不能在函数中进行
a = 3
def f():
    a = 5
    print(a ** 2)
25
  • global语句强调全局变量
def f(x):
    global a
    print(a)
    a = 5
    print(a + x)
a = 3
f(8)
print(a)
3
13
5
局部变量
  • 在函数中的变量是局部变量

异常

在这里插入图片描述
在这里插入图片描述

异常处理
  • try-except捕捉异常:首先,执行try子句(在关键字try和关键字except之间的语句),如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码。如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
>>> try:
	f = open('我为什么是一个文件')
	print(f.read())
	f.close()
except OSError:
	print('文件出错啦!')

	
文件出错啦!
  • try-except语法
try:
	raise
except Exceetion as err:
	print(err)
try:
    num1 = int(input('enter the first number:'))
    num2 = int(input('enter the second number:'))
    print(num1 / num2)#检测语句块
except ValueError:#异常类名
    print('Please input a digit!')#异常处理
  • 多个except子句和一个except块捕捉多个异常
try:
    num1 = int(input('enter the first number:'))
    num2 = int(input('enter the second number:'))
    print(num1 / num2)
except ValueError:
    print('Please input a digit!')
except ZeroDivisionError:
    print('The second number cannot be zero!')
try:
    num1 = int(input('enter the first number:'))
    num2 = int(input('enter the second number:'))
    print(num1 / num2)
except (ValueError,ZeroDivisionError):
    print('Please input a digit!')
  • 捕捉所有异常
try:
    num1 = int(input('enter the first number:'))
    num2 = int(input('enter the second number:'))
    print(num1 / num2)
except Exception as err:
    print('Something went wrong!')
    print(err)
  • 可以加入else子句
try:
    num1 = int(input('enter the first number:'))
    num2 = int(input('enter the second number:'))
    print(num1 / num2)
except Exception as err:
    print('Something went wrong!')
    print(err)
else:
    print('everything is OK!')
  • 利用循环处理
while True:
    try:
        num1 = int(input('enter the first number:'))
        num2 = int(input('enter the second number:'))
        print(num1 / num2)
        break
    except Exception as err:
        print('Something went wrong!')
        print(err)
    else:
        print('everything is OK!')
  • finally子句如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。(finally以后的代码无论如何都会被执行)
  • 上下文管理器(Context Manager)和with语句
try:
    f = open('data.txt')
    for line in f:
        print(line,end='')
except IOError:
    print('cannot open the file!')
finally:
    f.close()
#文件是否正常打开都对它进行关闭,当文件不能打开时会出错
with open('data.txt') as f:#把上下文管理表达式的值赋给变量
    for line in f:
        print(line,end='')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值