当前位置:   article > 正文

Python之递归函数、算法、生成式、表达式初步了解_python的递推和回溯

python的递推和回溯

递归函数

递归:直接或者间接的调用其他函数

递归的使用场景:

1. 递推
        一层一层的往下寻找答案
2. 回溯
        通过最后一个结果往回寻找最开始的那个答案
        
    递归是必须有结束条件!!!!

  1. # 使用代码实现以上逻辑
  2. def age(n):
  3. if n == 1:
  4. return 18
  5. # age(5) = age(4) + 2
  6. # age(4) = age(3) + 2
  7. return age(n-1) + 2 # n=2---》age(1)---->age(2)----->age(3)。。。
  8. res=age(5) # 求第5个人的年龄
  9. print(res)
  10. #### 递归实现
  11. def get_list(l):
  12. for i in l:
  13. if type(i) is int:
  14. print(i)
  15. else:
  16. get_list(i)
  17. get_list(l)

Python算法初步了解

算法:就是解决问题的高效办法

算法常见类型有二分法、冒泡排序、选择排序、堆排序、等

二分法的使用场景:让你在一个列表中查找某个数字是不是存在

二分法的原理:
    1. 列表必须先排序(从小到大,从大到小)
    2. 折半查找

思路:
    遍历列表l一个一个去比较,如果比较到了,就是找到了,否则,就是没找到

例:找66这个数字是否在列表 l 中

l = [11, 2, 3, 43, 55, 67, 23, 45, 45, 88, 99, 66,]

  1. 代码实现二分法(Python代码):
  2. l = [11, 2, 3, 43, 55, 67, 23, 45, 45, 88, 99, 66,]
  3. # l = ['kevin', 'jerry', 'tank', 'abc']
  4. # 1. 排序
  5. l.sort()
  6. # ['abc', 'jerry', 'kevin', 'tank']
  7. # print(l) # [2, 3, 11, 23, 43, 45, 45, 55, 66, 67, 88, 99]
  8. # 2. 去列表的中间那个值,然后给66比较
  9. target_num = 200
  10. def my_half(l,target_num):
  11. if len(l) == 0:
  12. print('没找到')
  13. return
  14. # 3. 取的就是中间的那个索引
  15. middle_index = len(l) // 2 # 向下取整 5 // 2 == 2 6 // 2 == 3
  16. if target_num > l[middle_index]:
  17. l_right = l[middle_index+1:] #
  18. print(l_right)
  19. my_half(l_right, target_num)
  20. elif target_num < l[middle_index]:
  21. l_left = l[:middle_index]
  22. print(l_left)
  23. my_half(l_left, target_num)
  24. else:
  25. print('找到了')
  26. my_half(l, target_num)

三元表达式

语法结构:
        res = 条件成立之后的结果 if 条件 else 条件不成立之后的结果

对于只有二选一的情况,我们推荐使用三元表达式

例:比较a和b大小

  1. def my_max(a, b):
  2. return a if a > b else b
  3. res = my_max(1, 2)

列表生成式

例:把列表中得每一个名字后面都拼上后缀_SB

names_list = ['kevin', 'jerry', 'tank', 'oscar']

  1. 把列表中得每一个名字后面都拼上后缀_SB
  2. # names_list = ['kevin', 'jerry', 'tank', 'oscar']
  3. # 把列表中得每一个名字后面都拼上后缀_SB
  4. new_list = [] # 存放拼接之后的人名
  5. for name in names_list:
  6. res = '%s_SB' % name
  7. res = name + '_SB'
  8. new_list.append(res)
  9. print(new_list) # ['kevin_SB', 'jerry_SB', 'tank_SB', 'oscar_SB']
  10. # 列表生成式
  11. res = [ name + '_SB' for name in names_list]
  12. print(res)

 

例:把列表中得每一个名字后面都拼上后缀_SB,除了 jerry 外

names_list = ['kevin', 'jerry', 'tank', 'oscar']

  1. names_list = ['kevin', 'jerry', 'tank', 'oscar']
  2. # 列表中得每一个名字都拼接上后缀:_SB,除jerry之外
  3. new_list = []
  4. for name in names_list:
  5. if name == 'jerry':
  6. new_list.append(name)
  7. continue
  8. else:
  9. new_list.append(name+'_SB')
  10. print(new_list)
  11. # 列表生成式如何写
  12. # res = [name+'_SB' for name in names_list if name != 'jerry' ]
  13. res = [name+'_SB' if name != 'jerry' else name for name in names_list]
  14. print(res)

字典生成式、集合生成式(了解)

例:把L1,L2拼接成字典形式L1为key值,L2为value值

  1. l1 = ['name', 'age', 'gender']
  2. l2 = ['oscat', 18, 'male']
  3. #d= {'name':oscat, age:18, 'gender':'male'}
  4. d = {}
  5. for i in range(len(l1)):
  6. d[l1[i]] = l2[i]
  7. print(d) # {'name': 'oscat', 'age': 18, 'gender': 'male'}

使用enumarate拼接L1,L2

  1. for i, j in enumerate(l1):
  2. # # (0, 'name')
  3. # # (1, 'age')
  4. # # (2, 'gender')
  5. print(i, j)
  6. d = {l1[i]:l2[i] for i, j in enumerate(l1)}
  7. print(d) # 0: 'name', 1: 'age', 2: 'gender'}

特别注意:没有元组生成式

  1. s = {i for i, j in enumerate(l1)} # 生成器
  2. print(s)
  3. t = (i for i, j in enumerate(l1))
  4. print(t)

END

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/868159
推荐阅读
相关标签
  

闽ICP备14008679号