无聊学习Python笔记9.14

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 文件的读写


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值