python基础-二分法、生成式、匿名函数、内置函数
一、算法简介及二分法
1.算法
| 1.什么是算法 |
| 算法是针对专门问题的有效方法,不是所有的算法都很高效 |
| |
2.二分法
| 1.二分法的使用要求 |
| 待查找的数据集必须有序 |
| 2.二分法的缺陷: |
| 针对位置在开头或者结尾的数据,查找效率很低 |
| |
| |
| |
| 3.通过案例了解二分法的原理 |
| 二分法主要是一种查找数据的方法, |
| 1)将待查找的数据按照某种要求分为两部分 |
| 2)然后在 这两部分中 判断 数据值在那个部分 |
| 3)然后重复这个过程,直到找到该数据或者找不到 |
| |
| |
| l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232] |
| """ |
| 查找列表中某个数据值 |
| 方式1:for循环 次数较多 |
| 方式2:二分法 |
| """ |
| |
| |
| l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232] |
| |
| |
| |
| '''代码实现二分法''' |
| |
| |
| |
| def get_middle(l1, target_num): |
| |
| if len(l1) == 0: |
| print('很抱歉 没找到') |
| return |
| |
| middle_index = len(l1) // 2 |
| |
| if target_num > l1[middle_index]: |
| |
| right_l1 = l1[middle_index + 1:] |
| print(right_l1) |
| |
| return get_middle(right_l1, target_num) |
| elif target_num < l1[middle_index]: |
| |
| left_l1 = l1[:middle_index] |
| print(left_l1) |
| |
| return get_middle(left_l1, target_num) |
| else: |
| print('恭喜你 找到了!!!') |
| |
| |
| |
| |
| l1 = [11, 22, 33, 44, 55, 66, 77, 88, 89, 100, 122, 333, 444] |
| |
| |
| def get_number(l, target_num): |
| |
| if len(l) == 0: |
| print('z找不到该数据') |
| return |
| |
| middle_index = len(l) // 2 |
| |
| |
| if target_num > l[middle_index]: |
| |
| r_list = l[middle_index + 1:] |
| print(r_list) |
| |
| return get_number(r_list, target_num) |
| |
| elif target_num < l1[middle_index]: |
| |
| l_list = l[:middle_index] |
| print(l_list) |
| |
| return get_number(l_list, target_num) |
| else: |
| print('找到了') |
| |
| |
| get_number(l1, 333) |
二、三元表达式
| 1.三元表达式语法 |
| name = input('name') |
| res = '数据值1' if name == '条件' else '数据值2' |
| print(res) |
| """" |
| 数据值1 if 条件 else 数据值2 |
| 条件成立则使用数据值1 条件不成立则使用数据值2 |
| """ |
| |
| 2.三元表达式的使用场景 |
| 1)一般是 二选一 的情况下使用三元表达式 |
| 2)不要使用三元表达式嵌套使用 |
三、生成式
1.列表生成式
| 应用场景:需要简化对列表的操作,对列表中对数据,作相同操作 |
| |
| 1.列表生成式的语法 |
| new_list = [ 元素 + 操作 for 元素 in old_list] |
| |
| |
| |
| new_list =[] |
| for name in name_list: |
| data = f'{name}_nb' |
| new_list.append(data) |
| print(new_list) |
| |
| 2.列表生成式的应用 |
| 1)对列表中对数据,作相同操作,简化代码 |
| |
| new_list = [name + '_nb' for name in name_list] |
| |
| print(new_list) |
| |
| 2)复杂情况,增加if语句(for循环中 加个 if分支) |
| new_list = [name + '_nb' for name in name_list if name == 'jason'] |
| new_list = ['_nb' + name for name in name_list if name == 'duoduo'] |
| print(new_list) |
| |
| |
| old_list = ['duoduo', 'leethon', 'bo'] |
| new_list = ['大佬:' + name for name in old_list if name == 'leethon'] |
| print(new_list) |
2.字典生成式
| |
| 1.关键字 enumerate(i,start=起始值) |
| 将i中的元素遍历,并按照顺序和递增的起始值 一一组队输出成一个个元组 |
| |
| enumerate(i,start=起始值) |
| i为数据值,type是想判断的数据类型 |
| |
| s1 = 'hello world' |
| for i in enumerate(s1,start=100): |
| print(i) |
| ----------运行结果-------- |
| (100, 'h') |
| (101, 'e') |
| (102, 'l') |
| (103, 'l') |
| (104, 'o') |
| (105, ' ') |
| (106, 'w') |
| (107, 'o') |
| (108, 'r') |
| (109, 'l') |
| (110, 'd') |
| |
| 2.字典生成式 |
| 1)语法:dict = {i:j for i,j in enumerate('hello world',0)} |
| 2)功能:将字符串'hello world'和起始值0,开始以键值对的形式输入字典 |
| |
| |
| s1 = 'hello world' |
| d1 = {i:j for i,j in enumerate('hello world')} |
| print(d1) |
| ----------运行结果-------- |
| {0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'} |
3.集合生成式
| 1.集合生成式 |
| 1)语法: {i for i in 数据集} |
| 2)功能: 将 数据集中的元素遍历加入元组中并去重 |
| |
| |
| res = {i for i in 'hello'} |
| print(res) |
| ----------运行结果-------- |
| {'o', 'h', 'l', 'e'} |
元组 : 没有元组生成式 下面的结果是生成器
| res = ( i + 'sb' for i in 'hello') |
| print(res) |
| ----------运行结果-------- |
| <generator object <genexpr> at 0x102f9d890> |
四、匿名函数
| 1.没有名字的函数 需要使用关键字 lambda |
| 2.语法结构 |
| lambda 形参:返回值 |
| |
| |
| 3.使用场景 |
| lambda a,b :a+b |
| 匿名函数一般不单独使用,需要配合其他函数一起使用 |
五、常见的内置函数
1.map
| 1.map 函数功能:根据提供的函数对指定序列做映射(如图) |
| |
| |
| 2.语法结构 |
| map(匿名函数, 数据集) |
| |
| |
| l1 = [1,2,3,4,5] |
| |
| def func(a): |
| return a+1 |
| res = map(lambda x:x+1,l1) |
| print(res) |
2.max\min
| 1.max 函数功能:返回数据中的最大值 |
| 2.语法结构: max(数据集) |
| |
| |
| l1 = [1,2,3,4,5] |
| res = max(l1) |
| print(res) |
| |
| |
| d1 = { |
| 'zj':123, |
| 'sam':9888, |
| 'sad':999999 |
| } |
| res = max(d1) |
| print(res) |
| -----------运行结果------------- |
| zj |
| |
| 3.字符串大小 |
| 要点:函数 max比较的是字典中的键,键是字符串时,比对的是ASCII码的对应编码的大小 |
| |
| ASCII中 字母对应编码 |
| A-Z 65-96 |
| a-z 97-122 |
| |
| 4.函数 max的原理可以看作是for循环 |
| 理解 max中,输出的结果还是数据集中的元素,而我们可以指定如何比较数据集中元素的大小 |
| max也就是遍历取值,在字典中取的是关键字key,但是我们可以通过给指定给键排定大小,但是最后输出的还是键key |
| |
| |
| |
| ret = max(d1,key = lambda k:d1.get(k)) |
| print(ret) |
| |
| def func(a): |
| return d1.get(a) |
| rel = max(d1,key = func) |
| print(rel) |
| |
| 理解 max中,输出的结果还是数据集中的元素,而我们可以指定如何比较数据集中元素的大小 |
| max也就是遍历取值,在字典中取的是关键字key,但是我们可以通过给指定给键排定大小,但是最后输出的还是键key |
3.reduce
| 1.函数reduce功能:传多个值,返回一个值 |
| 2.语法结构:需要调用模块之后才能使用 |
| from functools import reduce |
| reduce() |
| |
| 3.与lambda 联动 |
| |
| |
| from functools import reduce |
| l1 = [11, 22, 33, 44, 55, 66, 77, 88] |
| res = reduce(lambda a, b: a * b, l1) |
| print(res) |
| |
| |
| from functools import reduce |
| l1 = [1,2,3,4,5] |
| reu = reduce(lambda a,b:a*b,l1) |
| print(reu) |
| isinstance(i,type) |
| i为数据值,type是想判断的数据类型 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY