Python基础-函数三

1. 匿名函数

  • 没有函数名的函数就是匿名函数
  • 语法: 变量名 = lambda 形参列表 : 返回值
  • 说明:
    • 根据实际情况,前面的 “变量名 = ” 可以不要(并非省略)

    • lambda:关键字,固定写法

    • 形参列表:不可以通过 “冒号+类型名” 的方式来说明参数类型(因为 + 和后面的冒号冲突),只能用默认值来设定参数类型,其他和普通函数 的形参列表一样

    • “ : ”:固定写法

    • 返回值:相当于普通函数中 return 后面的语句,只能有一条语句(不能带有 return 的语句),因此有多行代码的普通函数,匿名函数无法实现

        例:
        def func(a,b):
            return a + b
        print(func(1,2))    # 运行结果:  3
        用 lambda 函数表达式表示如下:
        法一:
        x = (lambda a,b : a + b)
        print(x(1,2)           # 运行结果:  3
        法二:
        print((lambda a,b : a + b)(1,2))    # 运行结果:  3
      

2. 高阶函数

  • 可以将其他函数作为参数,或者将函数作为返回值返回的函数就是高阶函数

  • 特点一:函数接收的参数是一个函数名

  • 特点二:返回值中包含函数

       特点一  实例:          
       # 需求一:将一个指定列表中的偶数,保存到一个新的列表中返回
       # 需求二:将一个指定列表中的大于5的数,保存到一个新的列表中返回
       lst = [1,2,3,4,5,6,7,8,9,10]    
       def fn1(a):       # 定义一个函数用来检测任意数的偶数
           if a % 2 == 0:
                return True
           return False
       def fn2(b):      # 定义一个函数用来检测大于5的数
            if b > 5:    
                return True
            return False
       def fn(func, lst):     # 参数 lst 为要进行筛选的列表
           new_lst = []       # 创建一个新的列表
           for i in lst:      # 对要筛选的列表进行遍历
               if func(i):    # 根据需求进行筛选
                   new_lst.append(i)  # 将满足需求的数添加到新的列表中
           return new_lst     # 返回新的列表
        print(fn(fn1, lst))   # 运行结果:  [2, 4, 6, 8, 10]
        print(fn(fn2, lst))   # 运行结果:  [6, 7, 8, 9, 10]
    

2.1 map() 函数

  • 接收两个参数,一个是函数,另一个是 iterable

  • 将传入的函数依次作用到每个元素,并把结果作为新的 iterable 返回

      def f(x):
          return x*x
      m = map(f,[1,2,3,4]) # iterable 是惰性序列,因此通过 list() 函数让它把整个序列都计算出来并返回一个列表
      # m = map(lambda x : x*x, [1,2,3,4])
      print(list(m))    # 运行结果:    [1, 4, 9, 16]
      print(tuple(m))   # 运行结果:    (1, 4, 9, 16)
      print(set(m))     # 运行结果:    {16, 1, 4, 9}  # 不建议用set() 
    

2.2 filter() 函数

  • 接收一个函数和一个序列(可迭代)

  • 将传入的函数依次作用于每个元素,然后根据返回值是 True 和 False 决定保留还是丢弃该元素

      def fn(n):
          return n % 2 == 1
      f = filter(fn,[1,2,3,4,5,6,7,8,9,10])
      # f = filter(lambda n : n % 2 == 1, [1,2,3,4,5,6,7,8,9,10])
      print(list(f))    # 运行结果:    [1, 3, 5, 7, 9]
      print(tuple(f))    # 运行结果:    (1, 3, 5, 7, 9)
      print(set(f))    # 运行结果:    {1, 3, 5, 7, 9}  # 不建议用set()
    

3. 闭包

  • 将函数作为返回值也是⾼阶函数我们也称为闭包

  • 闭包的好处:
    通过闭包可以创建⼀些只有当前函数能访问的变量
    可以将⼀些私有数据藏到闭包中

  • ⾏成闭包的条件:
    函数嵌套
    将内部函数作为返回值返回
    内部函数必须要使⽤到外部函数的变量

      实例:
      def fn1():
          a = 100
          def fn2():
              print("我是fn2函数")    
              return a
          return fn2
      print(fn1()())
      # 运行结果:
      我是fn2函数
      100
    

4. 装饰器的引入

  • 我们可以直接通过修改函数中的代码来完成需求,但是会产⽣以下⼀些问题
    • 如果修改的函数多,修改起来会⽐较麻烦
    • 不方便后期的维护
    • 这样做会违反开闭原则(ocp)
      程序的设计思想:要求开发对程序的扩展,要关闭对程序的修改

5. 装饰器的使用

  • 通过装饰器,可以在不修改原来函数的情况下来对函数进⾏扩展

  • 在开发中,我们都是通过装饰器来扩展函数的功能的

    实例:
    def fn1():
        print("我是fn1函数")
    def fn2(a,b):
        return a + b
    def start_end(old):     # 参数 old 为要扩展的函数对象          
        def new_function(*args,**kwargs):    # 创建一个新的函数
            print('函数开始执行.....')
            r = old(*args,**kwargs)
            print('函数执行结束.....')
            return r
        return new_function      # 返回函数
    print(start_end(fn1)())
    # 运行结果如下:
    函数开始执行......
    我是fn1函数
    函数执行结束......
    None
    
    print(start_end(fn2)(123,456))
     # 运行结果如下:
    函数开始执行......
    函数执行结束......
    579
    
    @start_end
    def speak():
        print('天卓金榜题名')
    
    @start_end
    def listen():
        print('助你榜上有名')
    speak()
    listen()
    # 运行结果如下:
    函数开始执行.....
    天卓金榜题名
    函数执行结束.....
    函数开始执行.....
    助你榜上有名
    函数执行结束.....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 20200206 ##命名空间(namespace) 指的是变量存储的位置,每一个变量都需要存储到指定的命名空间中...
    张腾_1fc4阅读 199评论 0 0
  • Python中什么是set dict的作用是建立一组key和一组value的映射关系,dict的key是不能重复的...
    玺睿siri阅读 536评论 0 0
  • 一、递归 1.1 递归的引用场景 递归是一种编程思想 特点: 函数内部调用函数自己 必须有出口 1.2 应用实例 ...
    ThreeYear_xin阅读 206评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,513评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,803评论 4 1