Python 函数3

函数3

  1. 函数的递归

    • 本质就是自己调用自己

    • 关键是要知道什么时候停止或者继续递归的条件

    • 核心是知道递归公式

      count=0
      def tell_story():
          global count        #声明是全局变量
          count+=1
          print('从前有座山')
          print('山上里有座庙')
          print('庙里有一个老和尚')
          print('还有一个小和尚')
          print('老和尚在给小和尚讲故事')
          print('故事的内容是')
          if count<5:          #规定递归条件
              tell_story()     #调用自己
      
      tell_story()
      
      #使用递归求前n项的和
      def get_sum(n):
          if n==0:
              return 0             #规定了停止的条件
          return get_sum(n-1)+n    #递归公式,当可以返回具体值的时候,就不在递归
      print(get_sum(100))
      
      #使用递归求斐波那契数列的第n个数
      def a(n):
          if n==1:
              return 1
          elif n==2:
              return 1
          return a(n-1)+a(n-2)
      print(a(12))
      
      
  2. 匿名函数:没有名字的函数

    • 除了使用关键字def定义一个函数我们还可以使用关键字lambda定义一个匿名函数

    • 格式 lambda 参数 : 语句

    • 关于匿名函数的调用

      • 给匿名函数起一个名字(不常用)
      • 将匿名函数作为参数传递给另一个函数
    • 函数作为一个参数传递给另一个函数

      lambda x,y:x*y
      mu=lambda x,y:x*y   #给函数起一个名字,如果函数已经有名字,就相当于起了一个别名
      print(mu(4, 5))
      
      
      
      
      #要求用户输入,指定的参数,对两个数做加减乘除
      #将函数作为一个参数传递给另一个函数
      # def add(a,b):
      #     return a+b
      # def minus(a,b):
      #     return a-b
      # def plus(a,b):
      #     return a*b
      # def chu(a,b):
      #     return a/b
      # print(cac(5, 6, add))
      # print(cac(12,13,minus))
      # print(cac(6,2,chu))
      # print(cac(4,5,plus))
      
      
      #可以直接将将匿名函数作为参数传递给另一个函数
      a=3
      b=2
      cac(a,b,lambda a,b:a+b)
      cac(a,b,lambda a,b:a-b)
      cac(a,b,lambda a,b:a*b)
      cac(a,b,lambda a,b:a/b)
      
  3. sort方法的使用

    • sort是将原来的列表直接排序,sorted函数是排序完,返回一个新列表

    • 字典不支持比较运算

    • 使用sort方法可以给可迭代对象排序,但不支持直接给字典排序,需要给出比较规则

    • 可以通过key给出比较规则

    • sort方法在调用key得到的函数时,需要调用这个函数返回的一个参数

    • key对应的函数需要是有一个返回值的函数

      students=[{'name':'zhangsan','age':26,'tel':'15895898270','sex':'male','score':100},
               {'name':'Jack','age':12,'tel':'15895812345','sex':'female','score':99},
               {'name':'Marry','age':17,'tel':'15895888888','sex':'female','score':100},
      ]
      # students.sort()  #会报错
      # print(students)  
      
      def foo(ele):
          return ele['age']    #定义了一个返回值函数,
      #students.sort(key=foo)   # 告诉我们需要按照“age”进行排序
      students.sort(key=lambda ele:ele['age']) #因为函数简单,所以可以用匿名函数写
      print(students)
      
  4. filter内置类:是过滤器,过滤掉一些元素

    • 需要两个参数,第一个是函数,第二个是可迭代对象

    • 函数遍历可迭代对象中的元素,返回bool值,如果True就保留,如果是False就会被过滤掉

    • 最终返回一个filter类型的数据,是一个可迭代对象

      age=[12,19,13,30,25,24,26,28,31,17]
      def foo(ele):
              return ele%2==0
      filter(foo, age) #直接按照函数过滤掉一些元素,并返回这个列表
      print(filter(foo, age))
      print(list(filter(foo, age)))
      
      #result
      <filter object at 0x00000000024EC5C8>
      [12, 30, 24, 26, 28]
      
  5. map内置类:对可迭代对象里面的每个元素都操作一下

    • 需要两个参数,第一个是函数,第二个是可迭代对象

    • 将可迭代对象中的每一个元素都执行一下函数,然后返回新的值

    • 返回的是一个map的类型的数据,是一个可迭代对象

      age=[12,19,13,30,25,24,26,28,31,17]
      def foo(ele):
          return ele+3
      #print(type(map(foo, age)))
      x=map(foo,age)
      print(x)
      print(list(x))
      
      #result
      <map object at 0x00000000024BC6C8>
      [15, 22, 16, 33, 28, 27, 29, 31, 34, 20]
      
  6. reduce:需要导入模块 from functools import reduce

    • 需要两个参数:第一个是需要有两个参数的函数,第二个是一个可迭代对象

    • 将可迭代的对象的的前两个元素作为参数执行函数得到的结果作为第一个参数,而可迭代对象的下一个元素作为第二个参数,再执行函数,…依次类推,直到遍历完可迭代对象.可以给第一个参数设置初始值

      from functools import reduce
      age=[1,2,3,4,5,6,7]
      def add(x,y):
          return x+y
      print(reduce(add, age))
      students=[{'name':'zhangsan','age':26,'tel':'15895898270','sex':'male','score':100},
               {'name':'Jack','age':12,'tel':'15895812345','sex':'female','score':99},
               {'name':'Marry','age':17,'tel':'15895888888','sex':'female','score':100},
               ]
      # def add_age(x,y):      #会报错,因为在完成第一个操作后,x已经变成了一个数字了不再是字典
      #     return x['age']+y['age']
      # reduce(add,students)
      #添加一个初始值
      def add_age(x,y):
          return x+y['age']
      
      print(reduce(add_age, students,0))   #设置x的值永远是0
      
  7. 高阶函数

    • 函数作为另一个函数的参数

    • 函数作为另一个函数的返回值

      函数作为另一个函数的返回值
      #3.函数里面在定义一个函数
      def test():
          print('hello')
          return test        #返回的是test这个函数,但不调用
          #return test()     #返回会继续调用test这个函数
      
      def demo():
          print('nihao')
          return test       #返回的是test这个函数,但不调用
      x=test()
      print(x)
      demo()
      print('--------')
      demo()()             #demo()返回了test,再加一个()就相当于调用了test
      
      #reslut
      hello
      <function test at 0x00000000024F5EE8>
      nihao
      --------
      nihao
      hello
      
    • 函数里面在定义一个函数

      • 这个时候里面的函数时不能被函数外识别的
      • 利用nonlocal在内函数里面修改局部变量
      def test():
          print('hello')
          def demo():
              print('world')
          return demo()
      #demo()  #会报错
      test()
      
      #
      def outer():
          print('我是outer函数')
          x=10                   #在函数内部定义了一个局部变量
          def inner():
              print('我是inner函数')
              #nonlocal x       #声明x就是inner函数外部的局部变量x
              x=20              #这不是修改局部变量x,而是在inner函数里又创建了一个新的变量
              y=x+1
              print(y)
              print('inner函数内的地址ox%X'%id(x))
      
          print('inner函数外的地址ox%X'%id(x))
          return inner
      outer()()
      #result
      我是outer函数
      inner函数外的地址ox7FEE1257230
      我是inner函数
      21
      inner函数内的地址ox7FEE1257370
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值