20、面向函数与匿名函数及模块

一、算法之二分法

  算法是一种快速解决问题的方法

  前提:有一个按照顺序排列的列表

     需要从里面取出我们需要的值

1.1、已知

nums=[-3,4,7,10,13,21,43,77,89]
find_num=10

1.2、已学方法    通过循环遍历全部元素找到值,效率低

for num in nums:         #循环取值
    if num == find_num:       #判断是否为目标值
        print('find it')         
        break

1.3、二分法

def binary_search(find_num,l):   #设定函数名,
    print(l)          #查看列表
    if len(l) == 0:     #判断剩余列表是否存在
        print('找的值不存在')    
        return        #退出
    mid_index=len(l) // 2         #列表长度的一半为中间值

    if find_num > l[mid_index]:     
        # 接下来的查找应该是在列表的右半部分
        l=l[mid_index+1:]          #中间值的右边到末尾
        binary_search(find_num,l)    #重复执行函数,将变量传递给函数
    elif find_num < l[mid_index]:
        # 接下来的查找应该是在列表的左半部分
        l=l[:mid_index]           #开头到中间值
        binary_search(find_num,l)    #重复执行函数,将变量传递给函数
    else:
        print('find it')            #找到要找的目标

binary_search(find_num,nums)     # 启动函数

二、面向过程

2.1、面向过程的编程思想

  核心是过程两个字,过程就是流程,指的是先做什么,后做什么

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

2.2、优缺点

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

  缺点:扩展性差

2.3、面向过程的编程思想应用场景

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

  即便是一根程序需要频繁更迭,也不代表这个软件需要需求全部都要更迭

三、匿名函数

3.1、lambda和def的区别  

  def适用于有定义的函数

  而没有定义的函数就是用lambda

def func(x,y):
    return x+y    
#也可以用lambda
print(lamdab x,y:x+y)

3.2、调用匿名函数

3.2.1、方式一  使用print调用

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

3.2.2、方式二:通常匿名函数是使用通过其他函数调用

func=lambda x,y:x+y
res=func(1,2)   #通过函数赋值
print(res)

四、匿名函数的使用

4.1、找出薪资最高的那个人     内置函数max的应用

salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000

res=max(salaries,key=lambda k:salaries[k])
print(res)
#     内置函数max,先遍历变量salaries,去出值。
                           再四设定匿名函数key=lambda  K      k为变量
                            最后return salaries[k]          取出value给匿名函数

4.2、薪资最低的人       内置函数min的应用

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

4.3、排序             按照从小到大的顺序排列sorted

        从大到小则是反序,末尾加上reverse=True

res=sorted(salaries,key=lambda k:salaries[k])
print(res)        #正序 从小到大
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)          #  反序 从大到小

4.4、  简化for循环    map的使用(了解)

l=['alex','lxx','wxx','薛贤妻']
new_l=(name+'_dsb' for name in l)   #方案一
print(list(new_l))

res=map(lambda name:name+'_dsb',l)   #方案二  map简化for循环
print(res) # 生成器

4.5、  if判断      filter的使用(了解)

l=['alex_sb','lxx_sb','wxx','薛贤妻']
res=(name for name in l if name.endswith('sb'))  
print(res)

res=filter(lambda name:name.endswith('sb'),l)   # 代替if判断  True
print(res)
#输出的都是生成器

4.6、  合并    refuce的应用(了解)

from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3],10) # 16
print(res)     #合并数值,求和

res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'
print(res)      #合并字符,变成字符串

五、模块

5.1、什么是模块

  模块是一系列功能的集合体,分为三类

  1.内置模块

  2.第三方模块

  3.自定义模块

5.2、模块的四种形式

  1.使用python编写的.py文件,例如:文件名为m.py,模块名为m

  2.已经编译好的共享库或者用DLL的c或者c++扩展  (不常用)

  3.把一系列的模块组织到一个文件夹内,文件夹内必须有__init__.py的文件,该文件夹称为包

  4.用c语言编写,并且连接到Python解释器的内置模块

5.3、为什么要有模块

  1.内置的模块以及第三方模块,无需定义,可以直接使用,可以极大的提升开发效率

  2.自定义模块:可以将程序内的部分功能提取到一个模块中,为其他函数共用

         减少了代码冗余,程序更加清晰

5.4、怎么使用模块

  1.使用impot  模块名,引用

5.5、模块名的定义

  和变量名一样,使用小写加上下划线组成

5.6、可以在函数内倒入模块

def func():
    import foo

 

        

 

posted @ 2020-03-26 21:26  疏星淡月  阅读(129)  评论(0编辑  收藏  举报