"""
今日知识点:
0.sys模块--补充
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 # 补充: 3 sys模块 (建文件防止重命名) 系统(意思) 4 sys 功能: SYS可将当前驱动器上的DOS系统文件IO.SYS,MSDOS.SYS传送到指定的驱动器上,用于创建启动盘。 5 """ 6 import sys 7 # 求Python可支持的递归深度 8 print(sys.getrecursionlimit()) # 1000 # 结果不是很精确 9 # 自定义递归深度 10 sys.setrecursionlimit(200) # 不能高于最大值 11 print(sys.getrecursionlimit()) # 200
1.函数递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 函数的递归: 3 1.定义 4 1.函数在调用阶段直接或间接的调用自身 5 2.判断特点:调用自身 6 3.方法:直接调用 | 间接调用 7 4.必须条件,不应该无限循环下下去,需要有最终的结束条件 8 9 """ 10 ''' 11 # 函数自调用 12 def func(): 13 print('递归') 14 func() 15 func() 16 # 值: 17 RecursionError: maximum recursion depth exceeded while calling a Python object 18 # 递归错误:调用python对象时超过了最大递归深度 19 ''' 20 # 求递归深度方法 21 # 方法一 22 """ 23 import sys 24 # 求Python可支持的递归深度 25 print(sys.getrecursionlimit()) # 1000 # 结果不是很精确 26 # 自定义递归深度 27 sys.setrecursionlimit(200) # 不能高于最大值 28 print(sys.getrecursionlimit()) # 200 29 """ 30 31 ''' 32 # 方法二 33 def func(n): 34 print('n>>>:',n) 35 func(n+1) 36 func(1) # n 记得传参 37 38 # 值: 递归深度 == 998 # 之后报错 39 RecursionError: maximum recursion depth exceeded while calling a Python object 40 # 递归错误:调用python对象时超过了最大递归深度 41 ''' 42 ''' 43 # 函数不应该无限制的递归下去 44 def index(): 45 print('from index') 46 login() 47 48 def login(): 49 print('from login') 50 index() 51 52 login() 53 54 # 值 55 报错: 56 RecursionError: maximum recursion depth exceeded while calling a Python object 57 # 递归错误:调用python对象时超过了最大递归深度 58 ''' 59 """ 60 2.递归的过程: 61 递归分为两个阶段: 62 1.回溯:1.就是一次次重复的过程,这个重复的过程必须建立在,这个过程每次重复复杂度都会相应下降 2.直到有一个最终的结束条件 63 2.递推:一次次往回推导的过程 64 """ 65 # 案例: 66 # 递归函数 67 ''' 68 age(5) = age(4) + 2 69 age(4) = age(3) + 2 70 age(3) = age(2) + 2 71 age(2) = age(1) + 2 72 age(1) = 18 73 age(n) = age(n-1) + 2 # n > 1 74 age(1) = 18 # n = 1 75 ''' 76 def get_age(n): 77 if n == 1: 78 return 18 79 return get_age(n-1)+2 80 res = get_age(12) 81 print(res) # 40 82 83 def get_time(s): 84 if s == 1: 85 return 18 86 return get_time(s-1) - 1 87 res1 = get_time(4) 88 print(res1) # 15
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] 2 # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点) 3 # print(l[0]) # 1 4 # print(l[1][0]) # 2 5 # print(l[1][1][0]) # 3 6 # l2 = [] 7 # for i in l: 8 # if type(i) is int: 9 # l2.append(i) 10 # print(l2) 11 12 13 def get_list(l): 14 l1 = [] 15 for i in l: 16 if type(i) is int: 17 print(i) 18 l1.append(i) 19 else: 20 get_list(i) 21 22 res = get_list(l) 23 # print(res) 24 l2 = [] 25 l1 = [] 26 print(l) 27 for i in l1: 28 print(i) 29 30 #ps: 递归函数不要考虑循环的次数 只需要把握结束的条件即可********** 结束的条件
2.二分法
ps:容器里的数字必须有大小顺序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 算法:解决问题的高效率的方法 2 l = [1,3,5,12,57,89,101,123,146,167,179,189,345] 3 # num = 345 4 # for i in l: 5 # if num == i: 6 # print('1222234586') 7 #ps: 二分法:容器类型里面的数字必须有大小顺序 8 # target_num = 999 9 def get_num(l,target_num): 10 if not l: 11 print('无对比值,无法顺利工作') 12 return 13 else: 14 # 获取列表中间的索引 15 print(l) 16 middle_index = len(l) // 2 17 # 判断target_num 和l[middle_index] 数字的大小 18 if target_num > l[middle_index]: 19 # 窃取列表右半部分 20 num_right = l[middle_index + 1:] # 后半部分 21 # 再递归调用get_num函数 22 get_num(num_right, target_num) 23 elif target_num < l[middle_index]: 24 num_left = l[0:middle_index] # 前半部分 25 # 再递归调用get_num函数 26 get_num(num_left, target_num) 27 else: # == 28 print('find it',target_num) 29 30 res = get_num(l,target_num=345) 31 print(res) 32 ''' 33 # 值 34 [1, 3, 5, 12, 57, 89, 101, 123, 146, 167, 179, 189, 345] 35 [123, 146, 167, 179, 189, 345] 36 [189, 345] 37 find it 345 38 None 39 '''
3.三元表达式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def my_max(x,y): 2 if x > y: 3 return x 4 else: 5 return y 6 """ 7 当x大的时候返回x当y大的时候返回y 8 当某个条件成立做一件事,不成立做另外一件事 9 """ 10 x = 99999 11 y = 9898898 12 res = x if x > y else y 13 # 如果if后面的条件成立返回if前面的值 否则返回else后面的值 14 print(res) 15 16 17 """ 18 三元表达式固定表达式 19 值1 if 条件 else 值2 20 条件成立 值1 21 条件不成立 值2 22 """ 23 # x = 1 24 # y = 2 25 # m = 3 26 # n = 4 27 # res = x if x > y else (m if m >n else (...)) 28 29 # 三元表达式的应用场景只推荐只有两种的情况的可能下 30 # is_free = input('请输入是否免费(y/n)>>>:') 31 # is_free = '免费' if is_free == 'y' else '收费' 32 # print(is_free) 33 34 35 # username = input('username>>>:') 36 # res = 'NB' if username == 'jason' else '垃圾' 37 # print(res)
4.列表生成式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 列表生成式 [列表值,for循环条件] 2 3 l = ['tank','nick','oscar','sean'] 4 l1 = [] 5 for name in l: 6 # 加后缀的两种方式 7 l1.append('%s_sb'%name) 8 l1.append(name + '_sb') # 加后缀 9 print(l1) 10 11 l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'] 12 # 列表生成式: 13 res = ['%s_DSB'%name for name in l] 14 print(res) # ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB', 'jason_NB_DSB'] 15 16 res1 = [name for name in l if name.endswith('_sb')] # 后面不支持再加else的情况 17 # 先for循环依次取出列表里面的每一个元素 18 # 然后交由if判断 条件成立才会交给for前面的代码 19 # 如果条件不成立 当前的元素 直接舍弃 20 21 print(res1) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
5.字典生成式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 字典生成式 列表与for生成字典 2 3 # l1 = ['name','password','hobby'] 4 # l2 = ['jason','123','DBJ','egon'] 5 # d = {} 6 # for i,j in enumerate(l1): 7 # d[i] = l2[i] 8 # print(d) # {0: 'jason', 1: '123', 2: 'DBJ'} 9 10 l1 = ['jason','123','read'] 11 # 字典生成式格式 12 d = {i:j for i,j in enumerate(l1) if j != '123'} 13 print(d) # {0: 'jason', 2: 'read'} 14 15 res = {i for i in range(10) if i != 4} 16 print(res) 17 res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式 18 # print(res1) 19 # for i in res1: 20 # print(i)
6.匿名函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 匿名函数: 3 特性: 4 1.没有名字函数 5 2.临时存在用完就没了 6 7 """ 8 # 正常函数 9 def func(x,y): 10 return x,y 11 # 匿名函数 12 ''' 13 1.省略 def 14 2.用lambda代替函数名 15 3.return x+y 省略 用: x+y 16 ''' 17 # 格式: 18 res = (lambda x,y:x+y) 19 # print(res) 20 print(res(1,2)) # 3 21 22 # ps: 23 # 1.:左边的相当于函数的形参 24 # 2.:右边的相当于函数的返回值 25 # 3.匿名函数通常不会单独使用,是配合内置函数一起使用
7.常用内置函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 1.max() # 求最大值 2 l = [1,2,3,4,5] 3 print(max(l)) # 内部是基于for循环的 # 5 4 # 2.min() # 求最小值 5 print(min(l)) # 1 6 # 3.chr() 将数字转换成ascii码表对应的字符 # a 7 # A-Z 65 90 8 # a-z 97 122 9 # 4.zip()拉链 10 l1 = [1,2,3] 11 l2 = ['jason','egon','tank'] 12 l3 = ['a','b','c'] 13 print(list(zip(l1,l2,l3))) # [(1, 'jason', 'a'), (2, 'egon', 'b'), (3, 'tank', 'c')] 14 # 5.filter() 过滤 15 l = [1,2,3,4,5,6] 16 print(list(filter(lambda x:x != 3,l))) # 基于for循环 #[1, 2, 4, 5, 6] 17 # 6.sorted() 排序 18 l = ['jason','egon','nick','tank'] 19 # reverse # 颠倒 20 print(sorted(l,reverse=False)) #['egon', 'jason', 'nick', 'tank'] 21 # reverse= True['tank', 'nick', 'jason', 'egon'] 22 # 7.reduce() 求列表的运算 23 from functools import reduce 24 l = [1,2,3,4,5,6] 25 print(reduce(lambda x,y:x+y,l,18)) # 39 26 # 8.map() # 映射 27 l = [1,2,3,4,5,6] 28 # print(list('hello')) 29 print(list(map(lambda x:x+5,l))) # 基于for循环 # [6, 7, 8, 9, 10, 11]
"""