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

    一 lambda 匿名函数(一句话函数)

    1 匿名函数的语法:    lambda 参数: 返回值

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

    注意: 1 函数的参数可以有多个,多个参数之间用逗号隔开

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

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

    3 匿名函数并不是没有名字 ,原因是通过__name__查看的时候是没有名字的,统一都叫lambda

    1 def func(n):
    2      return n*n    求9的平方
    3 ret=func(9)
    4 print(ret)
    5 
    6 结果:81
    普通函数求平方
    1 a=lambda x,y:1,2      因为1,2没有拿括号括起来 所以前面lambda x,y:1 被看作一部分
    2 print(a)
    3 
    4 结果:(<function <lambda> at 0x000001AA9C241E18>, 2)
    匿名函数中的面试笔试题
    1 a=lambda n:n*n
    2 ret=a(9)
    3 print(ret)
    4 
    5 结果:81
    匿名函数
    1 print(func.__name__)  查看函数的名字
    2 
    3 print(a.__name__)   __name__的值都是<lambda>   所有的匿名函数中的变量的__name__值都统一是lambda
    查看函数的名字
    1 fn=lambda *args:max(args)
    2 print(fn(12,3,4,6,7,88))
    3 
    4 
    5 结果:88
    比较两数的大小,返回最大值


     

    二 sorted()排序函数

    1 排序函数的语法:  sorted(iterable,key,reverse)

        iterable:可迭代对象

        key:排序规则(排序函数),把可迭代对象中的每一个元素教给后面的key函数来执行.得到一个数字(权重),通过这个数字来进行排序

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

    1 lst=[1,4,66,77,33,25,56]
    2 lst.sort()     lst中的方法
    3 print(lst)
    4 
    5 结果:[1,4,25,33,56,66,77]
    list中的排序方法
    1 lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]
    2 def func(s):
    3      return len(s)
    4 
    5 l=sorted(lst,key=func)
    6 print(l)
    7 
    8 
    9 结果:['聊斋', '年轮', '亮剑', '西游记', '葫芦娃', '水浒传', '三国演义']
    排序
     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 ll=sorted(lst,key=lambda el:len(el['name'],reverse=True) 按姓名长度从长到短来排序 ,最长的在前面
    10 print(ll)
    11 
    12 
    13 结果:
    14 [{'name': 'wusir', 'age': 32}, {'name': 'alex', 'age': 39}, {'name': '章子怡', 'age': 38}, {'name': '赵一宁', 'age': 28}, {'name': '汪峰', 'age': 48}]
    字典中姓名按长度来排序

    三 filter()过滤函数

    1 过滤函数的语法:filter(function,iterable)

        function:用来筛选的函数,把可迭代对象中的每一个元素交给前面的函数进行筛选,函数返回True或者False

       iterable:可迭代对象

     1 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]   取不是姓张的
     2 s=[]
     3 def func(lst):
     4       if el[0]=='':
     5           pass
     6       else:
     7           s.append(el)
     8 func(lst)
     9 print(s)
    10 
    11 
    12 结果:['赵一宁', '石可心', '马大帅']
    按姓进行筛选(用普通函数)
     1 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]
     2 f=filter(lambda el:el[0]!=张,lst)   
     3 print(f)                  获取到的是地址:    <filter object at 0x000002A7DE1295F8>
     4 
     5 print("__iter__"in dir(f))    判断是否可以进行可迭代
     6 
     7 for e in f:
     8      print(e)
     9 
    10 
    11 
    12 结果:
    13 赵一宁
    14 石可心
    15 马大帅
    按姓进行筛选
     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)    小于60分的
     9 print(list(f))         把过滤掉的放到list列表中  因为list中是可迭代对象 里面有__iter__
    10 
    11 结果:[{'name': '汪峰', 'score': 48}, {'name': '章子怡', 'score': 39}]
    字典中过滤

    四 map()映射函数

    1 映射函数的语法:map(function,iterable)

    2 把可迭代对象中的数据交给前面的函数进行执行,返回值就是map的处理结果

    1 # lst = [1,4,7,2,5,8]
    2 ll=[]
    3 for i in lst:
    4     ll.append(i**2)
    5 print(ll)
    6 
    7 
    8 结果:[1, 16, 49, 4, 25, 64]
    普通for算法 计算列表中每个数字的平方
    1 lst = [1,4,7,2,5,8]
    2 m=map(lambda el:el**2,lst)
    3 print(list(m)
    4 
    5 
    6 结果:[1, 16, 49, 4, 25, 64]
    7 
    8 
    9 print("__iter__" in dir(m))   判断是否可迭代
    映射函数中的算列表中每个数字的平方

    分而治之:map(fun1,map(fun2,map(func3,lst)))

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

    五 递归 :函数自己调用自己

    最大深度:1000 到不了1000就停了

     1 counnt =1
     2 def func():
     3      global count
     4      print("alex很帅",count)
     5     count =count+1
     6     func()
     7 func()
     8 
     9 结果:
    10 alex是很帅的  1
    11 alex是很帅的 995
    12 alex是很帅的 996
    13 alex是很帅的 997
    14 alex是很帅的 998Traceback (most recent call last):
    15 
    16 结果只能算到998 ,因为递归的深度最大是1000 不会到1000
    递归函数
     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   查找79在不在列表中
    3 
    4 for el in lst:
    5      if el==n:
    6          print("找到了")
    7 else:
    8    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          mid=(left+right)//2
     5      if n >lst[mid]:
     6          left =mid+1
     7          return func(n,left,right)    递归 递归的入口
     8      elif n <lst[mid]:
     9          right = mid - 1
    10             # 深坑. 函数的返回值返回给调用者
    11             return func(n, left, right)    # 递归
    12      elif n == lst[mid]:
    13             print("找到了")
    14             return mid
    15             # return  # 通过return返回. 终止递归
    16       else:
    17         print("没有这个数") # 递归的出口
    18         return -1 # 1, 索引+ 2, 什么都不返回, None
    19 # 找66, 左边界:0,  右边界是:len(lst) - 1
    20 ret = func(70, 0, len(lst) - 1)
    21 print(ret) # 不是None
    二分法查找
  • 相关阅读:
    jQuery学习之过滤选择器
    ASP.net WebAPI 上传图片
    Mono for Android 显示远程图片
    C#引用非托管.dll
    c# 反射
    storyboard 中tableview 中的cell 手动更改高度 报错的解决办法。
    我也来开了博客记录我的开发之路
    openlayers点击地图图标,图标跳动 动画Demo实现 (复制内容至html文件可查看效果)
    element 分页多选表格换页时保留勾选数据---reverse-selection
    表单输入不显示,input弹窗选择不带回,角色不同样式差异等问题,可能的思路
  • 原文地址:https://www.cnblogs.com/mlhz/p/9483005.html
Copyright © 2011-2022 走看看