引言

对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)的更多相关文章

  1. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  2. map/reduce/filter/lambda

    Python内建了map()/reduce()/filter()函数. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的It ...

  3. python 函数式编程之lambda( ), map( ), reduce( ), filter( )

    lambda( ), map( ), reduce( ), filter( ) 1. lambda( )主要用于“行内函数”: f = lambda x : x + 2 #定义函数f(x)=x+2 g ...

  4. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

  5. Python学习:函数式编程(lambda, map() ,reduce() ,filter())

    1. lambda: Python 支持用lambda对简单的功能定义“行内函数” 2.map() : 3.reduce() : 4.filter() : map() ,reduce() , filt ...

  6. 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, ...

  7. Python-函数式编程-map reduce filter lambda 三元表达式 闭包

    lambda 匿名函数,核心是作为算子,处理逻辑只有一行但具有函数的特性,核心用于函数式编程中 三元运算符 其实本质上是if分支的简化版,满足条件返回 if 前面的值,不满足条件返回 else后面的值 ...

  8. python map, reduce,filter 使用

    参考python built-on function: http://docs.python.org/2.7/library/functions.html?highlight=map%20reduce ...

  9. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  10. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

随机推荐

  1. Android-自定义ListView下拉刷新与上拉加载

    效果图: 第一步:编写需要在ListView中增加头加载的布局文件,与底部加载的布局文件: 头布局文件: <?xml version="1.0" encoding=" ...

  2. SMINT:单页网站的免費jQuery插件

    最近为了做一个静态网页版的数据报告,不希望花很多时间去设计网页,或者花时间去调整布局,于是找到了一个名为Smint的免費jQuery插件.几乎不需要写什么代码就可以完成一个一页式网站.这非常适合用来制 ...

  3. Spring Boot 2 实践记录之 MyBatis 集成的启动时警告信息问题

    按笔者 Spring Boot 2 实践记录之 MySQL + MyBatis 配置 中的方式,如果想正确运行,需要在 Mapper 类上添加 @Mapper 注解. 但是加入此注解之后,启动时会出现 ...

  4. c++ 日志输出库 spdlog 简介(4)- 多线程txt输出日志

    在上一节的代码中加入了向文本文件中写入日志的代码: UINT CMFCApplication1Dlg::Thread1(LPVOID pParam) { try{ size_t q_size = ; ...

  5. vs2017 xamarin新建单独UWP类库提示不兼容

    One or more projects are incompatible with UAP,Version=v10.0 (win10-arm). One or more projects are i ...

  6. SL 的 DATAGRID中如何加入计算列?

    例如,我的数据库中实体表对应到EF中的实体类是 class { public int  F1; public int F2; } 我在服务端做domainservice 我在SL端使用wcf ria, ...

  7. 一步一步学习Swift之(二):好玩的工具playground与swfit基础语法

    playground好于在于能一边写代码一边看到输出的常量变量的值.不需要运行模拟器. 我们来试一下该工具的用法. 打开xcode6开发工具,选择Get started with a playgrou ...

  8. day65 Django模板语言

      常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含 ...

  9. Manacher算法学习笔记

    前言 Manacher(也叫马拉车)是一种用于在线性时间内找出字符串中最长回文子串的算法 算法 一般的查找回文串的算法是枚举中心,然后往两侧拓展,看最多拓展出多远.最坏情况下$O(n^2)$ 然而Ma ...

  10. ubuntu16.04配置java环境(重启后不会失效)

    ubuntu16.04配置java环境(重启后不会失效) 1.jdk的安装包(.tar.gz)拷贝到/opt目录下 mv jdk-8u144-linux-x64.tar.gz /opt 2.解压文件 ...