函数递归 三元表达式 匿名函数 函数内置方法
递归函数
定义:任何函数在调用自己的情况下 就叫递归 函数在调用的时候可以直接性或者间接性的调用自己.但是他不能无限制的调用下去 也不应该无限制的调用下去
递归分为两个阶段,递推和 回溯 (回溯就像while循环一样一直重复下去 但是每一次重复 都要建立在上一次循环的基础上 减小目标难度)
递归的递推:递归每一次都是基于上一次进行下一次的执行。
递归的回溯:当遇到终止条件,则从最后往回一级一级的把值返回来。
递归函数调一般 用自身去解决一个规模比原始问题要小一些的问题。
一个简单的递归 因为说过函数不能无限的递归小下去 所以 他的范围在 997-998之间
下面是一个回溯和递推的展示:
def age(n): if n == 1: return 18 return age(n-1) + 2 print(age(5))
#age(5) = age(4) +2 第一次进入
#age(4) = age(3) +2 第二次进入
#age(3) = age(2) +2 第三次进入
#age(2) = age(1) +2 第四次进入
#age(1) = 18 第五次进入,此时达到结束的条件,递归终止
这是一个典型的递归递推算法,它的每一次执行都是基于上一次的结果。
总结:递归必须要有一个明确的结束条件, 否则就变成死循环导致栈溢出,以上两例都是以“if”语句作为结束条件的。每递归一次要解决一些事情,否则就失去了递归的意义。
算法之二分算法:什么是算法 算法就是一个可以提高解决问题效率的方法
二分算的就是 快速寻找你想在一个容器类型里寻找的值 容器里面必须有大小顺序 假如你想寻找一个列表里的值 可以使用for循环的遍历来实现 但是效率太慢
就好比说我想在一个 有10000个数字的列表里找最后一个数字 那么就需要循环10000次 这样就需要用到二分算法
l = [1,3,5,12,57,89,101,123,146,167,179,189,345] target_num = 666 def get_num(l,target_num): if not l: print('不在数字内') return # 获取列表中间的索引 print(l) middle_index = len(l) // 2 # 判断target_num跟middle_index对应的数字的大小 if target_num > l[middle_index]: # 切取列表右半部分 num_right = l[middle_index + 1:] # 再递归调用get_num函数 get_num(num_right,target_num) elif target_num < l[middle_index]: # 切取列表左半部分 num_left = l[0:middle_index] # 再递归调用get_num函数 get_num(num_left, target_num) else: print('find it',target_num) get_num(l,target_num)
三元表达式 其实就是把很简单的逻辑判断 不值得写那么多行的if else 简化成一行 固定表达方式 :
三元表达式固定表达式 值1 if 条件 else 值2 条件成立 值1 条件不成立 值2
列表生成式:列表生成式作用是用来生成列表的,那么其特点也肯定是使用“[]”来去表示的 也是把简单的代码写成一行例子:
假如我们这里需要创建一个列表 和a列表对比 如果在a里面 我们打印他
他其实就相当于:
a=[1,2,5,7] for b in list(range(1,10)): if b in a: print(b)
补充
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断 条件成立才会交给for前面的代码
# 如果条件不成立 当前的元素 直接舍弃
同样 集合也可以这样使用:
res = {i for i in range(10) if i != 4} print(res)
但是使用()号的话返回的不是元组 而是一个地址 叫生成器 需要用for循环来打印
res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成 print(res1) for i in res1: print(i)
字典也可以这样使用:
l1 = ['name','password','hobby'] d = {i:j for i,j in enumerate(l1) if j != '123'} 返回的是一个字典 {index:他的一个值}
匿名函数:没有名字的函数 主要起到临时存在.用lambda
func = lambda x,y:x+y print(func(1,2))
也可以直接传值
res = (lambda x,y:x+y)(1,2)
print(res)
# :左边的相当于函数的形参 # :右边的相当于函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用
常用的内置函数
max() 求最大值 内部是基于for循环 min() 求最大值 内部是基于for循环
chr ()查看数字对应的 A-Z a-z
map() 映射 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
zip 拉链 基于for循环 把两个 不同的列表 都一一对应的放在一个元组里面 最后打包成一个列表 元组个数取决于 最短的那个列表
stored() stored(列表 , reverse=True) 给列表排序
from functools import reduce
from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,l,19)) # 19初始值 第一个参数 # 当初始值不存在的情况下 按照下面的规律 # 第一次先获取两个元素 相加 # 之后每次获取一个与上一次相加的结果再相加