zoukankan      html  css  js  c++  java
  • 匿名函数,递归

    一,lambda 匿名函数

         lambda 参数: 返回值

    #匿名就是没有名字
    def func(x,y,z=1):
        return x+y+z
    
    #匿名
    lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
    func=lambda x,y,z=1:x+y+z 
    func(1,2,3)
    #让其有名字就没有意义
    # 普通的正常的函数
    def func(n):
        return n * n
    ret = func(9)
    print(ret)
    
    # 匿名函数, 语法: lambda 参数: 返回值
    a = lambda n : n * n
    ret = a(9)
    print(ret)
    b = lambda x: x+1
    print(a(5)) # 函数的名字可以认为是a

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

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

    
    

    二,sorted() 排序函数

     sorted(iterable, key, reverse)

     1,  Iterable: 可迭代对象
     2,  key: 排序规则.
            运行流程: 把可迭代对象中的每一个元素交给后面key函数来执行.
     后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序

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

    lst = [1,5,3,4,6]
    lst2 = sorted(lst)
    print(lst) # 原列表不会改变
    print(lst2) # 返回的新列表是经过排序的
    dic = {1:'A', 3:'C', 2:'B'}
    print(sorted(dic)) # 如果是字典. 则返回排序过后的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)
      把可迭代对象中的每一个元素交给前面的函数进行筛选. 函数返回True或者False

    lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]
    # 筛选,不要姓张的
    f = filter(lambda el: el[0]!="", lst) # 将lst中的每一项传递给func, 所有返回True的都会保留, 
    所有返回False都会被过滤掉
    print("__iter__" in dir(f)) # 判断是否可以进行迭代 for e in f: print(e)
    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) # 筛选年龄大于16的数据
    print(list(fl))

    四,map() 映射函数

          语法: map(function, iterable) 可以对可迭代对象中的每一个元素进行映射.

    分别取执行function ,返回值就是map的处理结果

    #计算列表中每个元素的平方 ,返回新列表
    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)))

    五. 递归

      在函数中调用函数本身. 就是递归

    def func():
      print("我是谁")
        func()
    func()

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

    # 递归深度. 你可以自己掉用自己的次数,
    # 官方文档中递归最大深度是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)
  • 相关阅读:
    [网络流24题]飞行员配对方案问题
    bzoj 1571: [Usaco2009 Open]滑雪课
    bzoj 1001: [BeiJing2006]狼抓兔子
    bzoj 1711: [Usaco2007 Open]Dining吃饭
    bzoj 3379: [Usaco2004 Open]Turning in Homework 交作业
    bzoj 1412: [ZJOI2009]狼和羊的故事
    luogu P1345 [USACO5.4]奶牛的电信Telecowmunication
    hdu1512 Monkey King
    [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
    [BZOJ4824][CQOI2017]老C的键盘(树形DP)
  • 原文地址:https://www.cnblogs.com/zwq-/p/9482293.html
Copyright © 2011-2022 走看看