Python教程

python递归,二分法以及生成式

本文主要是介绍python递归,二分法以及生成式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 递归函数
  • 算法之二分法
  • 三元表达式
  • 列表生成式
  • 字典生成式

递归函数

# 递归:在函数运行的过程中,直接或者间接调用了自身
官网表示:python默认最大递归深度为1000次
更改默认设置:
  # import sys
  # print(sys.getrecursionlimit())
  # print(sys.setrecursionlimit(2000))
  
'''
递归
  1.递推:一层一层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
  2.回溯:依据最后的结论推导出最初需要的答案
  递归一定要有结束条件.
'''
伪代码:可能无法运行,但是可以表述逻辑
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18
使用递归推导
def data(n):
  if n == 1:
    return 18
  return data(n - 1) + 2
print(data(5))

再列举:
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
将l列表中的数据依次打印出
def data(l):
  for i in l:
    if type(i) is int:
      print(i)
    else:   
      data(i)
data(l)

算法之二分法

什么是算法?
解决问题的搞笑方法
# 二分法(离入门级别的都还有一定的距离)
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
'''二分法使用的前提:数据集必须有序'''
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
def data(target, l):
    if len(l) == 0:
        print('取得值不再列表中')
        return
    centre = len(l) // 2
    if target > l[centre]:
        right = l[centre + 1:]
        print(right)
        data(target, right)
    elif target < l[centre]:
        real_right = l[:centre]
        print(real_right)
        data(target, real_right)
    else:
        print('在了', target)
data(321, l )
# 如果要好的元素在开头,效率没有依次查找高

三元表达式

'''当功能需求仅仅是二选一的情况,推荐使用三元表达式'''
# 条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
# 值 if 条件 else 值
res = '学习' if 1 < 2 else '周五通宵学python'
print(res)
res = '干饭' if 10 > 2 else ('不管饭' if 2 >5 else '写的啥!')
print(res)
# 实际应该
username = input('username>>>:')
res = 'NB' if username == 'jason' else 'SB'
print(res)

列表生成式

name_list = ['junjie', 'junjie1', 'junjie2']
# 给列表中的人名加上后缀 nb
# 传统做法
new_list = []
for name in name_list:
    new_name = '%s_nb' % name
    new_list.append(new_name)
print(new_list)

# 列表生成式
res = ['%s_nb' % name for name in name_list]
print(res)

# 1.定义一个空列表
# new_list = []
# # 2.for循环老列表
# for name in name_list:
#     # 3.生成新的名字
#     if name == 'jason':
#         continue
#     else:
#         new_name = '%s_DSB'%name
#         # 4.添加到新的列表中
#         new_list.append(new_name)
# print(new_list)
'''列表生成式'''
# res = ['%s_DSB' % name for name in name_list if name != 'jason']
# print(res)

字典生成式

l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
new_list = {j: l2[i] for i, j in enumerate(l1)}
print(new_list)
# 将两个列表合并成一个字典.

枚举
'''
enumerate()
针对这个方法使用for循环,每次会产生两个结果
第一个是从0开始的数字
第二个是被循环对象里面的元素
还可以通过start参数控制起始位置
'''
for i, j in enumerate(l1, start=1):
  print(i, j)

# eg:
name_list = ['jason', 'kevin', 'tony', 'jerry']
# res = {i: j for i, j in enumerate(name_list) if j != 'jason'}
# print(res)

{1: 'kevin', 2: 'tony', 3: 'jerry'}

溜了溜了

这篇关于python递归,二分法以及生成式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!