递归函数与列表、字典生成式

今日内容概要

  • 递归函数
  • 算法(二分法)
  • 三元表达式
  • 列表生成式
  • 字典生成式
  • 匿名函数
    image

内容详细

递归函数
"""
递归:
	函数在运行过程中 直接或间接调用了自身
"""

# 5*4*3*2*1的执行
def get_age(n):
    if n == 1:
        return 1
    return get_age(n - 1) * n
print(get_age(5))

"""
递归的执行顺序:
	1.递推:
		一层层往下(后)推导答案(每次递归之后复制度相较于上一次一定要有所下降)
	2.回溯:
		依据最后的结论往后推导出最初需要的答案
		
		'递归一定要有结束条件'
"""



eg;
推导第一人年龄 从后往前年龄依次加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 get_age(n):
    if n == 1:
        return 18
    return get_age(n - 1) + 2
print(get_age(5))

内部步骤:
'''
n=5
5-1 +2

n=5-1
4-1 +2

n=4-1
3-1 +2

n=3-1
2-1 +2

n=2-1
n == 1
return 18
'''


"""

eg:
"""
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
# 打印出列表中每一个元素(列表除外)
# 1.循环该列表 获取列表内每一个元素
# 2.判断该元素是否是数字 如果是数字 则直接打印
# 3.如果是列表 则循环该列表 获取列表内每一个元素
# 4.判断该元素是否是数字 如果是数字 则直接打印
# 5.如果是列表 则循环该列表 获取列表内每一个元素
# 6.判断该元素是否是数字 如果是数字 则直接打印
# 7.如果是列表 则循环该列表 获取列表内每一个元素
	...
	
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            # 也是for循环 然后判断
            get_num(i)
get_num(l)

"""

image

算法
# 什么是算法
	解决问题的高效方法

# 二分法
l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
方式一
	直接for循环从左到右依次查找
    
方式二
	二分法(二分法能够使用的场景 数据集必须有序)
    
 def my_partner(target_num, l):  # target_num=321  l=l
    if len(l) == 0:
        print('不好意思 我尽力 没找到')
        return
    # 先获取中间位置索引值
    middle_index = len(l) // 2  # 8
    # 判断中间索引对应的值比目标值大还是小
    if target_num > l[middle_index]:
        # 说明要找的元素只可能出现在列表的右侧
        l_right = l[middle_index + 1:]  # l[9:]
        print(l_right)
        my_partner(target_num, l_right)
    elif target_num < l[middle_index]:
        # 说明要找的元素只可能出现在列表的左侧
        l_left = l[:middle_index]
        print(l_left)
        my_partner(target_num, l_left)
    else:
        print('找到了', target_num)
my_partner(321, l)  # 如果参数找不到 需要添加结束条件

image

三元表达式
def my_max(a, b):
    if a > b:
        return a
    else:
        return b
"""
当功能需求仅仅是二选一的情况下 推荐使用三元表达式
"""


def my_max(a, b):
    return a if a > b else b  # 三元表达式
print(my_max(1,8))


"""
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
三元表达式尽量不要嵌套使用
"""
res = '干饭' if 10 > 2 else '不干饭'
print(res)
res = '干饭' if 10 > 2 else ('不管饭' if 2 >5 else '写的啥!')
print(res)

image

列表生成式
name_list = ['jason', 'kevin', 'tony', 'jerry']
# 给列表中所有的人名加上_DSB后缀
'''传统做法1'''
# 1.定义一个空列表
new_list = []
# 2.for循环老列表
for name in name_list:
# 3.生成新的名字
new_name = '%s_DSB'%name
# 4.添加到新的列表中
new_list.append(new_name)
print(new_list)
'''列表生成式'''
res = ['%s_DSB' % name for name in name_list]
print(res)

'''传统做法2'''
# 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)

image

字典生成式
# 将l1列表和l2列表组成字典形式
"""传统写法"""
l1 = ['name', 'age', 'hobby']
l2 = ['jason', 18, 'read']
new_dict = {}
for i in range(len(l1)):
    new_dict[l1[i]] = l2[i]
print(new_dict)

# 打印l1中每个元素的所在位置
"""写法1"""
count = 0
for i in l1:
    print(count, i)
    count += 1

"""写法2"""
# 枚举
	关键字:enumerate
		针对该方法使用for循环取值 每次会产生两个结果
		第一个是从0开始的数字
		第二个是被循环对象里面的元素
		还可以通过start参数控制起始位置
for i, j in enumerate(l1, start=0):
    print(i, j)
    
    
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = {i: j for i,j in enumerate(name_list) if j != 'jason'}
print(res)

res1 = {i for i, j in enumerate(name_list)}
print(res1, type(res1))
            

image

匿名函数
# 匿名函数就是没有名字的函数
"""
语法格式
	lambda 形参:返回值
"""
print(lambda x:x**2)
def index():
    pass
print(index)


打印元素的平方值
'''写法1'''
print((lambda x: x ** 2)(2))

'''写法2'''
res = lambda x: x ** 2
print(res(2))


"""匿名函数一般不会单独使用 都是配合其他函数一起使用的"""
打印列表内每个元素的2次方值
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def index(n):
    return n ** 2
print(list(map(lambda x:x**2, l)))

image

posted @ 2021-11-18 21:05  Deity_JGX  阅读(102)  评论(0)    收藏  举报