Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法


Posted in Python onJune 05, 2019

一. lamda匿名函数

为了解决一些简单的需求而设计的一句话函数

# 计算n的n次方
def func(n):
 return n**n
print(func(10))
f = lambda n: n**n
print(f(10))

lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数

语法:

函数名 = lambda 参数: 返回值

注意:

1. 函数的参数可以有多个. 多个参数之间用逗号隔开

2. 匿名函数不管多复杂. 只能写一行, 且逻辑结束后直接返回数据

3. 返回值和正常的函数一样, 可以是任意数据类型

匿名函数并不是说一定没有名字. 这里前面的变量就是一个函数名. 说他是匿名原因是我们通过__name__查看的时候是没有名字的. 统一都叫lambda. 在调用的时候没有什么特别之处.像正常的函数调用即可

 二. sorted() 排序函数

语法: sorted(Iterable, key=None, reverse=False)

Iterable: 可迭代对象

key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数. 根据函数运算的结果进行排序

 

reverse: 是否是倒叙. True: 倒叙, False: 正序

lst = [1,5,3,4,6]
lst2 = sorted(lst)
print(lst) # 原列表不会改变
print(lst2) # 返回的新列表是经过排序的
dic = {1:'A', 3:'C', 2:'B'}
print(sorted(dic)) # 如果是字典. 则返回排序过后的key

和函数组合使用

# 根据字符串长度进行排序
lst = ["鲁班七号", "程咬金", "安琪拉", "阿珂"]
# 计算字符串长度
def func(s):
 return len(s)
print(sorted(lst, key=func))

和lambda组合使用

# 根据字符串长度进行排序
lst = ["鲁班七号", "程咬金", "安琪拉", "阿珂"]
# 计算字符串长度
def func(s):
 return len(s)
print(sorted(lst, key=lambda s: len(s)))
lst = [{"id":1, "name":'鲁班', "age":28},
  {"id":2, "name":'安琪拉', "age":16},
  {"id":3, "name":'阿珂', "age":25}]
# 按照年龄对信息进行排序
print(sorted(lst, key=lambda e: e['age']))

三. filter() 筛选函数

语法: filter(function. Iterable)

function: 用来筛选的函数. 在filter中会自动的把iterable中的元素传递给function. 然后根据function返回的True或者False来判断是否保留此项数据

4. map() 映射函数

Iterable: 可迭代对象

lst = [1,2,3,4,5,6,7]
ll = filter(lambda x: x%2==0, lst) # 筛选所有的偶数
print(ll)
print(list(ll))
lst = [{"id":1, "name":'鲁班', "age":18},
  {"id":2, "name":'安琪拉', "age":16},
  {"id":3, "name":'阿珂', "age":17}]
fl = filter(lambda e: e['age'] > 16, lst) # 筛选年龄大于16的数据
print(list(fl))

四. map() 映射函数

语法: map(function, iterable) 可以对可迭代对象中的每一个元素进行映射. 分别取执行function

计算列表中每个元素的平方,返回新列表

def func(e):
 return e*e
mp = map(func, [1, 2, 3, 4, 5])
print(mp)
print(list(mp))

改写成lambda

print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))

计算两个列表中相同位置的数据的和

# 计算两个列表相同位置的数据的和
lst1 = [1, 2, 3, 4, 5]
lst2 = [2, 4, 6, 8, 10]
print(list(map(lambda x, y: x+y, lst1, lst2)))

五. 递归

在函数中调用函数本身,就是递归

def func():
 print("我是递归")
 func()
func()

在python中递归的深度最大到998

def foo(n):
 print(n)
 n += 1
 foo(n)
foo(1) 

递归的应用:

我们可以使用递归来遍历各种树形结构, 比如我们的文件夹系统. 可以使用递归来遍历该文件夹中的所有文件

import os
def func(filepath,n):
 files = os.listdir(filepath) # 查案当前文件的目录
 for file in files: # 获取每一个文件名
  # 获取文件路径
  file_p = os.path.join(filepath,file)
  if os.path.isdir(file_p): # 判断file是否是一个文件夹
   print("\t"*n,file)
   func(file_p,n+1)
  else:
   print("\t"*n,file)
func("/Volumes/扩展盘/网站css",0)

六. 二分查找

二分查找. 每次能够排除掉一半的数据. 查找的效率非常高. 但是局限性比较大. 必须是有序序列才可以使用二分查找

要求: 查找的序列必须是有序序列.

# 判断n是否在lst中出现. 如果出现请返回n所在的位置
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]:
   left = mid + 1
   return func(n,left,right) # 递归,递归入口
  elif n < lst[mid]:
   right = mid - 1
   # 深坑,函数的返回值返回给调用者
   return func(n,left,right) # 递归
  elif lst[mid] == n:
   # print("找到了")
   return mid
 else:
  print("没找到")
  return -1 # 避免返回None

# 找66,左边界0,右边界len(lst) - 1
ret = func(66,0,len(lst) - 1)
print(ret)
# 递归二分法另一种形式,但是无法实现位置计算
lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
def func(lst,target):
 left = 0
 right = len(lst) - 1
 if left > right:
  print("没有这个数")
 middle = (left + right)//2
 if target < lst[middle]:
  return func(lst[:middle],target)
 elif target > lst[middle]:
  return func(lst[middle + 1:],target)
 elif target == lst[middle]:
  print("找到这个数了")
func(lst,101)

核心: 掐头去尾取中间. 一次砍一半

 

两种算法: 常规循环, 递归循环

# 时间复杂度最低, 空间复杂度最低
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中操作字典之setdefault()方法的使用
May 21 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
python实现三次样条插值
Dec 17 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
python实现AdaBoost算法的示例
Oct 03 Python
记录Python脚本的运行日志的方法
Jun 05 #Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 #Python
分享8个非常流行的 Python 可视化工具包
Jun 05 #Python
Django组件cookie与session的具体使用
Jun 05 #Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 #Python
python3下载抖音视频的完整代码
Jun 05 #Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 #Python
You might like
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
新手入门常用代码集锦
2007/01/11 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
详解Python验证码识别
2016/01/25 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
python实现图片中文字分割效果
2019/07/22 Python
python中for in的用法详解
2020/04/17 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
大学生实习证明范本
2014/01/15 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
考试作弊检讨
2015/01/27 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
python tkinter实现定时关机
2021/04/21 Python