码迷,mamicode.com
首页 > 编程语言 > 详细

Python基础函数之函数式编程

时间:2016-12-09 19:17:52      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:while循环   app   迭代   形参   技术   ica   电影院   ges   play   

一. 匿名函数

  匿名函数就是不需要显示的指定函数,只要运行过一次后就立马释放内存空间。

  主要表现形式为:

     lambda 形参:具体功能

def calc(n):
    return n**n
print(calc(10))
 
#换成匿名函数
calc = lambda n:n**n
print(calc(10))

  你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

输出
1
25
49
16
64

 

l=[3,2,100,999,213,1111,31121,333]
print(max(l))

dic={k1:10,k2:100,k3:30}

print(max(dic))
print(dic[max(dic,key=lambda k:dic[k])])

 

二. 函数式编程

  1.高阶函数

    满足如下两个特点的任意一个即为高阶函数:

    (1) 函数的传入参数是一个函数名

    (2) 函数的返回值是一个函数名

def foo():
print("from the foo")
def test(func):
return func

res = test(foo)
res()

foo = test(foo)
foo()

  2. 函数式编程:函数式=编程语言定义的函数+数学意义的函数

   通俗来讲,函数式就是用编程语言去实现数学函数。这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数,没有for和while循环,所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。

  3.

技术分享
array=[1,3,4,71,2]

ret=[]
for i in array:
    ret.append(i**2)
print(ret)

#如果我们有一万个列表,那么你只能把上面的逻辑定义成函数
def map_test(array):
    ret=[]
    for i in array:
        ret.append(i**2)
    return ret

print(map_test(array))

#如果我们的需求变了,不是把列表中每个元素都平方,还有加1,减一,那么可以这样
def add_num(x):
    return x+1
def map_test(func,array):
    ret=[]
    for i in array:
        ret.append(func(i))
    return ret

print(map_test(add_num,array))
#可以使用匿名函数
print(map_test(lambda x:x-1,array))


#上面就是map函数的功能,map得到的结果是可迭代对象
print(map(lambda x:x-1,range(5)))

map函数
map函数

  4.

技术分享
from functools import reduce
#合并,得一个合并的结果
array_test=[1,2,3,4,5,6,7]
array=range(100)

#报错啊,res没有指定初始值
def reduce_test(func,array):
    l=list(array)
    for i in l:
        res=func(res,i)
    return res

# print(reduce_test(lambda x,y:x+y,array))

#可以从列表左边弹出第一个值
def reduce_test(func,array):
    l=list(array)
    res=l.pop(0)
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))

#我们应该支持用户自己传入初始值
def reduce_test(func,array,init=None):
    l=list(array)
    if init is None:
        res=l.pop(0)
    else:
        res=init
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))
print(reduce_test(lambda x,y:x+y,array,50))

reduce函数
reduce函数

  5.

技术分享
#电影院聚集了一群看电影bb的傻逼,让我们找出他们
movie_people=[alex,wupeiqi,yuanhao,sb_alex,sb_wupeiqi,sb_yuanhao]

def tell_sb(x):
    return x.startswith(sb)


def filter_test(func,array):
    ret=[]
    for i in array:
        if func(i):
            ret.append(i)
    return ret

print(filter_test(tell_sb,movie_people))


#函数filter,返回可迭代对象
print(filter(lambda x:x.startswith(sb),movie_people))

filter函数
filter函数
技术分享
#当然了,map,filter,reduce,可以处理所有数据类型

name_dic=[
    {name:alex,age:1000},
    {name:wupeiqi,age:10000},
    {name:yuanhao,age:9000},
    {name:linhaifeng,age:18},
]
#利用filter过滤掉千年王八,万年龟,还有一个九千岁
def func(x):
    age_list=[1000,10000,9000]
    return x[age] not in age_list


res=filter(func,name_dic)
for i in res:
    print(i)

res=filter(lambda x:x[age] == 18,name_dic)
for i in res:
    print(i)


#reduce用来计算1到100的和
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),100))
print(reduce(lambda x,y:x+y,range(1,101)))

#用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
name=[alex,wupeiqi,yuanhao]

res=map(lambda x:x+_sb,name)
for i in res:
    print(i)

总结
总结

 

Python基础函数之函数式编程

标签:while循环   app   迭代   形参   技术   ica   电影院   ges   play   

原文地址:http://www.cnblogs.com/xyt521/p/6150566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!