python(六) 高阶函数
1.在python中函数实质上是指向函数体内容的,因此函数名可以赋值给其他变量;函数实质
上是一个变量;
2.变量可以指向函数,函数的参数能接收变量,因此一个函数可以加收另一个函数,又称为
高阶函数;
#!/usr/bin/env python
def oper(a): #a 是形参
return a**2
def add(x,y,fun): ##在add函数中调用oper函数
return fun(x)+fun(y)
print add(1,2,oper)
~
输出:5
3.系统的高阶
##map
map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回
[1,10,3,8]
In [1]: map(str,range(1,10)) 将列表中的元素化为字符串
Out[1]: ['1', '2', '3', '4', '5', '6', '7', '8', '9']
##reduce
reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。
采用reduce实现阶乘运算
In [4]: def mut(a,b):
return a*b...:
In [5]: reduce(mut,range(1,6)) ##1x2x3x4x5
Out[5]: 120
常规方法:
a =1
num = input("num:")for i in range(1,num+1):
a =a*i
print a
##filter
filter() 也接收一个函数和一个序列。和 map() 不同的是filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素。
def isNotNull(x):
return x and x.strip()
print filter(isNotNull, ["", "hello", None, {}, (), [], " "])
~
##sorted( )
排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:
In [3]: li.sort()
In [4]: li
Out[4]: ['Alice', 'Code', 'alex', 'bob']
In [5]: def ignore_u(s1,s2): ##忽略大小写
...: u1 = s1.upper()
...: u2 = s2.upper()
...: return cmp(u1,u2)
...:
In [6]: sorted(li,ignore_u)
Out[6]: ['alex', 'Alice', 'bob', 'Code'] 按照ASC码表排序
In [8]: goods = [
...: ["apple",2.0,100],
...: ["mouse",50.0,50],
...: ["computer",4000.0,20],
...: ]
In [14]: def max_price(x):
return x[1]
....:
In [15]: sorted(goods,key=max_price)[-1][0]
Out[15]: 'computer'
In [16]: sorted(goods,key=lambda x:x[2])
Out [16]: [['computer', 4000.0, 20], ['mouse', 50.0, 50], ['apple', 2.0, 100]]
##lambda匿名函数
•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
In [44]: add = lambda *num:sum(num)
In [45]: add(1,2,3)
Out[45]: 6
In [46]: add(1,2,3,4,5,6)
Out[46]: 21
• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
2017 网易-下厨房,输入描述:输入一个测试用例的第i行表示第i件料理需要用哪些材料,输出描述:每输出一行一个数字表示完成所有料理所需要多少种不同的材料。
#coding:utf-8import sys
li = [ ]
print "输入:"
for i in sys.stdin:
li.extend(i.split())
s = set(li)
print "输出:"
print len(s)
图书馆“臭味相投”练习题:
题目描述:
把n个读者依次编号为1,2,3......N, M本书依次编号为1,2,3....M,输入描述:第一行两个整数N,M,接下来有N行,第i行每一行有一个数,表示有读者i-1最喜欢
输出描述:
每个案例包括N行,每一行一个数,第i行表示有几个潜在朋友,如果没有喜欢的书,则输出“beiju”
#coding:utf-8
n,m = map(int,raw_input().split()) ## n代表读者编号,m代表书籍编号
li = [ ] ##li存储的是第i个读者喜欢的书籍编号
for i in range(n):
li.append(input())
for i in li:
print "Beiju" if li.count(i)==1 else li.count(i)-1 ##如果喜欢i书籍编号只有一个人,打印"Beiju",否则,打印出喜欢人的个数(减去自己)
字典索引合并练习题:
题目描述:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按key值升序进行输出
输入描述:先输入键值对的个数,然后输入成对的index和value值,以空格隔开
输出描述:输出合并后的健值对(多行)
vim kv.pyprint "输入"
count = input( ) ##记录键值对的个数
d ={ }
for i in range(count):
index,value = map(int,raw_input().split()) ##将输入的键值对化为整形
if index in d: ##遍历字典
d[index] += value ##将相同索引进行求和运算
else:
d[index] = value
print "输出"
print key,value