关于python map迭代的那些事

简介: 真实情况:昨晚写到这样的代码

真实情况:

昨晚写到这样的代码

def chartoNum(s):
    dict = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
    return dict[s]
def fn(x, y):
    return x * 10 + y
r = map(chartoNum, "23443")
print(list(r))
r1 = reduce(fn, r)
print(r1)

很不幸的是,报错了 -

TypeError: reduce() of empty sequence with no initial value@(怒)可是我明明给你reduce值了 --

我将目标锁定在r身上,于是将r替换成map(....)

实测正常。那为什么会这样呢?

首先我们得知道python的迭代器

[button href="https://www.w3schools.com/python/python_iterators.asp"]itertors[/button]

从中你会发现:创建一个迭代器和停止自己看吧,这里只讲一点

列表,元组,字典和集合都是可迭代的对象。它们是可迭代的 容器,您可以从中获得迭代器。

(区别可迭代和迭代器)

所有这些对象都有一个iter(用于获取迭代器的方法,然后经过next去打印。

并且我们一直使用for去遍历一些列表元组字典,实际上就是该for循环创建了一个迭代器对象,并为每个循环执行next()方法。

所以我们才能去遍历得到值

解释器需要迭代对象x时,会自动调用iter(x)

那为什么要介绍迭代器?

我们再来看下reduce的语法

reduce(function, iterable[, initializer])

iterable就是可迭代的对象

对于map在Python 3.x 返回迭代器

所以我们一般需要list,将其返回列表,bug就出现在这里。

!!!!!!

list后迭代器,第一次有值, 第二次就没了

list(r) #有值列表

list(r) #空列表

以至于我们再去调用r的时候为空,但是print r是有值的

这是为什么呢???

list的作用是返回列表,也就是可迭代的对象

list(r) 后再调用next(r)会发现报错StopIteration[collapse title=""]

迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

[/collapse],这是因为next不到值了,这就说明了list map对象后指针已经到了最后一个,所以再去使用r是空。而print(r)type(r) 这样内置的是重新审查了一遍整体r,因此有值。

而list 字符串等其它可迭代对象,却没有这样的问题,这是因为

这些部分将创建一个新的可迭代对象,然后next对于这些新的

而map本身就是迭代器!!!!

list后返回的是本身,因此next自然是末尾!

于是乎,我们似乎明白了些什么(´இ皿இ`)

目录
相关文章
WK
|
8天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
63 36
|
12天前
|
Python
【10月更文挑战第18天】「Mac上学Python 29」基础篇10 - 循环结构与迭代控制
在Python中,循环结构是控制程序执行的重要工具。通过学习本篇内容,您将掌握如何使用for循环和while循环来高效地处理重复任务,并了解break、continue和else的使用方式。同时,我们还会探索嵌套循环和典型应用场景中的实际应用。
31 2
|
5月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
33 3
|
2月前
|
Python
python之迭代
python之迭代
|
22天前
|
存储 大数据 数据处理
理解Python中的生成器:高效迭代的秘密
【10月更文挑战第8天】理解Python中的生成器:高效迭代的秘密
28 0
|
2月前
|
Python
Python中的zip:高效处理并行迭代的利器
Python中的zip:高效处理并行迭代的利器
21 0
|
2月前
|
JavaScript 前端开发
JavaScript 中 五种迭代数组的方法 every some map filter forEach
本文介绍了JavaScript中五种常用数组迭代方法:every、some、filter、map和forEach,并通过示例代码展示了它们的基本用法和区别。
|
3月前
|
JavaScript 前端开发 索引
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
这段代码和说明介绍了JavaScript中数组的一些常用方法。函数接收三个参数:`item`(数组项的值)、`index`(项的位置,可选)和`array`(数组本身,可选)。示例展示了如何使用`filter()`过滤非空项、`forEach()`遍历数组、`map()`处理并返回新数组、`every()`检查所有元素是否满足条件、`some()`检查是否存在满足条件的元素、`find()`获取首个符合条件的元素值以及`findIndex()`获取其索引位置。这些方法都不会修改原数组。
JS中常用的数组迭代方法(filter,forEach,map,every,some,find,findIndex)
|
3月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
3月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。