python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点
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 ...
随机推荐
- uva-11129-分治
题意:对于一个0-(N-1)的等差数列,求其中一个排列Q,使得任意0<=i,j,k<n 时,ai,aj,ak不是等差数列. 解法:考虑0-(N-1)这个等差数列,假设公差为K,那么数列如下 ...
- python学习笔记_week13
一.前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是堡垒机所具备的功能属性中的 ...
- java abstract构造函数调用
构造函数是对象的基本,没有构造函数就没有对象.如果在父类中(这里就是你的抽象类)中显示的写了有参数的构造函数,在子类继承是就必须写一个构造函数来调用父类的构造函数 public abstract cl ...
- 04.给linux用户添加sudo权限
linux给用户添加sudo权限: 有时候,linux下面运行sudo命令,会提示类似: xxxis not in the sudoers file. This incident will be r ...
- leetcode212
class Solution { public List<String> findWords(char[][] board, String[] words) { List<Strin ...
- Linux swap 使用
使用的背景 内存吃紧的时候可以考虑使用swap. swap新增 http://www.cnblogs.com/wuxie1989/p/5888595.html swap 使用 https://www. ...
- mysql存储过程使用游标循环插入数据
DELIMITER $$ DROP PROCEDURE IF EXISTS `procedure_course`$$ CREATE DEFINER=`root`@`localhost` PROCEDU ...
- js删除dom节点时候索引出错问题
我们知道删除一个dom节点的时候索引就会发生了改变,甚至是错误,就算jq的ecah也无能为力,所以我们只能自己写个功能了 直接上代码把,不多说 <!DOCTYPE html> <ht ...
- git 和 github 学习总结
https://mp.weixin.qq.com/s?src=11×tamp=1543302553&ver=1269&signature=NAX65qusuVVDEl ...
- 固定顶部指定div不滑动
.fixed_div { position:fixed; z-index:100; top: 45px; width:100%; height:45px; } 指定div设置属性position:fi ...