1,lambda: 匿名函数
2.sorgted() 排序函数
3,filter() 过滤函数 筛选
4,map() 映射函数
5.递归
6.二分法
一. 匿名函数: lambda
lambda 表示的是匿名函数,不用def 来声明,一句话就可以声明一个函数.
例如:我们为力了解决一些简单的需求而设计了一句话函数:
def func(n): return n *n return func() print(ret) #
但是我们用匿名函数就会相对来说方便一些
匿名函数语法: 函数名= lambda 参数 : 返回值
例: 同上 匿名函数的操作方法
a = lambda n : n*n print(a(9) #
def func(a,b) return a + b x = lambda a,b : a + b print(x(1,2)) #
笔试题
def func(x,y)
return x ,y
print(func(1,2)) # (1,2) 元组形式 匿名函数方法:
错误(大坑)
a = lambda x,y : 1,2
print(a)
#
(<function <lambda> at 0x0000000000613E18>, 2) 前三项会算到一起 正确的方法:
a = lambda x,y : (1,2)
print(a)
#
(1,2) 元组形式
匿名函数,给函数传递多个参数,返回最大值
func = lambda *ages : max(ages) #单行函数 print(func(1,2,3,4,5,6,66,7,8,99,34,2,32,53,5,256)) # 256
注意;
1.函数的参数可以是多个,多个参数之间用逗号隔开
2.匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据.
3.返回值的和正常函数一样,可以是任意数据类型
匿名函数的变量就是一个函数名. 说他是匿名原因是我们通过__name__查看的时候是没有名字的,统一都叫 lambda .在调用的时候没有什么特别之处.
二. sorted() 排序函数
语法: sorted(Iterable,key ,reverse)
iterable:可迭代对象
key;排序规则.
运行流程:sorted函数内部会把可迭代对象中的每一个元素交给后面的key 函数来执行,得到一个数字(权重),通过这个数字进行排序.
reverse: 是否倒序 True;是 False: 否
例: 列表的排序
lis = [1,2,4,55,67,8,9,32,45] lis.sort() # 列表的方法 print(lis) # [1,2,4,8,9,32,45,55,67] 内置函数提供了一个通用的排序方案, sorted() s = sorted(lis) print(lis) # [1,2,4,8,9,32,45,55,67]
例; 列表
lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]
def func(a):
return len(a)//2 ll = sorted(lst, key=func) print(ll) #
['聊斋', '西游记', '葫芦娃', '水浒传', '年轮', '亮剑', '三国演义'] def func(s):
return len(s)%2
ll = sorted(lst, key=func)
print(l1) #
['聊斋', '三国演义', '年轮', '亮剑', '西游记', '葫芦娃', '水浒传']
例:字典 和lambda组合使用
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=False)
print(ll) #结果
[{'name': '汪峰', 'age': 48}, {'name': '章子怡', 'age': 38}, {'name': '赵一宁', 'age': 28}, {'name': 'alex', 'age': 39}, {'name': 'wusir', 'age': 32}] #按照名字长度排序 倒序
ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)
print(ll)
#结果
[{'name': 'wusir', 'age': 32}, {'name': 'alex', 'age': 39}, {'name': '章子怡', 'age': 38}, {'name': '赵一宁', 'age': 28}, {'name': '汪峰', 'age': 48}]
三.filter() 过滤函数 筛选
语法; filter(function,iterable)
把可迭代对象中的每一个元素交给前面的函数(function)进行筛选,函数(function)返回 True 或者 False .
所有返回的 True 都会被留下,所有返回的 False 都会被过滤掉.
例:
lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]
f = filter(lambda el : el[0] != "张",lst)
# 将lst中的每一项传递给func, 所有返回True的都会保留, 所有返回False都会被过滤掉
print("__iter__"in dir(f)) #判断是否可以进行迭代
for e in f:
print(e) #
True
赵一宁
石可心
马大帅
例:
lst = [
{"name":"汪峰", "score":48},
{"name":"章子怡", "score":39},
{"name":"赵一宁","score":97},
{"name":"石可心","score":90}
] f = filter(lambda el: el['score'] < 60 , lst) # 根据分数低于60分的 去16期的人 print(list(f)) #
[{'name': '汪峰', 'score': 48}, {'name': '章子怡', 'score': 39}]
四.map() 映射函数
语法: map(function,iterable)
把可迭代对象中的数据交给前面的函数进行执行,返回值就是map的处理结果.
例: 计算列表中每个数字的平方
lst = [1,4,7,2,5,8]
lst = [1,4,7,2,5,8]
def func(el):
return el**2
m = map(func,[1,4,7,2,5,8])
print(lst(m)) #
[1, 16, 49, 4, 25, 64] #转换成 lambda
m = map(lambda el ; el**2,lst) #把后面的可迭代对象中的每一个元素传递给function, 结果就是function的返回值print(lst(m)) #
[1, 16, 49, 4, 25, 64]
分而治之 : map(func1, map(func2, map(func3 , lst)))
例;
计算两个列表中相同位置的数据的和
lst1 = [1, 3, 5, 7,8]
lst2 = [2, 4, 6, 8, 10]
m = map(lambda x,y : x + y ,lst1,lst2)
print(list(m))
# [3, 7, 11, 15, 18]
水桶效应(短板效应), zip()
lst1 = [1, 3, 5, 7]
lst2 = [2, 4, 6, 8, 10]
m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6])
print(list(m))
# [8, 8, 13, 18]
五.递归
函数自己调用自己
递归深度. 你可以自己掉用自己的次数.
最大深度: 1000, 到不了1000就停了.
官方文档中递归最大深度是1000. 在这之前就会给你报错
例;
count = 1
def func():
global count
print("alex是很帅的", count)
count = count + 1
func()
func() #
........
alex是很帅的 990
alex是很帅的 991
alex是很帅的 992
alex是很帅的 993
alex是很帅的 994
alex是很帅的 995
alex是很帅的 996
alex是很帅的 997
alex是很帅的 998Traceback (most recent call last):
File "E:/python_01/day15/code/08 递归.py", line 11, in <module>
func()
File "E:/python_01/day15/code/08 递归.py", line 10, in func
func()
File "E:/python_01/day15/code/08 递归.py", line 10, in func
func()
File "E:/python_01/day15/code/08 递归.py", line 10, in func
func()
[Previous line repeated 993 more times]
File "E:/python_01/day15/code/08 递归.py", line 7, in func
print("alex是很帅的", count)
RecursionError: maximum recursion depth exceeded while calling a Python object Process finished with exit code 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)
六.二分法查找
核心: 掐头去尾取中间. 一次砍一半
两种算法: 常规循环, 递归循环
要求: 查找的序列必须是有序序列.
例: for循环方法查找
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
n = 79 for el in lst:
if el == n:
print("找到了")
break
else:
print("没有") #
没有
例: 二分法查找; 使用二分法可以提高效率, 前提条件:有序序列 /非递归二分法查找
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 - 1
if lst[mid] < n:
left = mid + 1
if 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:
mid = (left+right)//2
if n < lst[mid]:
right = mid -1
return func(n,left,right)
if n > lst[mid]:
left = mid + 1
return func(n,left,right)
if n == lst[mid]:
print("找到这个数了")
return mid
else:
print("没有这个数")
return -1
ret = func(77,0,len(lst) - 1)
print(ret) #
找到这个数了
6
另类二分法,很难计算位置
def binary_search(ls, target):
left = 0
right = len(ls) - 1
if left > right:
print("不在这里")
middle = (left + right) // 2
if 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)
最快的查找方法:(面试题)
例:
# 时间复杂度最低, 空间复杂度最低
lst1 = [5,6,7,8]
lst2 = [0,0,0,0,0,1,1,1,1]
for el in lst1:
lst2[el] = 1 lst2[4] == 1 # o(1) 列表相对字典省空间
python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点的更多相关文章
-
Python内置的字符串处理函数整理
Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...
-
python内置常用高阶函数(列出了5个常用的)
原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...
-
Python内置进制转换函数(实现16进制和ASCII转换)
在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...
-
Python内置的字符串处理函数
生成字符串变量 str='python String function' 字符串长度获取:len(str) 例:print '%s length=%d' % (str,len(str)) 连接字符 ...
-
Python 内置的一些高效率函数用法
1. filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组 ...
-
Python内置函数系列
Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义. 作用域相关(2) locals() :以字典类型返回当前位置 ...
-
Python内置高阶函数map()
map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于lis ...
-
Python内置函数二 (递归函数,匿名函数,二分法)
匿名函数 lambda() 语法: lambad 参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...
-
【Python】Python内置函数dir详解
1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...
随机推荐
-
自己用C语言写dsPIC / PIC24 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...
-
Java广度优先爬虫示例(抓取复旦新闻信息)
一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...
-
Spark之scala
一.什么是scala scala 是基于JVMde 编程语言.JAVA是运行在jvm上的编程语言,java 源代码通过jvm被编译成class 文件,然后在os上运行class 文件.scala是运行 ...
-
NHibernate系列文章五:NHibernate配置
摘要 NHibernate有多种配置方法,代码,xml文件,以及Fluent NHibernate.这里只介绍最常用的两种NHibernate配置方法:通过代码和通过配置文件. 1. 通过代码配置 通 ...
-
Centos php项目发布问题
LAMP环境,项目运行错误日志路径:/var/log/httpd 错误日志例如: [Sat Jul :: ] [error] [client , referer: http://192.168.100 ...
-
使用PowerDesigner 设计SQL Server 数据库
工具: Sybase PowerDesigner 12.5 Microsoft SQL Server 2005 第一步:概念数据模型 打开PowerDesigner 软件,设计“概念数据模型”(Co ...
-
c#代码实现GPS数据的有效性校验
用于校验GPS报文指令的有效性 很简单的代码,留存吧 public static bool Verify(string gpsInfo) { if (gpsInf ...
-
SDWebImage 清除缓存
1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumerator *file ...
-
IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
有时候解决问题不仅仅是解决问题.-----jstarseven 最近因为开发需要,需要搭建一个ssm开发框架,采用了开发工具IDEA. 整合完了SSM开发框架之后,发布的时候出现org.apache. ...
-
Django--post提交表单内容
本节目标:①.提交表单内容②.通过客户端提交表单新增一篇文章③.通过Django的forms组件来完成新增一篇文章 =======提交表单内容======== 1.前端html:login.html ...