# ********************** sorted高阶函数 *****************************
在ipython交互式环境中测试:
In [1]: help(sorted)
In [2]: t = (12,34,1,24,37)
In [3]: sorted(t)
Out[3]: [1, 12, 24, 34, 37]
In [4]: def reversed_cmp(x,y):
...: if x>y:
...: return -1
...: elif x < y:
...: return 1
...: else:
...: return 0
...:
In [5]: sorted(t,reversed_cmp)
Out[5]: [37, 34, 24, 12, 1]
In [6]: li = ['xiaowenya','haoningning','wangying']
In [7]: sorted(li)
Out[7]: ['haoningning', 'wangying', 'xiaowenya']
In [8]: li = ['xiaowenya','haoningning','wangying','Haoningning']
In [9]: sorted(li)
Out[9]: ['Haoningning', 'haoningning', 'wangying', 'xiaowenya']
In [11]: 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
....:
In [13]: sorted(li,ignore_case_cmp)
Out[13]: ['haoningning', 'Haoningning', 'wangying', 'xiaowenya']
```
# **************** 函数作为返回值(闭包) *****************************
# 示例1:
def wrap_sum(*args):
def my_sum(): # (1,2,3,4)
sum_num = 0
for i in args:
if notisinstance(i,(int,float)):
print 'Error Type'
sum_num = sum_num + i
return sum_num
return my_sum
# print my_sum(1,2,3,6)
f1 = wrap_sum(1,2,3,6)
print f1
# print f1()
f2 = wrap_sum(1,2,3,6)
print f2
# 示例2:
def count():
fs = []
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3 = count()
print f1()
print f2()
print f3()
# def hello():
# print 'hello....'
# print hello
# hello()
##解决方案:再嵌套一个函数
def count():
fs = []
for i in range(1,4): # i=1
def f(j):
def g():
return j*j
return g
fs.append(f(i)) # fs.append(f(1)) fs=[]
return fs
6f1,f2,f3 = count()
print f1()
print f2()
print f3()
# ********************** 匿名函数 **************************
# [1,2,3...10]
# [1,4,9,....100]
# 匿名函数的优势:
# 1). 匿名函数不需要函数名,可以避免函数名的冲突;
# 2). 匿名函数可以跳过给函数分配栈空间;
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)
#练习:利用匿名函数和字典重新编辑计算器的代码。
from __future__ import division
x = input('num1:')
oper = raw_input('operator:')
y = input('num2:')
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[oper](x,y)