小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)
小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>>
1. lambda 匿名函数
lambda 参数: 返回值
注意:
1. 函数的参数可以有多个. 多个参数之间⽤逗号隔开
2. 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据
3. 返回值和正常的函数⼀样, 可以是任意数据类型
# def fang(x): # return x**2 # # # ret = fang(5) # # print(ret) # # zrf = lambda x : x**2 # 匿名函数 lambda 参数: 返回值 # # ret = zrf(10) # print(ret) # # # 给函数传递两个参数a. b 返回a+b的结果 # a = lambda a, b: a+b # print(a(188,35006))
2. sorted 排序
sorted(iterable, key=func, reverse=True/False)
执行流程:
把可迭代对象中的每一个元素拿出来, 放到func中运行. 返回一个数字. 根据数字进行排序
# # lst = [1, 8, 18, 19, 97, 12, 3] # # lst.sort() # lst自带的排序功能 # l2 = sorted(lst) # 排序功能 # print(l2) # 0 2 2 2 0 2 2 2 lst = ["赵瑞鑫", "刘伟", "刘能", "赵四", "王大拿", "于谦", "范伟", "沈腾"] # def func(name): # return len(name) % 3 # 返回数字 l2 = sorted(lst, key=lambda name: len(name) % 3) print(l2) lst = [{"id": 1, "name": 'alex', "age": 18}, {"id": 2, "name": 'wusir', "age": 16}, {"id": 3, "name": 'taibai', "age": 17}] # 按照年龄对学⽣信息进⾏排序 # def func(dic): # return dic['age'] # l2 = sorted(lst, key=func) # 流程: 把可迭代对象的每一项传递给函数. 函数返回一个数字. 根据这个数字完成排序 # print(l2) # l3 = sorted(lst, key=lambda dic: dic['age']) # l4 = sorted(lst, key=lambda dic: len(dic['name'])) # l4 = sorted(lst, key=lambda dic: ascii(dic['name'][0])) # ord() # print(l4)
3. filter 筛选
filter(func, Iterable)
执行流程:
把可迭代对象中的每一个元素拿出来, 放到func中运行.返回True/False. 根据返回的True和False来决定这个数据是否保留
# lst = [23, 28, 15, 27, 24, 22] # def func(age): # return age > 18 and age % 2 == 0 # # f = filter(lambda age: age > 18 and age % 2 == 0, lst) # # print(sorted(f)) # # f = filter(func, lst) # # print(f) # # print("__iter__" in dir(f)) # # for el in f: # print(el) # lst = [23, 28, 15, 27, 24, 22] # f = filter(lambda age: age % 2 == 0, filter(lambda age: age > 18, lst)) # print(list(f)) # lst = [{"id":1, "name":'alex', "age":18}, # {"id":2, "name":'wusir', "age":16}, # {"id":3, "name":'taibai', "age":17}] # # # 筛选出年龄大于等于17岁的人 # print(list(sorted(filter(lambda dic: dic['age'] >= 17, lst), key=lambda dic: dic['age'])))
4. map 映射
map(func, Iterable)
执行流程:
把可迭代对象中的每一个元素拿出来, 放到func中运行.返回数据就是结果
# lst = [1,5,9,3] # # l1 = [i**2 for i in lst] # m = map(lambda x: x**2, lst) # print(list(m)) # 计算两个列表相同位置的数据的和 # lst1 = [1, 2, 3, 4, 5] # lst2 = [2, 4, 6, 8, 10] # # print(list(map(lambda x, y: x + y , lst1, lst2)))
5. 递归(难点)
自己调用自己
递归的入口
递归的出口: return
递归的循环条件:动
循环树形结构:
# # 递归 # def func(): # print("我叫李嘉诚") # func() # 递归的入口 # # # 调用函数 # func() # 用递归实现1-100 # import sys # sys.setrecursionlimit(5000) # 设置递归的最大深度, 一般不要改. # # def func(index): # print(index) # func(index + 1) # # func(1) # 递归的深度: 1000 但是到不了1000, 997 - 998 # 遍历某文件夹内的所有文件和文件夹 import os # 树形结构的遍历 def func(file_path, ceng): # 获取到路径下的所有文件 lst = os.listdir(file_path) # 得到文件夹里的所有文件和文件夹 for file in lst: # 文件名 # 获取到文件的全路径 full_path = os.path.join(file_path, file) # D:\python学院\s16\第一阶段\day01 认识python 变量 数据类型 条件if语句 if os.path.isdir(full_path): # 判断这个路径是否是一个文件夹 print("\t"*ceng, file) func(full_path, ceng+1) else: print("\t"*ceng, file) else: return func("D:\python学院\s16\第一阶段", 0)
6. 二分法查找
核心思想: 掐头结尾取中间.
前提条件: 有序.
# 二分法查找的效率特别高. # 缺点: 有序序列 # # lst = [1,8,16,32,55,78,89,1,5,4,7,5,9,6,8,5,4,5,44,5,2,1,4,5,1] # # [1, 1, 1, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 16, 32, 44, 55, 78, 89] # lst = sorted(lst) # n = int(input("请输入一个数:")) # left = 0 # right = len(lst) - 1 # # while left <= right: # # # mid = (left + right) // 2 # 索引只能是整数 # if n > lst[mid]: # left = mid + 1 # elif n < lst[mid]: # right = mid - 1 # else: # print("在这个列表中.所在的位置%s" % mid) # break # else: # print("你要找的数. 不在这个序列中") # 递归的第一套方案 # def func(n, lst): # left = 0 # right = len(lst) - 1 # if left <= right: # mid = (left + right)//2 # if n > lst[mid]: # new_lst = lst[mid+1:] # return func(n, new_lst) # elif n < lst[mid]: # new_lst = lst[:mid] # return func(n, new_lst) # else: # print("刚刚好, 在这里出现了") # return True # else: # return False # # lst = [1, 1, 1, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 16, 32, 44, 55, 78, 89] # ret = func(2, lst) # print(ret) # 第二套方案 def func(n, lst, left=0, right=None): if right == None: right = len(lst) - 1 if left <= right: mid = (left + right) // 2 if n > lst[mid]: left = mid + 1 elif n < lst[mid]: right = mid - 1 else: return True return func(n, lst, left, right) else: return False lst = [1, 1, 1, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 16, 32, 44, 55, 78, 89] ret = func(98, lst) print(ret)