zoukankan      html  css  js  c++  java
  • 内置函数、匿名函数、递归函数、二分查找

    一、内置函数sorted()、map()、max()、min()、filter()

    1、sorted()

    sorted(iterable,key,reverse) 用于排序

    key:排序的规则

    reverse:默认是升序排序、reverse=True 是降序排列

    1 l=["aaaaa","bcxzcjkjk","suagfu","a","sdsal","sada"]
    2 def func(x):
    3     return len(x)
    4 f=sorted(l,key=func)
    5 print(f)

    运行流程:把可迭代对象的每一个元素赋值给key函数来执行,根据函数的返回值来进行排序

    2、filter(function,iterable)过滤

    将可迭代对象中的元素赋值给函数,根据条件筛选,返回True留下,返回False过滤

    1 lst=["张丽丽","张帅","王华"]
    2 f=filter(lambda el:el[0]!="",lst)
    3 print(list(f))

    3、map(function,iterable)映射函数

    将可迭代对象中的元素赋值给函数,返回值就是处理结果

    f=map(lambda x:x**2,[0,1,2,3,4])
    print(f)
    print(list(f))

    二、匿名函数

    1、lambda 匿名函数

      lambda 参数: 返回值(函数名统一都叫lambda)

    f=lambda x:x**2
    f(n)

    传值计算参数的平方

    三、递归函数()

    1、持续打印输出,自己调用自己

    1 def func():
    2     print("这是一个递归函数")
    3     func()
    4 func()

    2、输出某一个磁盘下的文件夹的所有文件

     1 import os
     2 def func(filepath, n): # d:/sylar/
     3     # 1,打开这个文件夹
     4     files = os.listdir(filepath)
     5     # 2. 拿到每一个文件名
     6     for file in files:  # 文件名
     7         # 3. 获取到路径
     8         f_d = os.path.join(filepath, file) # d:/sylar/文件名/
     9         # 4. 判断是否是文件夹
    10         if os.path.isdir(f_d):
    11             # 5. 如果是文件夹. 继续再来一遍
    12             print("	"*n, file,":") # 打印文件名
    13             func(f_d, n + 1)
    14         else:   #  不是文件夹. 普通文件
    15             print("	"*n, file)
    16 
    17 func("d:/sylar",0)

     四、二分查找

    查找列表的某个值

    方法一

    1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789 ]
    2 n = 79
    3 
    4 for el in lst:
    5     if el == n: # O(1)
    6         print("找到了")
    7         break
    8 else:
    9     print("没有")

    方法二

     1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
     2 def func(n, left, right):
     3     if left <= right: # 边界
     4         print("哈哈")
     5         mid = (left + right)//2
     6         if n > lst[mid]:
     7             left = mid + 1
     8             return func(n, left, right) # 递归  递归的入口
     9         elif n < lst[mid]:
    10             right = mid - 1
    11             # 深坑. 函数的返回值返回给调用者
    12             return func(n, left, right)    # 递归
    13         elif n == lst[mid]:
    14             print("找到了")
    15             return mid
    16             # return  # 通过return返回. 终止递归
    17     else:
    18         print("没有这个数") # 递归的出口
    19         return -1 # 1, 索引+ 2, 什么都不返回, None
    20 # 找66, 左边界:0,  右边界是:len(lst) - 1
    21 ret = func(70, 0, len(lst) - 1)
    22 print(ret) # 不是None

    方法三

     1 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
     2 
     3 n = 88
     4 #
     5 left = 0
     6 right = len(lst)-1
     7 
     8 while left <= right: # 边界, 当右边比左边还小的时候退出循环
     9     mid = (left + right)//2 # 必须是整除. 因为索引没有小数
    10     if lst[mid] > n:
    11         right = mid - 1
    12     if lst[mid] < n:
    13         left = mid + 1
    14     if lst[mid] == n:
    15         print("找到了这个数")
    16         break
    17 else:
    18     print("没有这个数")

     注:map() zip() filter() 返回的是迭代对象 sorted() 返回的是列表

  • 相关阅读:
    BZOJ5194: [Usaco2018 Feb]Snow Boots(排序&set)(可线段树优化)
    BZOJ5280: [Usaco2018 Open]Milking Order(二分+拓扑)
    BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)
    BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)
    【NOIP2013】传染病控制
    bzoj 2754: [SCOI2012]喵星球上的点名
    bzoj 4197: [Noi2015]寿司晚宴
    Codeforces Round #438 B. Race Against Time
    Codeforces Round #438 C. Qualification Rounds
    Codeforces Round #438 D. Huge Strings
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9481807.html
Copyright © 2011-2022 走看看