内置函数二
一丶lambda匿名函数
为了解决一些简单需求而设计的一句话函数
1 # 计算n的n次⽅ 2 def func(n): 3 return n**n 4 print(func(10)) 5 6 7 f = lambda n: n**n 8 print(f(10))
lambda
lambda表⽰的是匿名函数. 不需要⽤def来声明, ⼀句话就可以声明出⼀个函数
语法:
函数名 = lambda 参数: 返回值
注意:
1. 函数的参数可以有多个. 多个参数之间⽤逗号隔开
2. 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据
3. 返回值和正常的函数⼀样, 可以是任意数据类型
print(a(5)) # 函数的名字可以认为是a print(func.__name__) # 查看函数的名字 print(a.__name__) # __name__的值都是<lambda>
__name__
匿名函数, 给函数传递2给参数. 返回最大值 fn = lambda *args: max(args) # 单行函数 print(fn(1,2,5,2,3,4,156,3,2,2,4,5,56,34,34,34,34,88))
返回最大值
二丶Sorted()
排序函数.
语法: sorted(Iterable, key=None, reverse=False)
Iterable: 可迭代对象
key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每⼀个元素传递给这个函
数的参数. 根据函数运算的结果进⾏排序
reverse: 是否是倒叙. True: 倒叙 False: 正序
1 lst = [1,5,3,4,6] 2 lst2 = sorted(lst) 3 print(lst) # 原列表不会改变 4 print(lst2) # 返回的新列表是经过排序的 5 dic = {1:'A', 3:'C', 2:'B'} 6 print(sorted(dic)) # 如果是字典. 则返回排序过后的ke
实例
1 # 根据字符串⻓度进⾏排序 2 lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"] 3 # 计算字符串⻓度 4 def func(s): 5 return len(s) 6 print(sorted(lst, key=func))
和函数组合使用
1 # 根据字符串⻓度进⾏排序 2 lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"] 3 # 计算字符串⻓度 4 def func(s): 5 return len(s) 6 print(sorted(lst, key=lambda s: len(s))) 7 lst = [{"id":1, "name":'alex', "age":18}, 8 {"id":2, "name":'wusir', "age":16}, 9 {"id":3, "name":'taibai', "age":17}] 10 # 按照年龄对学⽣信息进⾏排序 11 print(sorted(lst, key=lambda e: e['age']))
和lambda组合使用
1 lst = [ 2 {'name':"汪峰","age":48}, 3 {"name":"章子怡",'age':38}, 4 {"name":"alex","age":39}, 5 {"name":"wusir","age":32}, 6 {"name":"赵一宁","age":28} 7 ] 8 9 10 11 ll = sorted(lst, key=lambda el: len(el['name']), reverse=True) 12 print(ll)
练习
三丶filter()
筛选函数
语法: filter(function. Iterable)
function: ⽤来筛选的函数. 在filter中会⾃动的把iterable中的元素传递给function. 然后
根据function返回的True或者Fales来判断是否保留此项数据
Iterable: 可迭代对象
lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"] def func(el): if el[0] == '张': return False # 不想要的 else: return True # 想要的 筛选, f = filter(lambda el: el[0]!="张", lst) # 将lst中的每一项传递给func, 所有返回True的都会保留, 所有返回False都会被过滤掉 print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f: print(e)
筛选
1 lst = [ 2 {"name":"汪峰", "score":48}, 3 {"name":"章子怡", "score":39}, 4 {"name":"赵一宁","score":97}, 5 {"name":"石可心","score":90} 6 ] 7 8 f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人 9 10 print(list(f))
练习
四丶map
映射函数
语法: map(function, iterable) 可以对可迭代对象中的每⼀个元素进⾏映射. 分别取执⾏
function
计算列表中每个元素的平⽅ ,返回新列表
1 def func(e): 2 return e*e 3 mp = map(func, [1, 2, 3, 4, 5]) 4 print(mp) 5 print(list(mp))
计算平方
改写成lambda
1 print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))
模拟
计算两个列表中相同位置的数据的和
1 # 计算两个列表相同位置的数据的和 2 lst1 = [1, 2, 3, 4, 5] 3 lst2 = [2, 4, 6, 8, 10] 4 print(list(map(lambda x, y: x+y, lst1, lst2)))
和
水桶效应
1 lst1 = [1, 3, 5, 7] 2 lst2 = [2, 4, 6, 8, 10] 3 # 水桶效应, zip() 4 m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6]) 5 print(list(m))
水桶
五丶递归
在函数中调⽤函数本⾝. 就是递归
1 def func(): 2 print("我是谁") 3 func() 4 func()
递归
在python中递归的深度最⼤到1000 各不相同
1 def foo(n): 2 print(n) 3 n += 1 4 foo(n) 5 foo(1)
深度
遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名
1 import os 2 def func(filepath, n): # d:/sylar/ 3 # 1,打开这个文件夹 4 files = os.listdir(filepath) 5 # 2. 拿到每一个文件名 6 for file in files: # 文件名 7 # 3. 获取到路径 8 f_d = os.path.join(filepath, file) # d:/sylar/文件名/ 9 # 4. 判断是否是文件夹 10 if os.path.isdir(f_d): 11 # 5. 如果是文件夹. 继续再来一遍 12 print("\t"*n, file,":") # 打印文件名 13 func(f_d, n + 1) 14 else: # 不是文件夹. 普通文件 15 print("\t"*n, file) 16 17 func("d:/sylar",0)
利用递归来遍历文件件中所有文件
六丶二分查找
⼆分查找. 每次能够排除掉⼀半的数据. 查找的效率非常⾼. 但是局限性比较⼤. 必须是有
序序列才可以使⽤⼆分查找
核心: 掐头去尾取中间. 一次砍一半
两种算法: 常规循环, 递归循环
要求: 查找的序列必须是有序序列.
递归来完成二分法
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789] 2 def func(n, left, right): 3 if left <= right: # 边界 4 print("哈哈") 5 mid = (left + right)//2 6 if n > lst[mid]: 7 left = mid + 1 8 return func(n, left, right) # 递归 递归的入口 9 elif n < lst[mid]: 10 right = mid - 1 11 # 深坑. 函数的返回值返回给调用者 12 return func(n, left, right) # 递归 13 elif n == lst[mid]: 14 print("找到了") 15 return mid 16 # return # 通过return返回. 终止递归 17 else: 18 print("没有这个数") # 递归的出口 19 return -1 # 1, 索引+ 2, 什么都不返回, None 20 # 找66, 左边界:0, 右边界是:len(lst) - 1 21 ret = func(70, 0, len(lst) - 1) 22 print(ret) # 不是None
二分法
⼆分查找⾮递归算法
1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789] 2 n = 567 3 left = 0 4 right = len(lst) - 1 5 count = 1 6 while left <= right: 7 middle = (left + right) // 2 8 if n < lst[middle]: 9 right = middle - 1 10 elif n > lst[middle]: 11 left = middle + 1 12 else: 13 print(count) 14 print(middle) 15 break 16 count = count + 1 17 else: 18 print("不存在")
非递归算法
另类二分法
1 def binary_search(ls, target): 2 left = 0 3 right = len(ls) - 1 4 if left > right: 5 print("不在这⾥") 6 middle = (left + right) // 2 7 if target < ls[middle]: 8 return binary_search(ls[:middle], target) 9 elif target > ls[middle]: 10 return binary_search(ls[middle+1:], target) 11 else: 12 print("在这⾥") 13 binary_search(lst, 567)
另类二分法
最快的查找
1 # 时间复杂度最低, 空间复杂度最低 2 lst1 = [5,6,7,8] 3 lst2 = [0,0,0,0,0,1,1,1,1] 4 for el in lst1: 5 lst2[el] = 1 6 7 lst2[4] == 1 # o(1)
复杂度最低