内置函数
1, lambda 匿名函数
lambda 参数: 返回值 函数名统一都叫lambd# print("你好. 我\\叫周润发") # 对用户是友好的. 非正式的字符串## # 正式(官方)的字符串, 面向对象的时候# print(repr("你好, 我\'叫周润发")) # 程序中内部存储的内容, 这个是给程序员看的# print("我叫%r" % "周润发") # %r 实际上调用的是repr()# 原样输出# print(r"马化腾说:\"哈哈哈, \" \n\t")print("你好") # 用户看着舒服print(repr("你好")) # 真实的字符串表示形式(正式的)__str__()__repr__()
# 普通的正常的函数# def func(n):# return n * n## # ret = func(9)# # print(ret)# ## # # 匿名函数, 语法: lambda 参数: 返回值# a = lambda n : n * n# # ret = a(9)# # print(ret)# b = lambda x: x+1# print(a(5)) # 函数的名字可以认为是a## print(func.__name__) # 查看函数的名字# print(a.__name__) # __name__的值都是# print(b.__name__)# 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# suiyi = lambda x, y : 1, 2 # 笔试题# print(suiyi)# print(suiyi(250,38))# lambda 参数: 返回值# 匿名函数, 给函数传递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))
3. filter() 过滤函数
filter(function, iterable) 把可迭代对象中的每一个元素交给前面的函数进行筛选. 函数返回True或者Falsedef func(): print("你好")def func2(): print("不好")def gn(fn): # fn是一个参数. 根据实参给的值的变化而变化 print(fn.__name__) # func fn()gn(func2)
# lst = [16, 18, 32, 54, 12, 9]# lst.sort() # list的方法# print(lst)# 内置函数中提供了一个通用的排序方案, sorted()# s = sorted(lst)# print(s)# 0 1 0 1 1 0 0# lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]## def func(s):# return len(s)%2## ll = sorted(lst, key=func)## print(ll)# key: 排序方案, sorted函数内部会把可迭代对象中的每一个元素拿出来交给后面的key# 后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序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=True)print(ll)
4. map() 映射函数
map(function, iterable) 把可迭代对象中的数据交给前面的函数进行执行. 返回值就是map的处理结果# 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)# lst = [# {"name":"汪峰", "score":48},# {"name":"章子怡", "score":39},# {"name":"赵一宁","score":97},# {"name":"石可心","score":90}# ]## f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人## print(list(f))
5. 递归
函数自己调用自己 最大深度: 1000 . 到不了1000就停了 import sys sys.setrexxxxx# 递归函数, 自己调用自己# count = 1# def func():# global count# print("alex是很帅的", count)## count = count + 1# func()# func()# 递归深度. 你可以自己掉用自己的次数,# 官方文档中递归最大深度是1000. 在这之前就会给你报错# 遍历 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)
6. 二分法
核心: 掐头去尾取中间. 一次砍一半 两种算法: 常规循环, 递归循环dic = {'5':1,'6':1} o(1)
# 时间复杂度最低, 空间复杂度最低
lst1 = [5,6,7,8] lst2 = [0,0,0,0,0,1,1,1,1] for el in lst1: lst2[el] = 1lst2[4] == 1 # o(1)
# 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: # O(1)# 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: # 边界 print("哈哈") 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 n == lst[mid]: print("找到了") return mid # return # 通过return返回. 终止递归 else: print("没有这个数") # 递归的出口 return -1 # 1, 索引+ 2, 什么都不返回, None# 找66, 左边界:0, 右边界是:len(lst) - 1ret = func(70, 0, len(lst) - 1)print(ret) # 不是None