设为首页 收藏本站
查看: 745|回复: 0

[经验分享] Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数

[复制链接]

尚未签到

发表于 2015-11-30 09:30:22 | 显示全部楼层 |阅读模式
  高阶函数Higher-orderfunction
  
  变量可以指向函数
  >>> abs #abs(-10)是函数调用,而abs是函数本身
  <built-in function abs>
  >>> f = abs #函数本身也可以赋值给变量
  >>> f #变量可以指向函数
  <built-in function abs>
  >>> f(-10) #变量调用函数
  10
  函数名也是变量
  >>> abs = 10
  >>> abs(-10) #把abs指向10后,无法通过abs(-10)调用该函数
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: 'int' object is not callable
  传入函数
  既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
  >>> def add(x, y, f):
  return f(x) + f(y)
  >>> add(-1,-2,abs)
  map
  map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:
  >>> def f(x):
  return x * x
  >>> map(f, [1, 2, 3, 4, 5, 6, 7,8, 9]) #第一个参数是f,即函数对象本身
  [1, 4, 9, 16, 25, 36, 49, 64, 81]
  
  >>> map(str, [1, 2, 3, 4, 5, 6, 7,8, 9]) #把这个list所有数字转为字符串
  ['1', '2', '3', '4', '5', '6', '7', '8','9']
  
  reduce(...)
  reduce(function, sequence[, initial]) -> value
  
  Apply a function of two arguments cumulatively to the items of asequence,from left to right, so as to reduce the sequence to a single value.
  For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates((((1+2)+3)+4)+5). If initial ispresent, it is placed before the items of the sequence in the calculation, and serves as a default whenthe sequence is empty.
  
  >>> def add(x, y):
  return x + y
  >>> reduce(add, [1, 3, 5, 7, 9])
  25
  
  def str2int(s):#把str转换为str2int
  def fn(x, y):
  return x * 10 + y
  def char2num(s):
  return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,'8': 8, '9': 9}
  return reduce(fn, map(char2num, s))
  
  filter
  filter(...)
  filter(function or None, sequence) -> list, tuple, or string
  Return those items of sequence for which function(item) is true. If
  function is None, return the items that are true. If sequence is a tuple
  or string, return the same type, else return a list.
  def is_odd(n):#list中,删掉偶数
  return n % 2 == 1
  filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
  
  def not_empty(s):#序列中的空字符串删掉
  return s and s.strip()
  filter(not_empty, ['A', '', 'B', None, 'C',' '])
  
  sorted
  sorted(iterable, cmp=None, key=None,reverse=False) --> new sorted list
  
  >>> def reversed_cmp(x, y):#倒序排序
  if x > y:
  return -1
  if x < y:
  return 1
  return 0
  
  >>> sorted([36, 5, 12, 9, 21],reversed_cmp)
  [36, 21, 12, 9, 5]
  
  >>> def cmp_ignore_case(s1, s2):#忽略大小写来比较两个字符串
  u1 = s1.upper()
  u2 = s2.upper()
  if u1 < u2:
  return -1
  if u1 > u2:
  return 1
  return 0
  
  >>> sorted(['bob', 'about', 'Zoo','Credit'], cmp_ignore_case)
  ['about', 'bob', 'Credit', 'Zoo']
  返回函数
  
  def calc_sum(*args):#可变参数的求和
  ax = 0
  for n in args:
  ax = ax + n
  return ax
  
  不需要立刻求和,而是在后面的代码中,根据需要再计算.
  def lazy_sum(*args):
  def sum():#又定义了函数sum
  ax = 0
  for n in args:
  ax = ax + n#引用外部函数lazy_sum的参数和局部变量
  return ax#这种程序结构称为“闭包
  return sum
  >>> f = lazy_sum(1, 3, 5, 7, 9)
  >>> f
  <function sum at 0x10452f668>
  >>> f()
  25
  >>> f1 = lazy_sum(1, 3, 5, 7, 9)
  >>> f2 = lazy_sum(1, 3, 5, 7, 9)
  >>> f1==f2#每次调用都会返回一个新的函数,结果互不影响
  False
  
  匿名函数
  
  >>> map(lambda x: x * x, [1, 2, 3,4, 5, 6, 7, 8, 9])
  [1, 4, 9, 16, 25, 36, 49, 64, 81]
  匿名函数lambda x: x * x实际上就是:
  def f(x):
  return x * x
  
  >>> f = lambda x: x * x#把匿名函数赋值给一个变量,再利用变量来调用该函数
  >>> f
  <function <lambda> at0x10453d7d0>
  >>> f(5)
  25
  装饰器
  decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:
  def log(func):#decorator
  def wrapper(*args, **kw):
  print 'call %s():' % func.__name__
  return func(*args, **kw)
  return wrapper
  @log#把decorator置于函数的定义处
  def now():
  print '2013-12-25'
  >>> now()
  call now():#运行now()函数前打印一行日志
  2013-12-25
  def log(text):#自定义log的文本
  def decorator(func):
  def wrapper(*args, **kw):
  print '%s %s():' % (text,func.__name__)
  return func(*args, **kw)
  return wrapper
  return decorator
  @log('execute')#3层嵌套的decorator用法
  def now():
  print '2013-12-25'
  偏函数Partial function
  
  >>> int('12345', base=8)#传入base参数,就可以做N进制的转换
  5349
  def int2(x, base=2):#定义int2()函数,默认把base=2传进去
  return int(x, base)
  >>> int2('1000000')
  64
  functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:
  >>> import functools
  >>> int2 = functools.partial(int,base=2)
  >>> int2('1000000')
  64
  functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

  求关注 求扩散

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145170-1-1.html 上篇帖子: python解析Yahoo的XML格式的天气预报,获取当天和近期几天的天气: 下篇帖子: Python DES 加密解密,就是大家所谓想要的那个非常快速的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表