匿存函数,内存函数,递归函数,二分法查找
一.匿名函数(lambda)
语法: lambda 参数: 返回值
函数名统一都叫lambda
1.把普通函数转换成匿名函数
def func(n)return n * n ret = func(9) print(ret)
普通
a = lambda n: n * n ret = a(9) print(ret)
匿名
其中a可以认为是函数名,但是在__name__中函数名统一是lambda
print(func.__name__) #查看函数名 print(a.__name__) #__name__的值都是<lambda>
查看函数名
def func(a, b)return a + bx = lambda a, b : a+b print(x(a , b))
两个参数的匿名函数
def func(x, y)return x, ys = lambda x, y :(x, y)#如果不放(),s会被分为两部分 lambda x, y :x和y print(s(250, 38))
两个返回值的匿名函数
fn = lambda *args :max(args) #匿名函数一定是一行函数 print(fn(1,3,8,56))#56
求最大值
二.sorted() 排序函数
语法:sorted(iterable, key, reverse)
key:排序规则.
运行流程: 把可迭代的对象中是每一个元素交给后面的key函数来执行.
得到一个数字(权重).通过这个数字进行排序
lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"] def func(s)return len(s) li = sorted(lst, key = func) print(li) #key: 排序方案, sorted函数内部会把可迭代对象中的每一个元素拿出来交给#后面的key,后面的key计算出一个数字. 作为当前这个元素的权重, 整个函根 #据权重进行排序
根据字数排列
lst = [{'name':"汪峰","age":48},{"name":"章子怡",'age':38},{"name":"alex","age":39},{"name":"wusir","age":32},{"name":"赵一宁","age":28}]ll = sorted(lst, key=lambda el: len(el['name']), reverse=True) print(ll)
View Code
三.filter() 过滤函数
语法: filter(function, iterable)
运行流程;把可迭代对象中的数据交给前面的函数进行筛选.函数返回True或者False
#普通函数 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] def func(el)if el[0] == "张"return False #不想要的else:return True #想要的 f = filter(func, lst) print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f:print(e)#匿名函数 f = filter(lambda el :el[0] != "张", lst) print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f:print(e)
排除姓张的人
lst = [{"name":"汪峰", "score":48},{"name":"章子怡", "score":39},{"name":"赵一宁","score":97},{"name":"石可心","score":90}]f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人print(list(f))
求分数小于60的
四.map() 映射函数
语法: 把可迭代对象中的数据交给前面的函数进行执行,返回值就是map()的处理结果
lst = [1,4,7,2,5,8] li = [] #第一种方法:算法 for el in lst:li.append(el**2) #第二种方法:普通函数 def func(el)return el**2 m = map(func, lst) print(list(m)) #第三种方法:匿名函数 m = map(lambda el: el**2, lst) print(list(m)) # 把后面的可迭代对象中的每一个元素传递给function, 结果就是function返 #回值
计算列表中每个数字的平方
map(func1, map(func2, map(func3 , lst)))
分而治之
map(func1, map(func2, map(func3 , lst)))当我们处理的数据过大时可以用分而治之的思想(如人工智能中的数据处理)
五.递归函数(默认递归函数是死循环)
1.定义:函数自己调用自己
2.递归函数的深度: 1000. 到不了1000就会停止(深度可以自己设置)
import sys sys.setrecursionlimit()
深度
count = 1 def func():global countprint("alex是很帅的", count)count = count + 1func() func() 递归深度. 你可以自己掉用自己的次数,官方文档中递归最大深度是1000. 在这之前就会给你报错
3.递归函数的用处
3.1处理相似的操作
# 遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名 import os def func(filepath, n): # d:/sylar/# 1,打开这个文件夹files = os.listdir(filepath)# 2. 拿到每一个文件名for file in files: # 文件名# 3. 获取到路径f_d = os.path.join(filepath, file) # d:/sylar/文件名/# 4. 判断是否是文件夹if os.path.isdir(f_d):# 5. 如果是文件夹. 继续再来一遍print("\t"*n, file,":") # 打印文件名func(f_d, n + 1)else: # 不是文件夹. 普通文件print("\t"*n, file)func("d:/sylar",0)
遍历文件
3.2传播病毒(要在每个文件夹下的每个文件投放病毒)
3.3杀毒
3.4求阶乘
def func(n,s): #计算n的阶乘if n > 0:s = n * sn = n - 1return func(n,s)else:return s ret = func(8,1) print(ret)
阶乘
3.5斐波那契(如计算第400个数, 不超过4000000(400万)最多计算几次)
def func(n,i,a,b):#a第一个数,b第二个数,i是第几次计算c = a + b # 第三个数if n > i:a = bb = ci+=1return func(n,i,a,b )else:return c ret = func(400,3,1,1) print(ret)
View Code
def func(n,i,a,b):#a第一个数,b第二个数,i是第几次计算c = a + b # 第三个数if n > c:a = bb = ci+=1return func(n,i,a,b )else:return i ret = func(4000000,3,1,1) print(ret)
计算几次
4.递归函数中的return 返回值,返回给上一层调用者
六.二分法
1.二分法的核心: 掐头去尾取中间,一次砍一半
2.两种算法:常规循环,递归循环
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ] n = 79for el in lst:if el == n: # O(1)print("找到了")break else:print("没有")
View Code
使用二分法可以提高效率, 前提条件:有序序列
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] n = 88 left = 0 right = len(lst)-1 while left <= right: # 边界, 当右边比左边还小的时候退出循环mid = (left + right)//2 # 必须是整除. 因为索引没有小数if lst[mid] > n:right = mid - 1if lst[mid] < n:left = mid + 1if lst[mid] == n:print("找到了这个数")break else:print("没有这个数")
二分法查找
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] def func(n, left, right):if left <= right: # 边界print("哈哈")mid = (left + right)//2if n > lst[mid]:left = mid + 1return func(n, left, right) # 递归 递归的入口elif n < lst[mid]:right = mid - 1# 深坑. 函数的返回值返回给调用者return func(n, left, right) # 递归elif n == lst[mid]:print("找到了")return mid# return # 通过return返回. 终止递归else:print("没有这个数") # 递归的出口return -1 # 1, 索引+ 2, 什么都不返回, None # 找66, 左边界:0, 右边界是:len(lst) - 1 ret = func(70, 0, len(lst) - 1) print(ret) # 不是None
递归完成二分查找
def binary_search(ls, target):left = 0right = len(ls) - 1if left > right:print("不在这里")middle = (left + right) // 2if target < ls[middle]:return binary_search(ls[:middle], target)elif target > ls[middle]:return binary_search(ls[middle+1:], target)else:print("在这里") binary_search(lst, 567)
切片二分法
切片二分法很难确定位置
3.给一x位数,2**n 最多要查找n次 时间复杂度 o(1)~o(n)
七.最快速的查询讯方式(时间复杂度最低,空间复杂度最低)
查询某个元素是否在某个序列中
lst1 = [5,6,7,8]
lst2 = [0,0,0,0,0,0,0,0,0] #9个0
for el in lst1:
lst2[el] = 1
o(1) #时间复杂度是1
解释: 查询某列表中lst是否存在某个元素a,
1.先建立一个列表,列表中有lst中最大值加1个零
2.当lst2[a] == 1是该元素存在列表中,当lst2[a]==0时该元素不存在列表中
八总结
filter()和map()一样得到的是地址,需要遍历才能得到结果
转载于:https://www.cnblogs.com/Bug66/p/9482460.html
匿存函数,内存函数,递归函数,二分法查找相关推荐
- python函数教程:Python递归函数 二分查找算法实现解析
这篇文章主要介绍了Python递归函数 二分查找算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.初始递归 递归函数:在一个函数里在调 ...
- python 二分查找函数_Python基础14_递归函数,二分查找
一. 递归 在函数中调用函数本身, 就是递归 prthon中递归的最大深度是998 def func(n): print(n) n += 1 func(n) func(1) 递归的应用:我们可以使用递 ...
- Python函数之六:递归函数
Python函数之六:递归函数 一.什么是函数的递归 1.编程语言中, 函数Func(Type a,-)直接或间接调用函数本身,则该函数称为递归函数. 2.递归的定义:一种计算过程,如果其中每一步都要 ...
- 【C语言航路】第十一站:字符串、字符和内存函数
目录 一.字符串函数 1.strlen (1)strlen的库函数文档 (2)strlen的模拟实现 (3)strlen的注意事项 2.strcpy (1)strcpy的库函数文档 (2)strcpy ...
- C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解
在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...
- python 类的执行中保部存值_python函数名称空间与作用域、闭包
一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...
- 匿名函数、冒泡排序,二分法, 递归
匿名函数 lambda 匿名函数 格式 lambda 参数:返回值 函数名统一叫lambda,最多只能写一行普通的正常的函数 def func(n):return n * n lambda匿名函数写法 ...
- 【C语言笔记进阶篇】第二章:字符串函数和内存函数
目录 (1)分类 (2)字符串函数 A:strlen(求字符串长度) B:strcpy(字符串复制_不受限制) C:strcat(字符串追加_不受限制) D:strcmp(字符串比较_不受限制) E: ...
- 函数体中的return以及函数的解的二分法
昨天晚上在写educoder的实训作业的时候,发现了一些问题. 大概是这个这样的用二分法求函数的根的问题.还需要将根逐行输出. 首先二分法是通过不断寻找中的数与目标数进行比较的方法,运用于函数需要注意 ...
最新文章
- Scrum立会报告+燃尽图(Beta阶段第二周第七次)
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- drawable自定义字体颜色
- [转]SupSite页面文件与模块关系说明
- c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
- 宏病毒的研究与实例分析05——无宏文件携带宏病毒
- 【原创】如何组织好一个学习小组
- Facebook妥协了,React回归
- 【Java并发编程的艺术】第二章读书笔记之原子操作
- 全局bigdecimal反序列化转String返回数据
- 分享个大厂PRD模板
- BP 神经网络的非线性系统建模——非线性函数拟合
- 微信小程序_阿里云api人脸识别
- 如何对网络安全攻击采取防御措施
- 公众号内文章懒得翻,巧用搜索神器轻松搞定
- 典型的AEB误触发场景
- Android开发范例实战宝典
- 计算机技术专插本考什么科目,2021专插本考试,你的专业要考什么科目?
- Python Web开发: 教你如何解放路由管理
- 区块链安全和传统安全有什么不同
热门文章
- 三刺激值计算公式_超实用的数控车床常用计算公式,绝对帅,赶紧收藏了!
- java sctp_[编织消息框架][传输协议]sctp简单开发
- HT for Web中3D流动效果的实现与应用
- pytorch 入门学习加载数据集-8
- SCOM 常识概念—与其他SC产品集成
- 由1 2 3 4可以组成多个十百 无重复的数字
- cin、cin.get()、cin.getline()、getline()、gets()等函数的用法 (转)
- 12个免费的 Twitter Bootstrap 后台模板
- (转)LuaPlus C++ 函数互调
- Silverlight 中的通信安全访问策略