zoukankan      html  css  js  c++  java
  • py 的 第 15 天

    一 

    匿名函数

    lamda匿名函数

    为了解决一些简单的需求而设计的一句话函数

    lambda表示的是匿名函数,不需要用def来声明。一句话就可以声明出一个函数

    语法:

        函数名=lambda 参数:返回值

    注意:

    1函数的参数可以有多个。多个参数之间用逗号隔开

    2匿名函数不管多复杂。只能写一行,且逻辑结束后直接返回数据

    3返回值和正常的函数一样,可以是任意数据类型

    匿名函数并不是说一定没有名字,这里前面的变量就是一个函数名,说他是匿名的原因是我们通过__name__查看的时候是没有名字的,统一都加lambda,在调用的时候没有什么特别之处,像正常的函数调用即可。

    二   sorted()

    排序函数。

    语法:sorted(lterable,key=None,reverse=False)

    lterable:可迭代对象

    key:排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数。根据函数运算的结果进行排序

    reverse:是否是倒叙。True:倒叙,False:正序

    字典返回排序后的key

    和函数组合使用


    # 根据字符串长度进行排序
    lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]

    # 计算字符串串⻓长度def func(s):

        return len(s)
    print(sorted(lst, key=func))              一定要加个key 很不理解,硬性规定?

    和lambda一起使用

    # 根据字符串长度进行排序
    lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]

    # 计算字符串长度def func(s):

        return len(s)
    print(sorted(lst, key=lambda s: len(s)))
    
    
    
    lst = [{"id":1, "name":'alex', "age":18},
           {"id":2, "name":'wusir', "age":16},
           {"id":3, "name":'taibai', "age":17}]
    

    # 按照年龄对学⽣信息进行排序
    print(sorted(lst, key=lambda e: e['age']))

    三。filter
    筛选函数
    语法:filter(function,iterable)
    function:用来筛选的函数。在filter中会自动的把iterable(可迭代的)中的元素传递给function(函数)然后跟俊function传递回来的值返回Ture或Fales来判断是否保留此数据

    iterable:可迭代对象


    lst = [1,2,3,4,5,6,7]
    ll = filter(lambda x: x%2==0, lst) # 筛选所有的偶数print(ll)

    print(list(ll))
    
    lst = [{"id":1, "name":'alex', "age":18},
           {"id":2, "name":'wusir', "age":16},
           {"id":3, "name":'taibai', "age":17}]
    
    fl = filter(lambda e: e['age'] > 16, lst)
    print(list(fl))
    

    # 筛选年年龄⼤大于16的数据

    四  map()
    映射函数
    语法:map(function,iterable)可以对可迭代对象中的每一个元素进行映射,分别取执行function

    计算列列表中每个元素的平⽅方 ,返回新列列表

    def func(e):
        return e*e
    
    mp = map(func, [1, 2, 3, 4, 5])
    print(mp)
    print(list(mp))
    
    改写成lambda
    print(list(map(lambda x:x**X,【1,2,3,4,5】)))

    计算列表中两个相同位置的数据的和

    lst1 = [1, 2, 3, 4, 5]
    lst2 = [2, 4, 6, 8, 10]
    print(list(map(lambda x, y: x+y, lst1, lst2)))

    五,递归

    在函数中调用函数本身

    在python中递归的深度最大为998

    def  f(n):
      print(n)
      n+=1
      f(n)
    f(1)
    递归的应用:
    我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统,可以使用递归来遍历该文件夹中的所有的文件

    import  os

    def read(filepath, n):
      files = os.listdir(filepath) # 获取到当前⽂文件夹中的所有⽂文件

      for fi in files: # 遍历⽂文件夹中的⽂文件, 这⾥里里获取的只是本层⽂文件名

        fi_d = os.path.join(filepath,fi) # 加⼊入⽂文件夹 获取到⽂文件夹+⽂文件

        if os.path.isdir(fi_d): # 如果该路路径下的⽂文件是⽂文件夹                  这几个os  模块 一会问问再说,这个说是没讲呢,问了问也没啥好答案

                print("	"*n, fi)
    
                read(fi_d, n+1)           #继续进行相同的操作
            else:
    
                print("	"*n, fi)        #递归出口,最终在这里隐含着return
    

    #递归遍历⽬目录下所有⽂文件

    read('../oldboy/', 0)

    六,二分查找

         二分查找,每次能排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序序列才能2分法

        要求:查找的序列必须是有序序例

    普通版本的

    def binary_search(n, left, right,c):
    # c = 1
    if left <= right:

    middle = (left+right) // 2
    if n < lst[middle]:
    # global c
    c+=1
    right = middle - 1
    elif n > lst[middle]:
    c+=1
    left = middle + 1
    else:
    return middle,c

    return binary_search(n, left, right,c)
    # 不写个1到的永远是None.
    else:
    return -1
    print(binary_search(567, 0, len(lst) - 1,1))
    切片版本的,很难计算位置 即使我加了一个变量,在里面跑也是不行
    def binary_search(ls, target,c):
    left = 0
    right = len(ls) - 1
    if left > right:
    print("不在这里")
    middle = (left + right) // 2
    if target < ls[middle]:
    c+=1
    return binary_search(ls[:middle], target,c)
    elif target > ls[middle]:
    c+=1
    return binary_search(ls[middle+1:], target,c)
    else:
    print(middle,c)
    binary_search(lst, 567,1)
    最普通的办法

    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
    n = 567
    left = 0
    right = len(lst) - 1
    count = 1
    while left <= right:
    middle = (left + right) // 2
    if n < lst[middle]:
    right = middle - 1
    elif n > lst[middle]:
    left = middle + 1
    else:
    print(count)
    print(middle)
    break
    count = count + 1
    else:
    总结一下匿名函数lambda,排序sorted,筛选filter,映射map。
    匿名函数目前来看就是理解为,里面都是for循环的函数,感觉学了这么多都是循环,
    排序 sorted它是唯一特殊的 sorted(iterable(可迭代对象)key=function函数名 or lambda (这个key是强制规定,不懂原理,上文有解释也不是很清楚,然后i执行,i:i。。。执行每个元素能做的所有,然后reverse排序true且排序是这3里唯一的自己有list的不用外加的

    筛选filter filter(函数名or lambda,元素执行i:i。。。。,iterable(可迭代对象))需要加list
    映射map map(函数名or lambda, 元素执行i:i....,iterable(可迭代对象))需要加list


















  • 相关阅读:
    SPOJ SAMER08A
    SPOJ TRAFFICN
    CS Academy Set Subtraction
    CS Academy Bad Triplet
    CF Round 432 C. Five Dimensional Points
    CF Round 432 B. Arpa and an exam about geometry
    SPOJ INVCNT
    CS Academy Palindromic Tree
    身体训练
    简单瞎搞题
  • 原文地址:https://www.cnblogs.com/Mrszhao/p/9491347.html
Copyright © 2011-2022 走看看