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()
    # 运行结果如下:
    函数开始执行.....
    天卓金榜题名
    函数执行结束.....
    函数开始执行.....
    助你榜上有名
    函数执行结束.....
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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