递归
递归就是按照一系列相同的步骤做一件事 例如询问年龄,问 a 年龄 a 说 a比b大2岁 这样一说当然会去问b,b也说 b比c大2岁以此类推c,d都说比后面的大2岁,直到问道了e,e说他20,那么按照刚才的推理过程在返回去,自然能退出a是28岁
这个过程就是一个很明显的递归过程,其中,询问年龄的过程就是回溯,得到e结果之后的推算a的过程就是递推
回溯:一次次的冲福某一个同样的动作,这个重复的动作必须的是一样的,类似刚才的都大2岁
递推:一次次的反推的过程
def my_age(n): if n == 1: return 30 return my_age(n-1)+2 print(my_age(5)) 38 n等于1 就是相当于 问到e同学是30岁 之后一步步回推 递加2 递加4次则得出 第五次是38
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点) for i in l: 推导思路 if type(i) is int: print(i) else: for item in i: if type(item) is int: print(item) else: for j in item: if type(item) is int: print(item) else: ... # 相当于pass 不报错 顶包 推荐使用pass 这样子做的弊端就是要取出多少数据,就要重复多少次,这样首先造成了代码的冗余,其次就是太low
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] def get_num(l): for i in l: if type(i) is int: print(i) else: get_num(i) get_num(l) l1 = [] for i in l1: print(i)
算法:二分法
算法:可以高效的解决问题 注意 二分法容器类型必须是有大小顺序的 如原来列表是无序的那么要先排序
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的另外一种形式 (一行实现if代码)
应用场景:只有两种结果的情况 不支持嵌套 就是当值1成立 的时候就执行条件1 否则就是执行值2
写法 值1 if条件 else 值2
条件成立走1 不成立走2
lis = ['林xx','苏xx'] print(lis,'可以是其他任何名字') name = input('输入一个名字>>>:') res = '长得丑' if name in lis else '长得帅' print(res)
列表生成式
先for循环以依次取出列表内部的元素
进行if判断 条件成立将结果交给for之前的代码,条件不成立 当前元素 直接不要了
写法 变量名 for 变量名 in 列表名 if 变量名 判断条件 后面不支持加else
如果上述结果需要输出就整体附一个变量名打印一下
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'] res = [name for name in l if name.endswith('_NB')] print(res) # ['jason_NB']
字典生成式
l1 = ['jason','123','read'] d = {i:j for i,j in enumerate(l1) if j != '123'} print(d)
与列表不同的是
括号的使用是{}
for之前的是键值对形式 原理都是先for循环取值 在根据条件将值交给for之前的
匿名函数
正如这个函数的名字一样,他是一个没有名字的函数 还有就是他使用了马上就没了 只有用的时候才存在
写法 (lambda 值1,值2:值1 条件 值2)(参数1,参数2) 附一个变量名打印
两个数相加
res = (lambda x,y:x+y)(1,2) print(res) func = lambda x,y:x+y print(func(1,2))
# 冒号 左边的相当于函数的形参
# 冒号 右边的相当于函数的返回值
# 匿名函数通常不会单独使用,是配合内置函数一起使用
dic = {
'eee':10000,
'jasom':1000,
'nice':100,
'tura':10
}
# 比较 他们的value 取出他们的key值
print(max(dic,key=lambda name:dic.get(name))) # eee
print(min(dic,key=lambda name:dic.get(name))) # tura
常用内置函数
内置函数,就是pycharm已经包装好的函数,当python解释器打开的时候就可以直接调用了
常用的几个内置函数 map zip filter sortted reduce
map 映射 列表内每一个元素都发生变化 基于for循环 先将每一个元素遍历出来
l = [1,2,3,4,5,6] # print(list('hello')) print(list(map(lambda x:x+5,l))) # 将每个元素+6
zip 拉链 列表
l1 = [1,2,] l2 = ['jason','egon','tank'] l3 = ['a','b','c'] print(list(zip(l1,l2,l3))) # [(1, 'jason', 'a'), (2, 'egon', 'b')] 将三个列表的值以元组的形式按照所用放在一起 但是发现l1中只有两个元素 所以他会将三个列表中都有对应值的组合在一起 没有的直接不要了
filter
l = [1,2,3,4,5,6] print(list(filter(lambda x:x != 3,l))) # [1, 2, 4, 5, 6] 首先是基于for循环的 将等于3 的那个元素剔除
sorted 排序
l = ['jason','egon','nick','tank'] print(sorted(l,reverse=True)) # ['tank', 'nick', 'jason', 'egon'] 默认是升序 当reverse=Ture是 改为降序
reduce
# 当初始值不存在的情况下 按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加
from functools import reduce l = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,l,19)) # 19初始值 第一个参数