python递归、二分法、列表字典生成式、三元表达式、匿名函数

递归、二分法、匿名函数、三元表达式、列表 字典生成式

一. 递归函数

  • 定义:

    函数在运行过程中 直接或者间接的调用了自身

官网表示:python默认的最大递归深度为1000次

 def func():
     print('from func')
     index()
 def index():
     print('from index')
     func()
 index()
# 这里就成了死循环了
  • 递归的两个状态

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 get_age(n):
     if n == 1:
         return 18
     return get_age(n - 1) + 2
 print(get_age(5))

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

总结:

写递归函数的时候可以先写一下代码,当发现循环的时候,把第一次的循环截取下来,然后再调用自己就行了,但是一定要写结束条件
image

二. 算法之二分法

  1. 什么是算法?

    解决问题的高效方法

  2. 二分法

    注意: 二分法能够使用的场景 数据集必须有序

    l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
    
    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)
    

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


is_free = input('电影是否收费(y/n)>>>:').strip()
if is_free == 'y':
    print('收费')
else:
    print('免费')
print('收费' if is_free == 'y' else '免费')
username = input('username>>>:')
res = 'NB' if username == 'jason' else 'SB'
print(res)

image

四. 列表生成式

name_list = ['jason', 'kevin', 'tony', 'jerry']
new_list = ['%sDBS' % i for i in name_list]
print(new_list)

l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l2 = [num * num for num in l1]
print(l2)  # [1, 4, 9, 16, 25, 36, 49, 64, 81]
l3 = [num * 5 for num in l1 if num != 6]
print(l3)  # [5, 10, 15, 20, 25, 35, 40, 45]

image

五. 字典生成式

# 枚举
enumerate(l1)
    针对该方法使用for循环取值 每次会产生两个结果
        第一个是从0开始的数字
        第二个是被循环对象里面的元素
    还可以通过start参数控制起始位置
    
l1 = ['name', 'age', 'hobby']
for i, j in enumerate(l1):
    print(i, j)  # 0 name  1 age  2 hobby
for i, j in enumerate(l1, start=1):
    print(i, j)  # 1 name  2 age  3 hobby
	
字典生成式
import random
stuInfo = {}    ##存放学生信息字典

for i in range(20):   ##循环20次即有20位学生
    name = 'stu' + str(i)   ##学生名字
    score = random.randint(60,100)   ##随机生成每个学生成绩
    stuInfo[name] = score   ##将学生成绩作为value赋值给每个学生

print({name: score for name,score in stuInfo.items() if score > 90})

六. 匿名函数

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

'''匿名函数一般不会单独使用 都是配合其他函数一起使用'''
# map()  映射
 l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 def index(n):
     return n ** 2
 print(list(map(lambda x:x**2, l)))
posted @ 2021-11-18 19:48  zong涵  阅读(50)  评论(0编辑  收藏  举报