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
python(六) 高阶函数



3.系统的高阶

##map

map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回

map(abs,[-1,-10,3,-8])            将列表中的数字化为正数            
[1,10,3,8]


In [1]: map(str,range(1,10))             将列表中的元素化为字符串

Out[1]: ['1', '2', '3', '4', '5', '6', '7', '8', '9']

python(六) 高阶函数




##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, {}, (), [], "    "])

~

python(六) 高阶函数                                                                    


##sorted( )

排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:

In [2]: li = ['Alice',"bob","Code","alex"]

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码表排序

python(六) 高阶函数




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'

python(六) 高阶函数

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



python(六) 高阶函数


• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;

python(六) 高阶函数

2017 网易-下厨房,输入描述:输入一个测试用例的第i行表示第i件料理需要用哪些材料,输出描述:每输出一行一个数字表示完成所有料理所需要多少种不同的材料。

#coding:utf-8
import sys
li = [ ]
print "输入:"
for i in sys.stdin:
    li.extend(i.split())
    s = set(li)
print "输出:"

print len(s)

python(六) 高阶函数


          

图书馆“臭味相投”练习题:

题目描述:

把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",否则,打印出喜欢人的个数(减去自己)

python(六) 高阶函数


字典索引合并练习题:

题目描述:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按key值升序进行输出

输入描述:先输入键值对的个数,然后输入成对的index和value值,以空格隔开

输出描述:输出合并后的健值对(多行)

vim kv.py
print "输入"
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 "输出"

for key,value in d.items():
    print key,value

python(六) 高阶函数