二分法 面向过程思想 函数式

一 二分法

算法:是高效解决问题的办法

需求:有一个按照从小到大顺序排列的数字列表,需要从该里诶博爱中找到我们想要的那个数字

方法一:整理遍历效率太低

nums=[-3,4,7,10,13,21,43,77,89]
def func(x, nums):
for i in nums:
  	if x == i:
    	print('find it')
    	break

func(10,nums)

方法二:二分法

伪代码:
def binary_seach(find_num, 列表): #find_num 为要找的数字
  	if 列表 == 0:
      	print('该值不存在')
        return
    mid_val= len(列表)//2 #mid_val为列表中间元素索引
    if find_num > nums[mid_val]:
      	#若大于的话,说明要找的数字在列表的右半部分
       	列表 = 列表[mid_val+1:]
        binary_seach(find_num, 列表)
    elif: find_num < nums[mid_val]:
         #若小于的话,说明要找的数字在列表的左半部分
         列表 = 列表[:mid_val-1]
         binary_seach(find_num, 列表)
     
    else:
      	print('find it')
        
binary_num(10, nums) 

具体:

def func_num(find_num, nums, count):
    if len(nums) == 0:
        return
    mid_val = len(nums)//2
    if find_num > nums[mid_val]:
        print('######')
        nums = nums[mid_val+1:]
        count +=1
        func_num(find_num, nums, count)
    elif find_num < nums[mid_val]:
        print('----')
        nums = nums[:mid_val]
        count += 1
        func_num(find_num, nums, count)
    else:
        print(f'第{count}次 find it ')

func_num(10, nums,1)

结果展示:
----
######
----
第4次 find it 

二 面向过程的编程思想

核心是'过程'二字,过程即流程,指的是做事的步骤:先什么、再什么、后干什么

基于该思想编写程序就好比设计一条流水线

优点:复杂的问题流程化,进而简单化

缺点:扩展性差

面向过程的编程思想应用场景解析:

1、不是所有的软件都需要频繁更迭:比如编写脚本

2、即便是一个软件需要频繁更迭,也并不代表这个软件所有的组成部分都需要一起更迭

三 函数式

函数式编程并非用函数编程这么简单,而是将计算机的运算视为数学意义上的运算,比起面向过程,函数式更加注重的是执行结果而非执行的过程,代表语言有:Haskell、Erlang。

1、lambda 匿名函数

lambda 关键字创建的是是没有名字的函数,即匿名函数

1、 def 用于定义函数

func = 函数的内存地址
def func(x, y):
  	return x+y
print(func)#内存地址

2、lambda 用于定义匿名函数

print(lambda x, y: x+y)

匿名函数与有冥函数有相同的作用域,但是匿名函数使用一次就自动释放了,其引用计数为 0,所以匿名函数通常用于临时使用一次的场景。

3、调用匿名函数

方式一:

res = (lambdax,y :x+y)(1,2)
print(res)

方式二:

func= lambdax, y:x+y
res = func(1,2)
print(res)

2、匿名函数的应用

一般匿名函数不会单独使用的,主要是为将匿名函数与其他函数配合使用

1 max应用

需求1:找出薪资最高的那个人=》lili

salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
# 迭代出的内容    比较的值
# 'siry'         3000
# 'tom'          7000
# 'lili'         10000
# 'jack'         2000

第一种方法:

def func(k):
  	return salaris[k]
  
res = max(salaries, key= func) #返回值= func('salary迭代出的元素')
print(res) #lili

第二种方法:

使用 lambda 匿名函数

res = max(salaries, key= lambda x: salaries[x])
print(res)#lili

max 会将可迭代对象迭代取出,按照 key 的值进行比较来取最大值

2 min应用

取最小值功能

res=min(salaries,key=lambda k:salaries[k])
print(res)

3 sorted的应用

排序功能

res=sorted(salaries,key=lambda k:salaries[k],reverse=True) #reverse= True :降序 ;  False or 不写:默认升序
print(res) 

4 reduce 的应用

reduce:将可迭代对象中元素取出后与初始值(r如果不写默认为 0)一一进行合并,最终返回为一个值。

fron functools import reduce
res = reduce(lambda x : x+y, [1,2,3], 10) # 10w为初始化值,如果不写默认为 0
print(res) #16

res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'
print(res) #abc

猜你喜欢

转载自www.cnblogs.com/xy-han/p/12577443.html