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内置常用高阶函数(列出了5个常用的)

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

  3. Python内置进制转换函数(实现16进制和ASCII转换)

    在进行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()

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

  8. Python内置函数二 (递归函数,匿名函数,二分法)

    匿名函数 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. uva-11129-分治

    题意:对于一个0-(N-1)的等差数列,求其中一个排列Q,使得任意0<=i,j,k<n 时,ai,aj,ak不是等差数列. 解法:考虑0-(N-1)这个等差数列,假设公差为K,那么数列如下 ...

  2. python学习笔记_week13

    一.前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是堡垒机所具备的功能属性中的 ...

  3. java abstract构造函数调用

    构造函数是对象的基本,没有构造函数就没有对象.如果在父类中(这里就是你的抽象类)中显示的写了有参数的构造函数,在子类继承是就必须写一个构造函数来调用父类的构造函数 public abstract cl ...

  4. 04.给linux用户添加sudo权限

    linux给用户添加sudo权限: 有时候,linux下面运行sudo命令,会提示类似: xxxis not in the sudoers file.  This incident will be r ...

  5. leetcode212

    class Solution { public List<String> findWords(char[][] board, String[] words) { List<Strin ...

  6. Linux swap 使用

    使用的背景 内存吃紧的时候可以考虑使用swap. swap新增 http://www.cnblogs.com/wuxie1989/p/5888595.html swap 使用 https://www. ...

  7. mysql存储过程使用游标循环插入数据

    DELIMITER $$ DROP PROCEDURE IF EXISTS `procedure_course`$$ CREATE DEFINER=`root`@`localhost` PROCEDU ...

  8. js删除dom节点时候索引出错问题

    我们知道删除一个dom节点的时候索引就会发生了改变,甚至是错误,就算jq的ecah也无能为力,所以我们只能自己写个功能了 直接上代码把,不多说 <!DOCTYPE html> <ht ...

  9. git 和 github 学习总结

    https://mp.weixin.qq.com/s?src=11&timestamp=1543302553&ver=1269&signature=NAX65qusuVVDEl ...

  10. 固定顶部指定div不滑动

    .fixed_div { position:fixed; z-index:100; top: 45px; width:100%; height:45px; } 指定div设置属性position:fi ...