递归
- 递归必须要有边界条件,即停止递归的条件
- 以斐波那契数列为例,出口就是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='')