2.7 递归函数
如果一个函数在内部调用自身本身, 这个函数就是递归函数
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print(fact(5))阶乘迭代函数 函数内部调用函数本身
可以根据函数定义看到计算过程如下:
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
递归函数的优点就是定义简单,逻辑清晰。理论上 所有递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰
使用递归函数需要注意防止溢出,在计算机中,函数调用时通过stack这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层,由于栈的大小不是无限的 所以递归调用次数过多 对导致益处
上面fact(n)函数由于return n*fact(n-1) 引入了乘法表达式,所以就不是尾递归了。
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)
可以看到,return fact iter(num-1,num*product)仅返回递归函数本身,num-1和num*product在函数调用前就会被计算,不影响函数调用
fact(5)对应的fact liter(5,1)调用如下
===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120
尾部调用时 如果做啦优化 栈不会增长 因此 无论调用也不会导致栈益处
小结
使用的递归函数的优点是逻辑简单清晰 缺点是过深的调用会导致溢出
针对尾递归优化的语言可以通过尾递归防止栈溢出 没有循环语句的编程语言智能通过尾递归实现循环
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在溢出的问题
2.8 匿名函数
2.8.1 定义
用lambda 关键词能创建小型匿名函数, 这种函数得名于省略了用def声明函数的标准步骤
lambda 函数的语法只包含一个语句
lambda[arg1,[,arg2....argn]]:expression
sum = lambda a1, a2: a1 * a2
# 调用sum函数
print("Value of total : ", sum(10, 20))
print("Value of total : ", sum(20, 20))
Lambda 函数能接收任何数量的参数但智能返回一个表达式的值
匿名函数不能直接调用Print 因为lambda需要一个表达式
2.8.2 应用场合
自己定义函数作为参数传递
def fun(a, b, opt):
print("a =", a)
print("b =", b)
print("result =", opt(a, b))
fun(1, 2, lambda x, y: x + y)
例2:作为内置函数的参数
stus = [
{"name":"zhangsan", "age":18},
{"name":"lisi", "age":19},
{"name":"wangwu", "age":17}
]
stus.sort(key=lambda x: x['name'])
print(stus)
key=lambda x:x['names']
按照age排序:
stus = [
{"name":"zhangsan", "age":18},
{"name":"lisi", "age":19},
{"name":"wangwu", "age":17}
]
stus.sort(key=lambda x: x['age'])
print(stus)
3.文件操作
3.1 打开与关闭
3.1.1 打开文件
在python中,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
f=open("test.txt","w")
访问模式说明
r:以只读的方式打开文件,文件的指针会放在文件的开头,这是默认模式
w:打开一个文件只用于写入。如果该文件已存在则将其覆盖,如果改文件不存在则创建新文件
3.1.2 关闭文件
close()
示例如下
# 新建一个文件,文件名为:test.txt
f = open('test.txt', 'w')
# 关闭这个文件
f.close()
next#3.2 文件的读写