zoukankan      html  css  js  c++  java
  • 几个用到能很方便的函数和递归与二分法

    出师未捷身先死

    多的是你不知道得事

    昨天主要讲解了68个内置函数

    今日 主要内容

    1. Lambda 匿名函数

    Lambda 参数:  返回值

    函数名称统一都叫 lambda

    2,sorted()排序函数

    排序函数

    Sorted(iterable,key,reverse)

    Key:表示排序规则

    运行流程:把可迭代对中的每一个元素交给前面的函数进行筛选,

    函数返回True或者False

    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)

    1. Filter()过滤函数

    Filter(function,iterable)

    把可迭代对象的每一个元素交给前面的函数进行筛选,

    函数返回True或者False

     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))

    1. Mao()映射函数

    Map(function,iterable)

    把可迭代对象的每一个数据交给前面的函数进行执行,

    返回值就是map的结果 一对一进行处理

    lst = [1,4,7,2,5,8]

     计算列表中没个数字的平方

     ll = []

     for el in lst:

         ll.append(el**2)

     def func(el):

         return el**2

     m = map(lambda el: el**2, lst) # 把后面的可迭代对象中的每一个元素传递给function, 结果就是function的返回值

     print(list(m))

     print("__iter__" in dir(m))

     分而治之

     map(func1, map(func2, map(func3 , lst)))

     lst1 = [1, 3, 5, 7]

     lst2 = [2, 4, 6, 8, 10]

     # 水桶效应, zip()

     m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6])

     print(list(m))

    5  递归

    函数自己调用自己

    最大深度:1000.到不了1000自己就停下来了

    Import sys

    Sys.....

    归函数, 自己调用自己

     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(" "*n, file,":") # 打印文件名

                 func(f_d, n + 1)

             else:   #  不是文件夹. 普通文件

                 print(" "*n, file)

     func("d:/sylar",0)

    1. 二分法

    核心:捏头去尾留中间.一次砍一半

    俩种算法:常规循环,递归循环

    Dic={“5”:”1”,”6”:”1”}

    时间复杂度最低,空间复杂度最低

    Lst1=[5,6,7,8]

    Lst2=[0,0,0,0,1,1,1,1]

    For c in lst1:

    Lst2[c]=1

    Lst2[4]==1

     使用二分法可以提高效率, 前提条件:有序序列

     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) - 1

    ret = func(70, 0, len(lst) - 1)

    print(ret)  不是None

  • 相关阅读:
    Stanford NLP 第六课: Long Short Term Memory
    Stanford NLP 第五课: RNN Vanishing Gradient Problems Details
    Stanford NLP 第四课 神经网络复习
    Stanford cs224n 第三课: GloVe 代码解读
    Stanford CS224N 第二课: word2vec踩坑经验分享
    秒杀抢购系统优化思路详解
    微服务的事件驱动数据管理方案
    Netty与网络编程
    Netty 学习 一、初识Netty【原创】
    高性能Server---Reactor模型【转载】
  • 原文地址:https://www.cnblogs.com/zzy7372/p/9481600.html
Copyright © 2011-2022 走看看