文章目录

  • 1. 迭代器(iterator)
  • 2. map
    • 2.1 map函数介绍
    • 2.2 map实例
  • 3. reduce
    • 3.1 reduce函数介绍
    • 3.2 reduce实例
  • 4. 生成器(generator)
    • 4.1 生成器使用方法简介
    • 4.2 使用生成器的优势
  • 5. 总结

综述:在学习了Python的map,reduce以及迭代器和生成器等工具的使用方法之后,根据自己的理解,将其整理如下。

1. 迭代器(iterator)

  为什么先讲迭代器呢,因为可以说map和reduce的实现都借助了迭代器,如果能够把迭代器弄清楚,那么这两个自然也不难理解。
  首先介绍一个概念,iterable,意为可迭代的。哪些对象是可迭代的呢?在Python中,可以直接作用于for循环的对象,都是可迭代的,即iterable。Python中的可迭代对象有列表(list)元组(tuple)集合(set)字典(dict)字符串(string),以及下边会讲的生成器
  直观理解,迭代就是逐个遍历或访问。而迭代器,则可以帮助我们进行迭代。
  我们通常使用for循环进行迭代,如:

a = ['h', 'a', 'r', 'r', 'y', ' ', 'p', 'o', 't', 't', 'e', 'r']
for i in a:print(i,end='')
# 执行结果如下,上述end控制输出的结尾,默认的话是换行,这里为了显示效果设置为空
harry potter

  这里的列表就是可迭代对象,变量i就相当于一个迭代器,最初指向列表a的第一个元素,循环每进行一次,它便指向列表的下一个元素,借助它,我们可以逐个访问到列表中的元素。
  当然,我们也可以直接使用iter()构造一个迭代器,并使用next()逐个访问(顺序为从第一个到最后一个)迭代器中的元素,如:

a = ['h', 'a', 'r', 'r', 'y', ' ', 'p', 'o', 't', 't', 'e', 'r']
# 构造一个迭代器,用于对列表a进行迭代
i = iter(a)
print(next(i))
print(next(i))
print(next(i))
# 输出结果
h
a
r

  借助for循环,我们可以遍历到可迭代对象中的每个元素,但是,在for循环中,往往对每个元素进行的操作都是一样的。如果是使用迭代器,则可以对顺次对对象中每个元素进行更灵活的处理,每处理完一个,使用next()即可访问到下一个元素,进行与其相应的处理。

2. map

2.1 map函数介绍

  查看手册,map函数的声明如下:

map(function, iterable, ...)

  map函数的第一个参数是一个函数,在该函数中,会使用迭代器,将函数应用于可迭代对象中的每一项(或者说是每一个元素),并生成结果。
  不难看出,map函数的参数列表是可变的,在函数后可以添加多个可迭代对象。当然,前提是第一个参数传入的函数必须能够接收这么多的参数,即有对应处理这些可迭代对象的方法。如果传入了多个可迭代对象,那么,当最短的那个可迭代对象耗尽时(已经访问完其中所有元素),迭代器就会停止。值得注意的是,map返回的是一个对象

2.2 map实例

  叙述冗杂,但举个栗子,也许一下就清晰了。
  传入一个可迭代对象的栗子如下:函数的功能是将字符串变自身重复一次,而map函数则将此函数应用到自身每一个元素。

a = ['h', 'a', 'r', 'r', 'y', ' ', 'p', 'o', 't', 't', 'e', 'r']def duplicate(x):return x + x  # 简单的字符串拼接y = map(duplicate, a);
print(list(y))
# 输出
['hh', 'aa', 'rr', 'rr', 'yy', '  ', 'pp', 'oo', 'tt', 'tt', 'ee', 'rr']

  再来一个多个迭代对象的栗子吧。

a = ['h', 'a', 'r', 'r', 'y']
b = ['p', 'o', 't', 't', 'e', 'r']
def connect(x, y):return x + '-' + y    # 这里也是简单的字符串拼接
y = map(connect, a, b);
for i in y:print(i)
# 输出结果
h-p
a-o
r-t
r-t
y-e

  这里函数可以接收两个参数,因此可以处理map中的两个可迭代对象。从输出结果来看,两个可迭代对象中元素的访问顺序是一致的,而且,由于两个对象长度不同,一个为5,一个为6,当第一个对象元素耗尽时,迭代就停止了。

3. reduce

3.1 reduce函数介绍

  reduce函数的原型如下:

def reduce(function, iterable, initializer=None):it = iter(iterable)if initializer is None:value = next(it)else:value = initializerfor element in it:value = function(value, element)return value

  它的第一个参数也是一个函数,第二个参数是一个可迭代对象,而这里的第三个参数有些特殊。如果此参数没有省略,则reduce中使用的函数的第一个参数,将会使用initializer进行初始化,第二个参数从可迭代对象中选取;如果为空,则默认两个参数逐个从可迭代对象中选取。
  reduce中传入的函数,每执行一次,会根据传入其中的两个迭代元素生成一个结果,用于下一次迭代,这样意味着,每执行一次,可迭代项就会少1。
  map函数中第一个参数是一个相对自由的函数,参数个数与后边可迭代对象保持一直即可,而reduce里的第一个参数,则限定了只能接收两个参数,而且这两个参数都来自与后边的可迭代对象与一个初始值。

3.2 reduce实例

  找个好吃的栗子。(大半夜突然好想吃栗子)
  Harry Potter有五个朋友,每个人有不一样数额的零花钱,他们想买栗子吃,且要找五个人中钱最多的当领队,谁钱最多呢?

# 使用reduce需要从functools模块导入
from functools import reduce
# 下边是每个人的钱数
a = [1, 33, 8, 17, 4]# 函数用于比较大小
def max(x, y):z = x if x > y else yprint(x, end='-')     # 这里的打印便于观察比较过程print(y)return z
y = reduce(max, a)
print(y)
# 执行结果为33
1-33
33-8
33-17
33-4
33

  这里使用reduce达到的目的是,从5人中从前到后,依次两两比较,每次比较得出一个结果,并从后边再取出一个元素与其进行比较,以此类推,结果为找到其中的最大值。
  哈利波特也想吃栗子,且有10块钱,他也参与其中,于是他把自己作为initializer也加入到了比较队列。

from functools import reduce
# 下边是每个人的钱数
a = [1, 33, 8, 17, 4]
# 函数用于比较大小
def max(x, y):z = x if x > y else yprint(x, end='-')    # 这里的打印便于观察比较过程print(y)return z
y = reduce(max, a, 10)
print(y)
# 结果如下
10-1
10-33
33-8
33-17
33-4
33

  不难看出,在给reduce函数添加了initializer之后,他调用的函数的第一个参数就使用initializer进行初始化,第二个参数为可迭代对象的第一个元素。而在前边的栗子中,没有传入initializer参数,则直接顺次使用可迭代对象的前两个元素。
  这样reduce的用法应该就很清晰了。

4. 生成器(generator)

4.1 生成器使用方法简介

  我们可以用生成器来按照我们的规则,生成一个可迭代对象。
  如下,使用生成器生成值为0-10这些自然数每个数的平方的n倍的一个序列:

def gen(n):for i in range(10):yield n * i * i
a = gen(6)
for i in a:print(i, end=' ')
# 0 6 24 54 96 150 216 294 384 486

  注意在函数gen中,我们没有使用return返回,而是使用了yield,它会向外返回生成的结果,但是不会直接退出函数。这样for循环能够继续执行。
  生成器还有一种简化的方法,如下:

gen = (i * i for i in range(10))
for i in gen:print(i, end='')

  但是这样做,似乎有个局限,就是生成器是写死的,不能像函数那样接收一个参数。

4.2 使用生成器的优势

  生成器这种在循环中不断计算出后续元素值的方法,可以为我们节省大量的空间。
  性能测试,如下

import sys
import timet1 = time.time()
List_1 = [i for i in range(9999999)]   # 列表初始化使用[]包裹起来
t2 = time.time()
t3 = time.time()
List_2 = (i for i in range(9999999))    # 注意生成器是使用()
t4 = time.time()
print("List_1使用时间为:", t2 - t1)
print("List_2使用时间为:", t4 - t3)
print("List_1使用空间为:", sys.getsizeof(List_1))
print("List_2使用空间为:", sys.getsizeof(List_2))
# 输出如下
List_1使用时间为: 0.4146158695220947
List_2使用时间为: 5.602836608886719e-05
List_1使用空间为: 81528048
List_2使用空间为: 112

  使用生成器使用时间基本为0,使用空间也要少很多。显然,无论是在时间还是空间上,生成器都有着极大的优势。

5. 总结

  Python为我们提供的map、reduce得带器和生成器这些工具,能够提高编程时的便捷性和灵活性,借助生成器的优势,可以提高我们程序的性能。

See you again.

Python迭代器、生成器、map以及reduce相关推荐

  1. pythonmapiter_018.Python迭代器以及map和reduce函数

    一 迭代器 能被next进行调用,并且不断返回下一个值的对象 特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据 优点:需要数据的时候,一次取一个,可以大大 ...

  2. python lambda map reduce_简单了解python filter、map、reduce的区别

    这篇文章主要介绍了简单了解python filter.map.reduce的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python中有一些 ...

  3. python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的

    一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...

  4. Python函数式编程——map()、reduce()

    提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年A ...

  5. Python里的map、reduce、filter、lambda、列表推导式

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  6. 什么是Python中的map,reduce和filter?

    基本上,lambdas以及map,reduce和filter为python提供了函数式编程能力.让我们看看他们是什么. map: map函数采用 iterable(list,tuple,set)并将函 ...

  7. python 迭代器 生成器_Python迭代器和生成器

    迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...

  8. Python 函数式编程Map、Reduce

    在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算.它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架. ...

  9. 【Python】利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456

    微信公众号 题目来源:[廖雪峰的官方网站-map/reduce] 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functo ...

  10. Python学习笔记——map和reduce实现str2float函数

    利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reducedef str2float(s) ...

最新文章

  1. 一次编译libmono.so的记录
  2. GridView 简单扩展
  3. 一步步编写操作系统 6 启动bochs
  4. c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
  5. 我做的两个游戏的免CD补丁
  6. Day12-流Stream
  7. c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....
  8. eBPF学习记录(一)eBPF介绍
  9. JVM飙高排查脚本-结构分析
  10. win7设置ipsec_Win7系统设置L2TP的方法【图文教程】
  11. Windows server 2003 安装步骤
  12. 【Unity3D日常开发】Unity3D中实现屏幕坐标和3维空间坐标的转化
  13. 家装企业如何开展网络营销?
  14. android xml加密解密,华为配置加解密工具
  15. 抖音xg8404 X-Gorgon算法 IOS苹果协议算法
  16. webpack-dev-server的代理(proxy)
  17. Golang位运算符
  18. dd 0x7ffe0000_当您尝试启动网站时出现“意外的错误0x8ffe2740”错误信息
  19. 七个基本量纲_基本几何量纲定义
  20. [4G5G专题-2]:RRU 射频功率放大器PA与低噪声放大器LNA

热门文章

  1. MySQL数据库软件介绍
  2. Prometheus Operator + blackbox_exporter 监控Web页面
  3. MCU器件选型---主流厂商
  4. python宇晨_第三十届全国青少年科技创新大赛青少年科技创意作品中学组.PDF
  5. VMware Workstation创建虚拟机及安装MySQL数据库
  6. Ubuntu恶意文件分析环境搭建--安装Cuckoo Sandbox记录
  7. mysql添加多个字段删除多个字段
  8. jupyter notebook 前面书写后面内容消失
  9. K8s --HPA容器水平伸缩
  10. VS2019_Windows桌面应用程序_01