函数的调用时通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,当递归调用次数过多,会导致栈溢出。
解决递归调用栈溢出的方法是通过尾递归优化。
尾递归是指,在函数返回的时候,调用自身本身。并且return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
python异常处理
#当程序有错误时,错误处理器将错误的位置打印出来。
import sys
try:#所有可能引发错误的语句放在try块中,在except从句/块中处理所有的错误和异常
s=input('Enter something-->')
except EOFError: #处理单一的错误和异常
print('Why did you do an EOF on me')
sys.exit()
except:#处理所有的错误和异常
print('Some erroe')
finally:
print('OK')#异常无论发生与否,都会执行
print('Done')
标准库
import sys
print(sys.argv[0])#当前运行程序的名称,命令行参数
#os模块包含了普遍操作系统功能
##sys模块包含系统对应的功能
import os
name=12
print(os.name) #nt:代表正在使用的平台是window
print(os.getcwd()) #当前的工作目录
##print(os.putenv()) #设置环境变量
path=os.getcwd()
file=os.listdir(path)#返回指定目录下的所有文件和目录名
print(file)
#os.remove('poem.txt')#删除一个文件
print(os.linesep)
print(os.path.split(path))#('E:\\language\\sublime', 'python') 返回一个路径的目录名和文件名
b1=os.path.isfile(path)#判断路径是否为文件
b2=os.path.isdir(path)#判断路径是否是目录
b3=os.path.exists(path)#检验给出的路径是否真的存在
print(b1,b2,b3)
函数接收元组和列表
#综合列表
listone=[1,2,3,4,5,6,7]
listtwo=[2*i for i in listone if i>2]#原来的列表没有发生变化,综合列表使用精确的方法完成相同的工作
print(listtwo)
#在函数中接收元组和列表,在函数接收元组或字典形式的参数时
def powersum(power,*args):#args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中,
#使用**前缀,多余的参数则会被认为是一个字典的键值对
total=0
for i in args:
total+=pow(i,power)
return total
res1=powersum(2,3,4)
res2=powersum(2,10)
print(res1,res2)