天成1 发表于 2018-8-10 10:57:49

python5

  高阶函数——————sorted
  排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
  排序,排序的核心是比较两个元素的大小。通常规定如下:
  x < y, return -1
  x == y, return 0
  x > y, return 1
  先进入ipython模式,进行以下操作
  1.对元组进行排序
  In : t=(1,2,5,3,43,35,34)
  In : sorted(t)      ##对元组内的元素进行正序排序
  Out:
  In : def reversed_cmp(x,y):
  ...:   if x>y:
  ...:         return -1
  ...:   elif x<y:
  ...:         return 1         ##对元组内的元素进行倒序
  ...:   else:
  ...:         return 0
  ...:
  In : sorted(t,reversed_cmp)
  Out:
  2.对字符串进行排序,按照第一个字符ASCLL码进行排序
  In : li=['zhangxuemeng','westos','wangying','redhat','Redhat']
  In : sorted(li)      ##如果有大写,大写在前,并且大写小于小写
  Out: ['Redhat', 'redhat', 'wangying', 'westos', 'zhangxuemeng']
  In : 'westos'<'zhangxuemeng'
  Out: True
  In : def ignore_case_cmp(x,y):
  ...:   lower1=x.lower()
  ...:   lower2=y.lower()
  ...:   if lower1<lower2:
  ...:         return -1         ##统一按照小写排序
  ...:   elif lower1>lower2:
  ...:         return 1
  ...:   else:
  ...:         return 0
  ...:   sorted(li,ignore_case_cmp)
  ...:
  In : sorted(li,ignore_case_cmp)
  Out: ['redhat', 'Redhat', 'wangying', 'westos', 'zhangxuemeng']
  3.函数作为返回值
  高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
  (1)def wrap_sum(*args):
  def my_sum():
  sum_num=0
  for i inargs:
  if not isinstance(i,(int,float)):
  print 'error type'
  sum_num=sum_num +i
  return sum_num
  return my_sum
  f=wrap_sum(1,2,3,6)
  print f()
  ##调用 warp_sum() 时,返回的并不是求和结果,而是求和函数f()
  ##调用f(),运行my_sum函数进行计算求和
  测试:

  (2)def wrap_sum(*args):
  def my_sum():
  sum_num=0
  for i inargs:
  if not isinstance(i,(int,float)):
  print 'error type'
  sum_num=sum_num +i
  return sum_num
  return my_sum
  f1=wrap_sum(1,2,3,6)
  print f1()
  f2=wrap_sum(1,2,3,6)
  print f2()
  if f1==f2:
  print "true"
  else:
  print "fluse"
  测试:

  4.匿名函数
  (1)当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
  (2)关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
  (3)匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
  (4) 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
  象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
  def pow1(x):
  return x*x
  print map(pow1,range(1,11))
  print map(lambda x:x*x,range(1,11))
  #匿名函数可以赋值给一个变量,需要变量运行时,变量名()
  #f=lambda:1
  #print f()

  #匿名函数传递必选参数和默认参数
  #f=lambda x,y=2:x**y
  #print f(2,3)
  #print f(2)

  #匿名函数传递可变参数
  #f=lambda *x:map(lambda x:x+x,x)
  #print f(1,2,3,4)

  #匿名函数传递关键字参数
  f= lambda **kwargs:kwargs.items()
  print f(name="fentiao",age=5)

  练习:利用匿名函数和字典重新编辑计算器的代码
  oper=raw_input("oper:")
  d={
  "+": lambda x,y:x+y,
  "-": lambda x,y:x-y,
  "*": lambda x,y:x*y,
  "/": lambda x,y:x/y
  }
  if oper not in d.keys():
  print 'input +,-,*,/'
  print d(3,2)
  测试:




  ##########装饰器###########
  装饰器就是用来装饰函数。
  想要增强原有函数的功能;
  但不希望修改now()函数的定义;
  在代码运行期间动态增加功能的方式;
  定义的装饰器实质是返回函数的高阶函数
  import time
  def timmer(func):
  def dec():
  start_time=time.time()
  func()
  stop_time=time.time()
  return "%s run %f s"%(func.__name__,stop_time-start_time)
  return dec
  @timmer   ###hello1=timmer(hello1),语法糖
  def hello1():
  print 'hello1.....'
  time.sleep(2)
  print hello1()
  测试:
页: [1]
查看完整版本: python5