python-函数式编程

Python语言的高级特性

函数式编程(FunctionalProgramming)

  • 基于lambda演算的一种编程方式
    • 程序中只有函数
    • 函数可以作为参数,同样可作为返回值
    • 纯函数式编程语言:LISP,Haskell
  • Python函数式编程只是借鉴函数式编程的一些特点,可以理解为一半函数式一半Python
  • 需要讲述
    • 高阶函数
    • 返回函数
    • 匿名函数
    • 装饰器
    • 偏函数

lambda表达式-

  • 函数:最大程度复用代码
    • 存在问题:如果函数很小,很短,则会在成啰嗦
    • 如果函数被调用次数少,则会造成浪费
    • 对于阅读者来说,造成阅读流程的被迫中断
  • lambda表达式(匿名函数)
    • 一个表达式,函数体相对简单
    • 不是一个代码块,仅仅是一个表达式
    • 可以有参数,有多个参数也可以,用逗号隔开
  • lambda表达式的用法
    • 1.以lambda开头
    • 2.紧跟一定的参数(如果有的话)
    • 3.参数后用冒号和表达式主题隔开
    • 4.只是一个表达式,所以没有return

高阶函数

  • 把函数作为参数使用的函数,叫高阶函数

     #变量可以赋值
     a = 100
     b = a
     
     #函数名称就是一个变量
     def funA():
     	print("In funA")
     funB = funA
     funB()
    
  • 以上代码得出结论

    • 函数名称是变量
    • funB 和 funA只是名称不一样而已
    • 既然函数名称是变量,则应该可以被当成参数传入另一个函数

系统高阶函数-map

  • 原意就是映射,即吧集合或者列表中的元素,每个元素都按照一定规则进行从操作,生成一个新的列表或者集合
  • map函数是系统提供的具有映射功能的函数,返回是一个迭代对象

系统高阶函数-reduce

  • 原意是归并,缩减
  • 把一个可迭代对象最后归并成一个结果
  • 对于作为参数的函数要求:必须由两个参数。必须有返回结果
  • reduce([1,2,3,4,5])==f(f(f(f(1,2),3),4),5)
  • reduce需要导入funtools包

系统高阶函数-filter

  • 过滤函数:对一组数据进行过滤,符合条件的数据生成一个新的列表并返回
  • 跟map相比较:
    • 相同:都对列表的每一个元素逐一进行操作
    • 不同:
      • map会生成一个跟原来数据相对应的xinduilie
      • filter不一定,只要符合条件的才会进入新的数据集合
  • filter函数怎么写
    • 利用给定函数进行判断
    • 返回值一定是布尔值
    • 调用格式:filter(f,data),f是过滤函数,data是数据

高阶函数-排序

  • 把一个序列按照给定算法进行排序
  • key:在排序前对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序
  • python2 和 python3 相差极大

返回函数

  • 函数可以返回具体的值

  • 也可以返回一个函数作为结果

  • 函数作为返回值返回,被返回的函数在函数体内定义

      def  myF2():
      	def  myF3():
      		print("In my3")
      		return 3
      	return myF3
      #使用以上定义,调用myF2,返回一个函数myF3,赋值给f3
      f3 = myF2()
      print(type())
      print(f3)
      f3()
    

闭包(closure)

  • 当一个函数在内部定义函数,并且内部函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包

      #闭包常见坑
      def  count():
      	#定义列表,列表中存放的是定义的函数
      	fs = []
      	for i  in  range(1,4):
      		#定义了一个函数f,f是一个闭包结构
      		def  f():
      			return i * i
      		fs.append(f)
      	return  fs
      	f1,f2,f3 = count()
      	print(f1())
      	print(f2())
      	print(f3())
    
  • 出现的问题:

  • 造成上述状况的原因是,返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一,此时已经变成了3,最终调用的时候,都返回的是3*3

  • 此问题描述成:返回闭包时,返回函数不能引用任何循环变量

  • 解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何变换,已经绑定的函数参数值不再改变

      def  count2():
      	def  f(j):
      		def  g():
      			return  j * j
      		renturn  g
      	fs = []
      	for i  in  range(1,4):
      		fs.append(f(i))
      	return  fs
      
      f1,f2,f3 = count2()
      print(f1())
      print(f2())
      print(f3())
    

装饰器

  • 对已有函数的功能进行扩展,而实现这个功能又不能改动现有代码,这时使用装饰器

装饰器(Decrator)

  • 在不改动函数代码的基础上无限扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数

  • 装饰器的使用:使用@语法,即在每次要扩展到函数定义前使用@+函数名

      #对hello函数进行功能扩展,每次执行hello时打印当前时间
      import  time
      # 高阶函数,以函数作为参数
      def  printTime(f):
      	def  wrapper(*args, **kwargs):
      		print("time:" , time.ctime())
      		return  f(*args, **kwargs)
      	return  wrapper
      
    
      #上面定义了装饰器,使用的时候需要用到@,此符号是python的语法糖
      @printTime
      def  hello():
      	print("Hello world")
      hello()
    

#装饰器的好处是,一旦定义,则可以装饰任意函数
#一旦被其装饰,则把装饰器的功能直接添加到定义函数的功能上

	#上面对函数的装饰使用了系统定义的语法糖
	#下面开始手动执行装饰器,先定义函数
	def  hello3():
		print("我是手动执行的")
	hello3()
	hello3 = printTime(hello3)
	hello3()
	
	f = printTime(hello3)
	f()

偏函数

  • 参数固定的函数,相当于一个由特定参数的函数体

  • functools.partial的作用是,把一个函数某些函数固定,返回一个新函数

      #新建一个函数,此函数是默认输入的字符串是16进制数字
      #此字符串返回十进制的数字
      def  int16(x, base = 16):
      	return  int(x, base)
    
      import  functools
      #实现上面int16的功能
      int16 = functools.partial(int, base = 16)
      int16("12345")
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值