• Python入门day20——二分法、匿名函数、模块


    二分法
    # 算法:是高效解决问题的办法
    # 算法之二分法
    
    # 需求:有一个按照从小到大顺序排列的数字列表
    #      需要从该数字列表中找到我们想要的那个一个数字
    #      如何做更高效???
    
    nums=[-3,4,7,10,13,21,43,77,89]
    find_num=10
    
    nums=[-3,4,13,10,-2,7,89]
    nums.sort()
    print(nums)
    
    # 方案一:整体遍历效率太低
    for num in nums:
        if num == find_num:
            print('find it')
            break
    
    # 方案二:二分法
    def binary_search(find_num,列表):
        mid_val=找列表中间的值
        if find_num > mid_val:
            # 接下来的查找应该是在列表的右半部分
            列表=列表切片右半部分
            binary_search(find_num,列表)
        elif find_num < mid_val:
            # 接下来的查找应该是在列表的左半部分
            列表=列表切片左半部分
            binary_search(find_num,列表)
        else:
            print('find it')
    
    nums=[-3,4,7,10,13,21,43,77,89]
    find_num=8
    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)
    
    匿名函数
    1、def用于定义有名函数
    # func=函数的内存地址
    def func(x,y):
        return x+y
    print(func) #<function func at 0x000002672FBE7F70>
    
    2、lamdab用于定义匿名函数
    print(lambda x,y:x+y) # <function <lambda> at 0x000002672FBE80D0>
    
    3、调用匿名函数
    
    # 方式一:
    res=(lambda x,y:x+y)(1,2)
    print(res) # 3
    
    # 方式二:
    func=lambda x,y:x+y
    res=func(1,2)
    print(res) # 3
    
    #4、匿名用于临时调用一次的场景:更多的是将匿名与其他函数配合使用
    
    #5匿名函数的应用
    salaries={
        'siry':3000,
        'tom':7000,
        'lili':10000,
        'jack':2000
    }
    # 需求1:找出薪资最高的那个人=》lili
    res=max(salaries) 
    print(res) # tom 是迭代salaries里面的key进行比较而不是value
    
    # 迭代出的内容    比较的值
    # 'siry'         3000
    # 'tom'          7000
    # 'lili'         10000
    # 'jack'         2000
    
    # ========================max的应用
    def func(k):
        return salaries[k]
    res=max(salaries,key=func) #  返回值 = func(迭代salaries的key),比较返回值,拿到最大的值对应的迭代salaries的key返回给res
    print(res) # lili
    
    res=max(salaries,key=lambda k:salaries[k])
    print(res) # lili
    
    # ========================min的应用
    res=min(salaries,key=lambda k:salaries[k])
    print(res) # jack
    
    # ========================sorted排序
    res=sorted(salaries,key=lambda k:salaries[k],reverse=True) # reverse为True降序排序,为False升序排序
    print(res) # ['lili', 'tom', 'siry', 'jack']
    
    # ========================map的应用(了解)
    l=['alex','lxx','wxx','123']
    new_l=(name+'_dsb' for name in l)
    print(new_l) # 生成器 <generator object <genexpr> at 0x000001F11D691270>
    
    res=map(lambda name:name+'_dsb',l)
    print(res) # 生成器 <map object at 0x000001F11D6800D0>
    
    # ========================filter的应用(了解)
    l=['alex_sb','lxx_sb','wxx','123']
    res=(name for name in l if name.endswith('sb'))
    print(res)
    
    res=filter(lambda name:name.endswith('sb'),l)
    print(res)
    
    # ========================reduce的应用(了解)
    from functools import reduce
    res=reduce(lambda x,y:x+y,[1,2,3],10) # 10 +1  +2 +3
    print(res) # 16
    
    res=reduce(lambda x,y:x+y,['a','b','c'],'hellosad') # 'a','b'
    print(res) # hellosadabc
    
    模块
    1、什么是模块?
        模块就是一系列功能的集合体,分为三大类
        I:内置的模块
        II:第三方的模块
        III:自定义的模块
        一个python文件本身就一个模块,文件名m.py,模块名叫m
    
        ps:模块有四种形式
        1 使用python编写的.py文件
        2 已被编译为共享库或DLL的C或C++扩展       
        3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)    
        4 使用C编写并链接到python解释器的内置模块
                            
    2、为何有用模块
        I:内置与第三的模块拿来就用,无需定义,这种拿来主义,可以极大地提升自己的开发效率
        II:自定义的模块
            可以将程序的各部分功能提取出来放到一模块中为大家共享使用
            好处是减少了代码冗余,程序组织结构更加清晰
            
    3、如何用模块
    1.import 模块名
    # 1、首次导入模块会发生3件事
    # 1、执行foo.py
    # 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
    # 3、在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间
    
    # foo文件内容
    print('模块foo==>')
    x=1
    def get():
        print(x)
    def change():
        global x
        x=0
    # 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码
    import foo # 产生名称空间,执行foo文件
    import foo # 没有反应
    
    2.引用:
    print(foo.x)
    print(foo.get)
    print(foo.change)
    
    # 结果
    模块foo==>
    1
    <function get at 0x000002347F3A8280>
    <function change at 0x000002347F3A81F0>
    
    # 强调1:模块名.名字,是指名道姓地问某一个模块要名字对应的值,不会与当前名称空间中的名字发生冲突
    x=1111111111111
    print(x) # 1111111111111
    print(foo.x) # 1
    
    # 强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关
    import foo
    
    x=3333333333
    foo.get() # 1
    
    foo.change()
    print(x) # 3333333333
    
    print(foo.x) # 0
    foo.get() # 0
    
    3.可以以逗号为分隔符在一行导入多个模块
    # 建议如下所示导入多个模块
    import time
    import foo
    import m
    
    # 不建议在一行同时导入多个模块
    import time,foo,m
    
    4.导入模块的规范
    #I. python内置模块
    #II. 第三方模块
    #III. 程序员自定义模块
    
    import time
    import sys
    
    import 第三方1
    import 第三方2
    
    import 自定义模块1
    import 自定义模块2
    import 自定义模块3
    
    5.import 。。。 as 。。。
    import foo as f # f=foo
    f.get() # 1
    
    import abcdefgadfadfas
    abcdefgadfadfas.f1
    abcdefgadfadfas.f2
    abcdefgadfadfas.f3
    
    import abcdefgadfadfas as mmm
    mmm.f1
    mmm.f2
    mmm.f3
    
    6.模块是第一类对象
    import foo # foo=》foo的内存地址
    
    7.自定义模块的命名应该采用纯小写+下划线的风格
    
    8.可以在函数内导入模块,只在函数内使用foo的名称空间
    def func():
        import foo
    
  • 相关阅读:
    Scrapy的架构与原理的理解【转】
    Scrapy框架的命令行详解【转】
    WPF 程序中启动和关闭外部.exe程序
    C++ 二维数组(双重指针作为函数参数)
    C++ 遇见的一些函数
    C++ #pragma 预处理指令
    C++异常处理(Exception Handling)
    C++模板学习随笔
    C++ 数组的地址问题学习随笔
    关于C++几个容易混淆的概念总结
  • 原文地址:https://www.cnblogs.com/yding/p/12577406.html
Copyright © 2020-2023  润新知