zoukankan      html  css  js  c++  java
  • 内置函数二

    一丶lambda匿名函数

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

    1 # 计算n的n次⽅
    2 def func(n):
    3   return n**n
    4 print(func(10))
    5 
    6 
    7 f = lambda n: n**n
    8 print(f(10))
    lambda

    lambda表⽰的是匿名函数. 不需要⽤def来声明, ⼀句话就可以声明出⼀个函数

      语法:
        函数名 = lambda 参数: 返回值

      注意:   
        1. 函数的参数可以有多个. 多个参数之间⽤逗号隔开
        2. 匿名函数不管多复杂. 只能写⼀⾏, 且逻辑结束后直接返回数据
        3. 返回值和正常的函数⼀样, 可以是任意数据类型

    print(a(5)) # 函数的名字可以认为是a
    
    print(func.__name__) # 查看函数的名字
    print(a.__name__) # __name__的值都是<lambda>
    __name__
    匿名函数, 给函数传递2给参数. 返回最大值
    fn = lambda *args: max(args) # 单行函数
    
    print(fn(1,2,5,2,3,4,156,3,2,2,4,5,56,34,34,34,34,88))
    返回最大值

    二丶Sorted()

    排序函数.
      语法: sorted(Iterable, key=None, reverse=False)

    Iterable: 可迭代对象 

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

    reverse: 是否是倒叙. True: 倒叙 False: 正序

    1 lst = [1,5,3,4,6]
    2 lst2 = sorted(lst)
    3 print(lst) # 原列表不会改变
    4 print(lst2) # 返回的新列表是经过排序的
    5 dic = {1:'A', 3:'C', 2:'B'}
    6 print(sorted(dic)) # 如果是字典. 则返回排序过后的ke
    实例
    1 # 根据字符串⻓度进⾏排序
    2 lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
    3 # 计算字符串⻓度
    4 def func(s):
    5   return len(s)
    6 print(sorted(lst, key=func))
    和函数组合使用
     1 # 根据字符串⻓度进⾏排序
     2 lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
     3 # 计算字符串⻓度
     4 def func(s):
     5   return len(s)
     6 print(sorted(lst, key=lambda s: len(s)))
     7 lst = [{"id":1, "name":'alex', "age":18},
     8   {"id":2, "name":'wusir', "age":16},
     9   {"id":3, "name":'taibai', "age":17}]
    10 # 按照年龄对学⽣信息进⾏排序
    11 print(sorted(lst, key=lambda e: e['age']))
    和lambda组合使用
     1 lst = [
     2     {'name':"汪峰","age":48},
     3     {"name":"章子怡",'age':38},
     4     {"name":"alex","age":39},
     5     {"name":"wusir","age":32},
     6     {"name":"赵一宁","age":28}
     7     ]
     8 
     9 
    10 
    11 ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)
    12 print(ll)
    练习

    三丶filter()

    筛选函数
    语法: filter(function. Iterable)

    function: ⽤来筛选的函数. 在filter中会⾃动的把iterable中的元素传递给function. 然后
    根据function返回的True或者Fales来判断是否保留此项数据

    Iterable: 可迭代对象

    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)
    筛选
     1 lst = [
     2     {"name":"汪峰", "score":48},
     3     {"name":"章子怡", "score":39},
     4     {"name":"赵一宁","score":97},
     5     {"name":"石可心","score":90}
     6 ]
     7 
     8 f = filter(lambda el: el['score'] < 60 , lst) # 去16期的人
     9 
    10 print(list(f))
    练习

    四丶map

     映射函数

    语法: map(function, iterable) 可以对可迭代对象中的每⼀个元素进⾏映射. 分别取执⾏
    function

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

    1 def func(e):
    2   return e*e
    3 mp = map(func, [1, 2, 3, 4, 5])
    4 print(mp)
    5 print(list(mp))
    计算平方

    改写成lambda

    1 print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))
    模拟

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

    1 # 计算两个列表相同位置的数据的和
    2 lst1 = [1, 2, 3, 4, 5]
    3 lst2 = [2, 4, 6, 8, 10]
    4 print(list(map(lambda x, y: x+y, lst1, lst2)))

    水桶效应

    1 lst1 = [1, 3, 5, 7]
    2 lst2 = [2, 4, 6, 8, 10]
    3 # 水桶效应, zip()
    4 m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6])
    5 print(list(m))
    水桶

    五丶递归

    在函数中调⽤函数本⾝. 就是递归

    1 def func():
    2   print("我是谁")
    3   func()
    4 func()
    递归

    在python中递归的深度最⼤到1000  各不相同

    1 def foo(n):
    2   print(n)
    3   n += 1
    4   foo(n)
    5 foo(1)
    深度

     遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名

     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 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 n = 567
     3 left = 0
     4 right = len(lst) - 1
     5 count = 1
     6 while left <= right:
     7  middle = (left + right) // 2
     8  if n < lst[middle]:
     9  right = middle - 1
    10  elif n > lst[middle]:
    11  left = middle + 1
    12  else:
    13  print(count)
    14  print(middle)
    15  break
    16  count = count + 1
    17 else:
    18  print("不存在")   
    非递归算法

    另类二分法 

     1 def binary_search(ls, target):
     2  left = 0
     3  right = len(ls) - 1
     4  if left > right:
     5  print("不在这⾥")
     6  middle = (left + right) // 2
     7  if target < ls[middle]:
     8  return binary_search(ls[:middle], target)
     9  elif target > ls[middle]:
    10  return binary_search(ls[middle+1:], target)
    11  else:
    12  print("在这⾥")
    13 binary_search(lst, 567)
    另类二分法

     最快的查找

    1  # 时间复杂度最低, 空间复杂度最低
    2         lst1 = [5,6,7,8]
    3         lst2 = [0,0,0,0,0,1,1,1,1]
    4         for el in lst1:
    5             lst2[el] = 1
    6 
    7         lst2[4] == 1   # o(1)
    复杂度最低
  • 相关阅读:
    java基础—面向对象2
    java基础—java读取properties文件
    java基础—super关键字
    java基础—this关键字
    java基础—object类
    java基础—equals方法
    java基础—哈希编码
    Struct2(五)处理表单
    struct2(四)编写Struct2 的Action
    Struct2(三) Struct2 标签
  • 原文地址:https://www.cnblogs.com/xintiao-/p/9481769.html
Copyright © 2011-2022 走看看