Python函数进阶
一.递归函数
递归:函数在运行过程中 直接或者间接的调用了自身 递归一定要有结束条件。
官网表示:Python的默认的最大的递归深度为1000次
1 l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]] 2 def outer(l): 3 for i in l: 4 if type(i) == int: 5 print(i) 6 else: 7 outer(i) 8 9 10 outer(l)
递归函数分为
1.递推:一层层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
2.回溯:依据最后的结论往后推导出最初需要的答案
二.算法之二分法
2.1 什么是算法
解决问题的高效方法
2.2 二分法
第一种方式 直接for循环从左往右依次查找
1 while True: 2 number = input('请输入您要查找的数字').strip() 3 number = int(number) 4 if number not in l: 5 print('暂无此数据') 6 else: 7 for i in l: 8 if i == number: 9 print('找到了')
第二种方式 二分法(一 数集;二 必须有序)
1 def outer(target_number, l): 2 if len(l) == 0: 3 print('无此数据') 4 return 5 # 获取中间元素的索引值 6 midle_numebr = len(l) // 2 7 # 以中间函数为分界线对l进行切片 8 if target_number > l[midle_numebr]: 9 l_right = l[midle_numebr + 1:] 10 outer(target_number, l_right) 11 elif target_number < l[midle_numebr]: 12 l_left = l[:midle_numebr] 13 outer(target_number, l_left) 14 else: 15 print(target_number, '找到了')
三.三元表达式
当功能需求仅仅是二选一的情况下,那么推荐使用三元表达式
1 def my_max(a, b): 2 if a > b: 3 return a 4 else: 5 return b
条件成立采用if前面的值,if条件不成立采用else后面的值
1 def my_max(a, b): 2 return a if a > b else b
四.列表生成式
1 name_list = ['jason', 'kevin', 'tony', 'jerry'] 2 # 给列表中所有的人名加上_DSB后缀 3 '''传统做法''' 4 # 1.定义一个空列表 5 new_list = [] 6 # 2.for循环老列表 7 for name in name_list: 8 # 3.生成新的名字 9 new_name = '%s_DSB'%name 10 # 4.添加到新的列表中 11 new_list.append(new_name) 12 print(new_list) 13 '''列表生成式''' 14 res = ['%s_DSB' % name for name in name_list] 15 print(res)
五.字典生成式
1 # 字典生成式 2 l1 = ['name', 'age', 'hobby'] 3 l2 = ['jason', 18, 'read'] 4 for i, j in enumerate(l1, start=1): 5 print(i, j) 6 """ 7 1 name 8 2 age 9 3 hobby 10 11 enumerate() 12 针对该方法使用for循环取值 每次都会产生两个结果 13 第一个是从零开始的数字 14 第二个是被循环对象里面的元素 15 还可以通过start控制参数其实位置 16 """ 17 18 name_list = ['jason', 'kevin', 'tony', 'jerry'] 19 res = {i: j for i, j in enumerate(name_list)} 20 print(res)
六.匿名函数
1 # 字典生成式 2 l1 = ['name', 'age', 'hobby'] 3 l2 = ['jason', 18, 'read'] 4 for i, j in enumerate(l1, start=1): 5 print(i, j) 6 """ 7 1 name 8 2 age 9 3 hobby 10 11 enumerate() 12 针对该方法使用for循环取值 每次都会产生两个结果 13 第一个是从零开始的数字 14 第二个是被循环对象里面的元素 15 还可以通过start控制参数其实位置 16 """ 17 18 name_list = ['jason', 'kevin', 'tony', 'jerry'] 19 res = {i: j for i, j in enumerate(name_list)} 20 print(res)