二分法
二分法
# 基础算法(二分法)
# 二分法(有序排列)
l=[-3,5,6,8,10,16,24,45,87]
def binary_search(find_num,list_1):
mid_val=len(list_1)//2
if len(list_1)==0:
print('找的值不存在')
return
if find_num>list_1[mid_val]: #这是比列表的值而不是比索引
list_1=list_1[mid_val+1:] 在if阶段值已经被比较过了 所以要加一
binary_search(find_num,list_1)
elif find_num<list_1[mid_val]:
list_1=list_1[:mid_val]
binary_search(find_num,list_1)
else:
print("find it")
binary_search(11,l)
# 如果列表无序 可用.sort()排序后再进行查找
面向过程
优点: 就是过程分析再编写 (编程源于此)将复杂的问题流程化,进而简单化
缺点:程序的可扩展性极差,因为一套流水线或者流程就是用来解决一个问题,就好比生产汽水的流水线无法生产汽车一样,即便是能,也得是大改,而且改一个组件,与其相关的组件可能都需要修改
”面向过程“核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么......,基于面向过程开发程序就好比在设计一条流水线,是一种机械式的思维方式,这正好契合计算机的运行原理:任何程序的执行最终都需要转换成cpu的指令流水按过程调度执行,即无论采用什么语言、无论依据何种编程范式设计出的程序,最终的执行都是过程式的。
# 函数式编程
# lambda map reduce filter
匿名函数
# 1、定义
lambda x,y,z:x+y+z
#等同于
def func(x,y,z):
return x+y+z
# 2、调用
# 方式一:
res=(lambda x,y,z:x+y+z)(1,2,3)
# 方式二:
func=lambda x,y,z:x+y+z # “匿名”的本质就是要没有名字,所以此处为匿名函数指定名字是没有意义的
res=func(1,2,3)
# 函数式编程
# lambda map reduce filter
# 匿名函数 #产生一个函数地址(带括号是调用 不带是地址)
# # lambda 参数:函数体代码 (自带return)
#
# 匿名函数 调用方式一
# # res=(lambda 参数:函数体代码) (传参)
# 调用方式二
# func=lambda 参数:函数体代码
# func() #脱裤子放屁 这是匿名函数
# 匿名函数的运用场景
# amx(迭代) #同于list 和sum
# 字符串比大小是ascll a<b
# key是max和min固定接收函数的
# max(可迭代列表等,key=func(等迭代出的值)) #同list mun
#min(可迭代列表等,key=func(等迭代出的值)) 记住 func在里面是不用()的 可在外定义函数def func(是max可迭代列表等迭代出来的值当作参数)意思如下:
# -----------------------------------------------------------------------max和min的应用
# max(可迭代列表等,key=func)
# 例题
# res=max(可迭代列表等,key=lambda k:可迭代列表等[k]) #字典取值最大值和lambda的合并使用传给规定的值key= key会把得到的值做比较然后输出最大的k
# print(res)
# --------------------------------------------------------------------sorted(排序)的应用
# sorted 排序的使用
# res=sorted([3,5,6,87,546,5,54,3])
# print(res)
# sorted(可迭代列表等,key=lambda k:可迭代列表等[k] ,reverse=True(反过来排可以没有默认) ) #字典的比对方法()
#
# 了解
# # --------------------------------------------------------------------------map映射
# l=['alex','lxx','wxx','xxq']
# res=map(返回到函数,l)
# # ----------------------------------------------------------------------------filter 返回True 才会输出
# l=['alex','lxx','wxx','xxq']
# res=map(返回到函数,l)
# # ----------------------------------------------------------------------------reduce 累加
# l=['alex','lxx','wxx','xxq']
reduce函数可以接收三个参数,一个是函数,第二个是可迭代对象,第三个是初始值
# res=map(返回到函数,l,初始值)
# 初始值+l所有累加
模块即调用
# 什么是模块
# 模块是工具的集合
# 防止代码冗余()
# 放置在模块内的话可以共享
# 模块的命名是规范小写字母加下划线
# 包:就是文件内有__init__.py的叫包
# 导入模块
# import ***as***起别名 (名字长的话使用)
# # import(导入) foo(模块名)
# # import foof,fuc,asd(可以连着声明 但是不建议) 用逗号分隔
# 推荐
# import time (内置模块放置第一)
# import 第三方模块 (第三方放置第二)
# import foo (自定义模块是放最后)
#
# 2,调用模块、
# 首次导入会运行函数一次
第一次导入模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件
# 模块函数调用的取值也是按定义的时候决定的
# 模块名.调用函数名
# 例如 foo.func()带括号可以传参 不带括号返回函数的内存地址要next()得出结果
# 可以在局部调用在在局部使用
# 指名道姓的调用
# 加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,
# 所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x,
# 执行foo.get()或foo.change()操作的都是源文件中的全局变量x。