python 内置函数(二) 进阶函数 递归内容及二分法查找 知识点

时间:2023-01-18 11:33:11

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 内置函数(二) 进阶函数 递归内容及二分法查找 知识点的更多相关文章

  1. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  2. python内置常用高阶函数&lpar;列出了5个常用的&rpar;

    原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...

  3. Python内置进制转换函数&lpar;实现16进制和ASCII转换&rpar;

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...

  4. Python内置的字符串处理函数

    生成字符串变量 str='python String function'   字符串长度获取:len(str) 例:print '%s length=%d' % (str,len(str)) 连接字符 ...

  5. Python 内置的一些高效率函数用法

    1.  filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组 ...

  6. Python内置函数系列

    Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义. 作用域相关(2) locals()  :以字典类型返回当前位置 ...

  7. Python内置高阶函数map&lpar;&rpar;

    map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于lis ...

  8. Python内置函数二 &lpar;递归函数&comma;匿名函数&comma;二分法&rpar;

    匿名函数 lambda() 语法: lambad  参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...

  9. 【Python】Python内置函数dir详解

    1.命令介绍 最近学习并使用了一个python的内置函数dir,首先help一下: 复制代码代码如下: >>> help(dir)Help on built-in function ...

随机推荐

  1. 自己用C语言写dsPIC &sol; PIC24 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). HyperBootlo ...

  2. Java广度优先爬虫示例&lpar;抓取复旦新闻信息&rpar;

    一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...

  3. Spark之scala

    一.什么是scala scala 是基于JVMde 编程语言.JAVA是运行在jvm上的编程语言,java 源代码通过jvm被编译成class 文件,然后在os上运行class 文件.scala是运行 ...

  4. NHibernate系列文章五:NHibernate配置

    摘要 NHibernate有多种配置方法,代码,xml文件,以及Fluent NHibernate.这里只介绍最常用的两种NHibernate配置方法:通过代码和通过配置文件. 1. 通过代码配置 通 ...

  5. Centos php项目发布问题

    LAMP环境,项目运行错误日志路径:/var/log/httpd 错误日志例如: [Sat Jul :: ] [error] [client , referer: http://192.168.100 ...

  6. 使用PowerDesigner 设计SQL Server 数据库

    工具: Sybase PowerDesigner 12.5 Microsoft  SQL Server 2005 第一步:概念数据模型 打开PowerDesigner 软件,设计“概念数据模型”(Co ...

  7. c&num;代码实现GPS数据的有效性校验

    用于校验GPS报文指令的有效性 很简单的代码,留存吧 public static bool Verify(string gpsInfo)         {            if (gpsInf ...

  8. SDWebImage 清除缓存

    1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumerator *file ...

  9. IDEA异常解决&colon; org&period;apache&period;ibatis&period;binding&period;BindingException&colon; Invalid bound statement &lpar;not found&rpar;

    有时候解决问题不仅仅是解决问题.-----jstarseven 最近因为开发需要,需要搭建一个ssm开发框架,采用了开发工具IDEA. 整合完了SSM开发框架之后,发布的时候出现org.apache. ...

  10. Django--post提交表单内容

    本节目标:①.提交表单内容②.通过客户端提交表单新增一篇文章③.通过Django的forms组件来完成新增一篇文章 =======提交表单内容======== 1.前端html:login.html ...