[PY3]——对iterator的处理(解析式、map、reduce、filter)
引言
对iterator一般可以用for in方法处理,但有时可以借助更高效、也更易读的方式去处理。
例如解析式(包括列表解析式、生成器解析式、集合解析式、字典解析式),
例如map( )、reduce( )函数可以对iterator中的单个对象进行个别处理或迭代处理。
列表解析式
- # 列表解析 [expr for item in iterator]
# 列表解析返回的是列表,内容是表达式执行的结果- # expr=variable
- print([x for x in range(10)])
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- # expr=function
- def inc(x):
- return x+1
- print([inc(x) for x in range(10)])
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- # expr=expression
- print([(x+1)**2 for x in range(10)])
- [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- # if判断 [expr for item in iterator if cond] / [expr for item in iterator if cond1 if cond2]
- print([x for x in range(10) if x%2==0])
- [0, 2, 4, 6, 8]
- print([x for x in range(10) if x%2==0 if x>4])
- [6, 8]
- print([(x,y) for x in range(10) if x%2==0 for y in range(10) if y>=8])
- [(0, 8), (0, 9), (2, 8), (2, 9), (4, 8), (4, 9), (6, 8), (6, 9), (8, 8), (8, 9)]
- # for x in iterator:
for y in iterator:
retrun (x,y)- print([(x,y) for x in range(1,3) for y in range(0,2)])
- [(1, 0), (1, 1), (2, 0), (2, 1)]
- # 列表解析用于对可迭代对象做过滤和转换
- print([(x+1,x+2) for x in range(5)])
- [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
- print([{x:x+1} for x in range(5)])
- [{0: 1}, {1: 2}, {2: 3}, {3: 4}, {4: 5}]
生成器解析
- # 生成器解析式按需计算的,又叫做延迟计算或惰性求值
- def inc(x):
- return "inc {}".format(x)
- # 和列表解析不同的是,生成器解析的返回结果是一个generator,需要当成生成器去使用
- print((inc(x) for x in range(10)))
- <generator object <genexpr> at 0x7f7ef2b0d9e8>
- print([inc(x) for x in range(3)])
- ['inc 0', 'inc 1', 'inc 2']
- g=(inc(x) for x in range(10))
- print(next(g))
- inc 0
- print(next(g))
- inc 1
- # 生成式解析中各种if和for语句都一并适用
- g=(inc(x) for x in range(10) if x%2==0 and x!=4)
- print(next(g))
- inc 0
- print(next(g))
- inc 2
- print(next(g))
- inc 6
集合解析
- # 集合解析的返回结果是集合
- print({x for x in range(10) if x%2!=0})
- {1, 3, 5, 9, 7}
- # 所以结果依旧会满足集合的一切特性
- print({x for x in [2,3,6,2,3,6]})
- {2, 3, 6}
字典解析
- # 字典解析也是使用大括号包围,并且需要两个表达式,一个生成key,一个生成value
- # 两个表达式之间使用冒号分割,返回结果是字典
- print({str(x):x for x in range(5)})
- {'2': 2, '0': 0, '4': 4, '1': 1, '3': 3}
- print(type({str(x):x for x in range(5)}))
- <class 'dict'>
map()
- # map(func, *iterables) --> map object
# map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素- # python3中,直接map的返回值是map对象,如果想输出可以list(map())
- def f(x):
- return x*x
- print(map(f,[1,2,3,4,5]))
- <map object at 0x7ffe619a00f0>
- print(list(map(f,[1,2,3,4,5])))
- [1, 4, 9, 16, 25]
- # func可以是任意复杂的函数
- print(list(map(str,[1,2,3,4,5])))
- ['1', '2', '3', '4', '5']
functools.reduce()
- # reduce(function, sequence[, initial]) -> value
# reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算- # 即reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
# python3中,reduce()已从全局名字空间中移出了,被放置在fucntools模块里- from functools import reduce
- def add(x,y):
- return x+y
- print(reduce(add,range(10)))
- #把一个序列[1,3,5,7,9]变成int(13579)
- def fn(x,y):
- return x*10+y
- print(reduce(fn,[1,3,5,7,9]))
- print(type(reduce(fn,[1,3,5,7,9])))
- <class 'int'>
- # initial存在,可以在前面加上设置的string
- import functools
- resourceConfigFiles=[
- "server.properties.jinja2",
- "net.properties.jinja2",
- ]
- binConfigFiles = ['socket.jinja2']
- jadeConfigFiles = ['ja.cfg.jinja2']
- excludeproperties = functools.reduce(
- lambda x, y: '%s --exclude="%s"' %(x, y.rstrip('.jinja2')),
- resourceConfigFiles + jadeConfigFiles + binConfigFiles,
- "--test")
- print(excludeproperties)
- --test --exclude="server.properties" --exclude="net.properties" --exclude="ja.cfg" --exclude="socket"
一些map()和reduce()的小应用:
- # 把str'13579'——>int(13579)
- def str2int(s):
- def char2num(s):
- return {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}[s]
- def fn(x,y):
- return x*10+y
- return reduce(fn,map(char2num,s))
- print(type(str2int('')))
- <class 'int'>
- print(str2int(''))
- # 输出规范的字符串,首字母皆为大写,其余均为小写
- # ['adam','LISA','barT']——>['Adam','Lisa','Bart']
- def cg_str(lst):
- return list(map(lambda x:x.lower().title(),lst))
- #或者用切片实现
- def cg_str(lst):
- return list(map(lambda x:x[0].upper()+x[1:].lower(),lst))
- print(cg_str(['adam','LISA','barT']))
- ['Adam', 'Lisa', 'Bart']
- # 类似于sum(),实现一个阶乘prod()函数
- def prod(lst):
- return reduce(lambda x,y:x*y,lst)
- print(prod([1,2,3,4,5]))
[PY3]——对iterator的处理(解析式、map、reduce、filter)的更多相关文章
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- map/reduce/filter/lambda
Python内建了map()/reduce()/filter()函数. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的It ...
- python 函数式编程之lambda( ), map( ), reduce( ), filter( )
lambda( ), map( ), reduce( ), filter( ) 1. lambda( )主要用于“行内函数”: f = lambda x : x + 2 #定义函数f(x)=x+2 g ...
- [python基础知识]python内置函数map/reduce/filter
python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...
- Python学习:函数式编程(lambda, map() ,reduce() ,filter())
1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...
- Python map/reduce/filter/sorted函数以及匿名函数
1. map() 函数的功能: map(f, [x1,x2,x3]) = [f(x1), f(x2), f(x3)] def f(x): return x*x a = map(f, [1, 2, 3, ...
- Python-函数式编程-map reduce filter lambda 三元表达式 闭包
lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...
- python map, reduce,filter 使用
参考python built-on function: http://docs.python.org/2.7/library/functions.html?highlight=map%20reduce ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
随机推荐
- 【TypeScript】TypeScript 学习 4——模块
前端数据验证在改善用户体验上有很大作用,在学了之前的知识的时候,我们很可能会写出以下代码: interface StringValidator { isAcceptable(s: string): b ...
- 【WinRT】使用 T4 模板简化字符串的本地化
在 WinRT 中,对控件.甚至图片资源的本地化都是极其方便的,之前我在博客中也介绍过如何本地化应用名称:http://www.cnblogs.com/h82258652/p/4292157.html ...
- Jersey Client传递中文参数
客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...
- [翻译]NUnit---SetUp and SetUpFixture and Suite Attributes(十九)
SetUpAttribute (NUnit 2.0 / 2.5) 本特性用于TestFixture提供一个公共的功能集合,在呼叫每个测试方法之前执行.同时也用在SetUpFixture中,SetUpF ...
- CSS盒子坍塌问题的4种解决方案
一.问题重述 嗯,这个就是坍塌的盒子了.外部盒子本应该包裹住内部的两个浮动盒子,结果却没有. 二.问题出现的原因 3个盒子都只设置了width,而没有规定height,内部两个盒子分别设置了左右浮动. ...
- [ASP.NET]关于DOT NET的IIS配置LocalHost访问和127.0.0.1访问的区别
项目上遇到一个问题跟大家分享下,配置的localhost地址本地无法访问接口,外网却可以访问,查其原因百度资料比较全面的解释 localhost与127.0.0.1的概念和工作原理之不同 要比较两个东 ...
- 如何在 .NET Core 上测试库
设置解决方案. 可使用以下命令实现此目的: mkdir SolutionWithSrcAndTest cd SolutionWithSrcAndTest dotnet new sln dotnet n ...
- 敏捷开发-代码提交流程& 安装gerrit
- CRUSH map 定制实例解析
1.提取已有的CRUSH map ,使用-o参数,ceph将输出一个经过编译的CRUSH map 到您指定的文件ceph osd getcrushmap -o crushmap.txt 2.反编译你的 ...
- docker registry 私有仓库 安装配置、查询、删除
#++++++++++++++++++++++++++++++ #docker-registry 私有仓库 #搜索,下载register镜像 docker search registry docker ...