码迷,mamicode.com
首页 > 其他好文 > 详细

函数相关概念

时间:2017-10-22 23:31:45      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:它的   pre   property   oba   cto   out   计算机科学   **kwargs   本地   

高阶函数

  • ?数学概念 y=g(f(x))
  • ?在数学和计算机科学中,高阶函数应当至少满足下面一个条件的函数

??条件1. 接受一个或多个函数作为参数
??条件2. 输出一个函数

  举例:

  def counter(base):
    def inc(step=1):
      nonlocal base #修改外部变量base,赋值需要nonlocal
      base += step
      return base
    return inc

  foo = counter(5)
  foo1 = counter(5)

  print(foo == foo1) #False

  print(id(foo),foo)
  print(id(foo1),foo1)

  

 

柯里化

  • ??指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
  • ??z = f(x,y) 转换成 z = f(x)(y)的形式

   举例:

??  有这样一个add函数

???  def add(x,y):    #柯里化成 add(x)(y) 的格式
???  ?return x + y

    将此函数柯里化

    def add(x):
        def _add(y):
            return x + y
        return _add

    foo = add(7)   #等同于 add(7)(8)
    print(foo(8))

  

闭包?

  •   函数中用到了外层变量就形成了闭包,如果想对外层变量修改,可以使用 global 或者 nonlocal 声明。

 

自由变量

  • ?对闭包来说外层变量就是自由变量,不在本地作用域的变量。


装饰器(无参)

  • ?装饰器本身是一个函数
  • ?需要一个函数作为它的形参
  • ?返回值也是一个函数
  • ?可以使用@functionname 方式,简化调用,语法糖
  • ?也是高阶函数,两个条件都满足,但装饰器是对传入函数的功能的装饰(功能增强)

 举例:

	def logger(fn):
		def _logger(*args,**kwargs):
			print(‘before‘)
			ret = fn(*args,**kwargs)
			print(‘after‘)
			return ret
		return _logger

	@logger   # add = logger(add)
	def add(x,y):
		return x + y


	print(add(5,600))

  

带参装饰器:

  •   装饰器返回的是内层函数的引用

  举例:

	import functools
	import datetime
	import time


	def copy_property(src):
		def _copy_property(dst):
			dst.__name__ = src.__name__
			dst.__doc__ = src.__doc__
			#dst.__qualname__ = src.__qualname__    #限定名
			return dst
		return _copy_property

	def timeoutTip(t):
		def logger(func):
			#@functools.wraps(func)
			@copy_property(func)
			def wrapper(*args, **kwargs):
				‘‘‘test2‘‘‘
				# before 功能增强
				start = datetime.datetime.now()
				# print(‘Call:{}()  StartTime:{} nowDescription:{}‘.format(func.__name__,start,func.__doc__),end=‘\t\t‘)
				print(‘Call:{}()‘.format(func.__name__), end=‘\t\t‘)
				ret = func(*args,**kwargs)
				# after 功能增强
				stopTime = (datetime.datetime.now() - start).total_seconds()

				if stopTime > t:
					print(‘Timeout time:{} ‘.format(stopTime))
				return ret

			# copy_property(func, wrapper)
			return wrapper
		return logger

	@timeoutTip(2)  #带参装饰器与不带参装饰器的区别
	def add(x,y):
		‘‘‘test1‘‘‘
		#time.sleep(3)
		print(‘returnValue = x+y‘)
		return x+y

	print(add(100,y=200))
	print(add.__doc__,add.__qualname__)

  

 

函数相关概念

标签:它的   pre   property   oba   cto   out   计算机科学   **kwargs   本地   

原文地址:http://www.cnblogs.com/i-honey/p/7712159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!