设为首页 收藏本站
查看: 858|回复: 0

[经验分享] Python【map、reduce、filter】内置函数使用说明

[复制链接]

尚未签到

发表于 2015-4-20 08:30:58 | 显示全部楼层 |阅读模式
  介绍下Python 中 map,reduce,和filter 内置函数的方法:
  一:map



map(...)
map(function, sequence[, sequence, ...]) -> list
  说明:
        对sequence中的item依次执行function(item),执行结果输出为list。
  例子:



>>> map(str, range(5))           #对range(5)各项进行str操作
['0', '1', '2', '3', '4']        #返回列表
>>> def add(n):return n+n
...
>>> map(add, range(5))           #对range(5)各项进行add操作
[0, 2, 4, 6, 8]
>>> map(lambda x:x+x,range(5))   #lambda 函数,各项+本身
[0, 2, 4, 6, 8]
>>> map(lambda x:x+1,range(10))  #lambda 函数,各项+1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(add,'zhoujy')            
['zz', 'hh', 'oo', 'uu', 'jj', 'yy']
#想要输入多个序列,需要支持多个参数的函数,注意的是各序列的长度必须一样,否则报错:
>>> def add(x,y):return x+y
...
>>> map(add,'zhoujy','Python')
['zP', 'hy', 'ot', 'uh', 'jo', 'yn']
>>> def add(x,y,z):return x+y+z
...
>>> map(add,'zhoujy','Python','test')     #'test'的长度比其他2个小
Traceback (most recent call last):
File "", line 1, in
TypeError: add() takes exactly 2 arguments (3 given)
>>> map(add,'zhoujy','Python','testop')
['zPt', 'hye', 'ots', 'uht', 'joo', 'ynp']
  二:reduce



reduce(...)
reduce(function, sequence[, initial]) -> value
  说明:
        对sequence中的item顺序迭代调用function,函数必须要有2个参数。要是有第3个参数,则表示初始值,可以继续调用初始值,返回一个值。
  例子:



>>> def add(x,y):return x+y
...
>>> reduce(add,range(10))        #1+2+3+...+9
45
>>> reduce(add,range(11))        #1+2+3+...+10
55
>>> reduce(lambda x,y:x*y,range(1,3),5)           #lambda 函数,5是初始值, 1*2*5
10
>>> reduce(lambda x,y:x*y,range(1,6))             #阶乘,1*2*3*4*5
120
>>> reduce(lambda x,y:x*y,range(1,6),3)           #初始值3,结果再*3
360
>>> reduce(lambda x,y:x+y,[1,2,3,4,5,6])          #1+2+3+4+5+6
21
  三:filter



filter(...)
filter(function or None, sequence) -> list, tuple, or string
  说明:
        对sequence中的item依次执行function(item),将执行结果为True(!=0)的item组成一个List/String/Tuple(取决于sequence的类型)返回,False则退出(0),进行过滤。
  例子:



>>> def div(n):return n%2
...
>>> filter(div,range(5))                    #返回div输出的不等于0的真值
[1, 3]
>>> filter(div,range(10))
[1, 3, 5, 7, 9]
>>> filter(lambda x : x%2,range(10))        #lambda 函数返回奇数,返回列表
[1, 3, 5, 7, 9]
>>> filter(lambda x : not x%2,range(10))
[0, 2, 4, 6, 8]
>>> def fin(n):return n!='z'                #过滤'z' 函数,出现z则返回False
...
>>> filter(fin,'zhoujy')                    #'z'被过滤
'houjy'
>>> filter(lambda x : x !='z','zhoujy')     #labmda返回True值
'houjy'
>>> filter(lambda x : not x=='z','zhoujy')  #返回:字符串
'houjy'
  上面的这些例子中都用到了一个 lambda表达式,下面举个例子,更多信息见这里。



>>> a=lambda x:x+3
>>> a(2)
5
>>> a=lambda x,y:x+y
>>> a(2,3)
5
  四,应用map,reduce,filter

  1):实现5!+4!+3!+2!+1!



#!/usr/bin/env python
#-*- coding:utf-8 -*-
def add_factorial(n):
empty_list=[]           #声明一个空列表,存各个阶乘的结果,方便这些结果相加
for i in map(lambda x:x+1,range(n)):    #用传进来的变量(n)来生成一个列表,用map让列表都+1,eg:range(5) => [1,2,3,4,5]
a=reduce(lambda x,y:x*y,map(lambda x:x+1,range(i)))   #生成阶乘,用map去掉列表中的0
empty_list.append(a)            #把阶乘结果append到空的列表中
return empty_list
if __name__ == '__main__':
import sys
#2选1
#(一)
try:
n = input("Enter a Number(int) : ")
result=add_factorial(n)   #传入变量
print reduce(lambda x,y:x+y,result)      #阶乘结果相加
except (NameError,TypeError):
print "That's not a Number!"
#(二)
#    result = add_factorial(int(sys.argv[1]))   #传入变量
#    print reduce(lambda x,y:x+y,result)      #阶乘结果相加
  结果:



zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 1
1
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 2
3
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 3
9
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 4
33
zhoujy@zhoujy:~/桌面/Python/4$ python factorial.py
Enter a Number(int) : 5
153
zhoujy@zhoujy:~/桌面/Python/4$
  2):将100~200以内的质数挑选出来
  思路:
  质数是指:只有1和它本身两个因数,如2、3、5、7都是质数,即能被1和本身整除,1不是质数。
比如一个数字N,看它是否质数的话,就要看:有没有能整除【2,N】之间的数X(不包含本身),即N%X是否为0,要是没有就为质数。
所以我们要实现的算法是:拿一个数字N,去除以【2,N】之间的数X,来得到质数,即:N/2,N/3,……,N/N-2,N/N-1   ===> N/range(2,N)




#!/usr/bin/env python
#-*- coding:utf-8 -*-
def is_prime(start,stop):
stop  = stop+1     #包含列表右边的值
prime = filter(lambda x : not [x%i for i in range(2,x) if x%i == 0],range(start,stop))   #取出质数,x从range(start,stop) 取的数
print prime
if __name__ == '__main__':
try :
start = input("Enter a start Number :")
except :
start = 2   #开始值默认2
try :
stop  = input("Enter a stop  Number :")
except :
stop  = 0   #停止数,默认0,即不返回任何值
is_prime(start,stop)
  结果:



zhoujy@zhoujy:~/桌面/Python/4$ python prime.py
Enter a start Number :
Enter a stop  Number :10
[2, 3, 5, 7]
zhoujy@zhoujy:~/桌面/Python/4$ python prime.py
Enter a start Number :10
Enter a stop  Number :20
[11, 13, 17, 19]
zhoujy@zhoujy:~/桌面/Python/4$ python prime.py
Enter a start Number :
Enter a stop  Number :
[]
  以上完成!
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58623-1-1.html 上篇帖子: Python小题目 针对快速教程 下篇帖子: python 环境搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表