函数本身也可以赋值给变量,即:变量可以指向函数。
函数名其实就是指向函数的变量!
1.高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另
一个函数作为参数,这种函数就称之为高阶函数。
2.map函数
map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依
次作用到序列的每个元素,并把结果作为新的 list 返回。
map() 作为高阶函数,把运算规则抽象了.
map
print map(abs, [-1, 10, 20, 30, -100])
def fun(x):
return x**2+100
print map(fun, range(5))
3.reduce函数
reduce 把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接
收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。
def add(x, y):
return x + y
range(5) - [0, 1, 2, 3, 4] - add(add(add(add(0,1),2),3),4) - 10
print reduce(add, range(5))
4.filter函数
filter() 也接收一个函数和一个序列。和 map() 不同的时,
filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素。
filter,第一个参数function,返回值必须是Bool值;
print filter(lambda x: x % 2 == 0, range(1,20))
def isPrime(n):
for i in range(2, n):
if n % i == 0:
return False
else:
return True
li = range(200,301)
print filter(isPrime, li)
4.sorted函数
排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。通常规定如下:
x < y, return -1
x == y, return 0
x > y, return 1
sorted
li.sort()
由小到大排序;
print sorted([91, 2, 23])
由大到小排序
print sorted([91, 2, 23], reverse=True)
忽略大小写的排序;
users = ['adam', 'LISA', 'barT', 'Adam']
def ignore_cmp(s1, s2):
s1 = s1.upper()
s2 = s2.upper()
return cmp(s1, s2)
print sorted(users, cmp=ignore_cmp)
5.匿名函数
•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
1. 匿名函数的关键字为 lambda, 冒号前面是形式参数, 冒号后面是返回值;
2. 匿名函数的形式参数可以是: 必选, 默认, 可变, 关键字参数.
f = lambda x, y=2, *args, **kwargs : (x*y,args, kwargs)
print f(2,3,4,5,6,7, a=1, b=2, c=3)
指定key值进行排序
goods = [
['001', u'笔记本电脑', 4000, 20],
['002', u'苹果', 2, 100],
['003', u'小米手机', 2999, 10]
]
goods是一个可迭代对象;iterable;
lambda a: a[3]是一个匿名函数;
a = ['001', u'笔记本电脑', 4000, 20] ---》 20
a = ['002', u'苹果', 2, 100] --> 100
a = ['003', u'小米手机', 2999, 10] --> 10
a = sorted(goods, key=lambda a: a[3])
for i in a:
print i
6.装饰器
•装饰器就是用来装饰函数。
• 想要增强原有函数的功能;
• 但不希望修改now()函数的定义;
• 在代码运行期间动态增加功能的方式;